diff --git a/internal/resolver/resolver.go b/internal/resolver/resolver.go index 9c65d2965..5bd697e55 100644 --- a/internal/resolver/resolver.go +++ b/internal/resolver/resolver.go @@ -18,6 +18,7 @@ package resolver import ( "bytes" "encoding/json" + "fmt" "os" "path/filepath" "strings" @@ -57,7 +58,15 @@ func (r *Resolver) Resolve(reqs []*chart.Dependency, repoNames map[string]string locked := make([]*chart.Dependency, len(reqs)) missing := []string{} for i, d := range reqs { - constraint, err := semver.NewConstraint(d.Version) + v := d.Version + if len(strings.TrimSpace(v)) == 0 { + if !strings.HasPrefix(d.Repository, "file://") { + return nil, fmt.Errorf("dependency %q must has a version", d.Name) + } + v = "*" + } + + constraint, err := semver.NewConstraint(v) if err != nil { return nil, errors.Wrapf(err, "dependency %q has an invalid version/constraint format", d.Name) } diff --git a/internal/resolver/resolver_test.go b/internal/resolver/resolver_test.go index bc84ba952..91614110e 100644 --- a/internal/resolver/resolver_test.go +++ b/internal/resolver/resolver_test.go @@ -135,6 +135,29 @@ func TestResolve(t *testing.T) { }, err: true, }, + { + name: "optional dependencise version", + req: []*chart.Dependency{ + {Name: "base", Repository: "file://base", Version: ""}, + }, + expect: &chart.Lock{ + Dependencies: []*chart.Dependency{ + {Name: "base", Repository: "file://base", Version: "0.1.0"}, + }, + }, + }, + { + name: "required dependency version", + req: []*chart.Dependency{ + {Name: "alpine", Repository: "http://example.com", Version: ""}, + }, + expect: &chart.Lock{ + Dependencies: []*chart.Dependency{ + {Name: "alpine", Repository: "http://example.com", Version: "0.2.0"}, + }, + }, + err: true, + }, } repoNames := map[string]string{"alpine": "kubernetes-charts", "redis": "kubernetes-charts"}