diff --git a/cmd/helm/dependency.go b/cmd/helm/dependency.go index fe1cde11467e7a20b12ab44c946bbea1c8c9ee29..b5b22f6ce0f41f4a7f4516d008165d2f3f63e16c 100644 --- a/cmd/helm/dependency.go +++ b/cmd/helm/dependency.go @@ -21,6 +21,7 @@ import ( "os" "path/filepath" + "github.com/Masterminds/semver" "github.com/gosuri/uitable" "github.com/spf13/cobra" @@ -140,21 +141,41 @@ func (l *dependencyListCmd) run() error { } func (l *dependencyListCmd) dependencyStatus(dep *chartutil.Dependency) string { - filename := fmt.Sprintf("%s-%s.tgz", dep.Name, dep.Version) - archive := filepath.Join(l.chartpath, "charts", filename) - if _, err := os.Stat(archive); err == nil { - c, err := chartutil.Load(archive) - if err != nil { - return "corrupt" - } - if c.Metadata.Name != dep.Name { - return "misnamed" - } + filename := fmt.Sprintf("%s-%s.tgz", dep.Name, "*") + archives, err := filepath.Glob(filepath.Join(l.chartpath, "charts", filename)) + if err != nil { + return "bad pattern" + } else if len(archives) > 1 { + return "too many matches" + } else if len(archives) == 1 { + archive := archives[0] + if _, err := os.Stat(archive); err == nil { + c, err := chartutil.Load(archive) + if err != nil { + return "corrupt" + } + if c.Metadata.Name != dep.Name { + return "misnamed" + } - if c.Metadata.Version != dep.Version { - return "wrong version" + if c.Metadata.Version != dep.Version { + constraint, err := semver.NewConstraint(dep.Version) + if err != nil { + return "invalid version" + } + + v, err := semver.NewVersion(c.Metadata.Version) + if err != nil { + return "invalid version" + } + + if constraint.Check(v) { + return "ok" + } + return "wrong version" + } + return "ok" } - return "ok" } folder := filepath.Join(l.chartpath, "charts", dep.Name) @@ -174,6 +195,19 @@ func (l *dependencyListCmd) dependencyStatus(dep *chartutil.Dependency) string { } if c.Metadata.Version != dep.Version { + constraint, err := semver.NewConstraint(dep.Version) + if err != nil { + return "invalid version" + } + + v, err := semver.NewVersion(c.Metadata.Version) + if err != nil { + return "invalid version" + } + + if constraint.Check(v) { + return "unpacked" + } return "wrong version" } diff --git a/cmd/helm/dependency_test.go b/cmd/helm/dependency_test.go index 749d490cb905d1ea3f9e438f1fa88bc8d423c37c..887764742437d137336baada39a36bcbcbf12f9d 100644 --- a/cmd/helm/dependency_test.go +++ b/cmd/helm/dependency_test.go @@ -40,9 +40,12 @@ func TestDependencyListCmd(t *testing.T) { expect: "WARNING: no requirements at ", }, { - name: "Requirements in chart dir", - args: []string{"testdata/testcharts/reqtest"}, - expect: "NAME \tVERSION\tREPOSITORY \tSTATUS \nreqsubchart \t0.1.0 \thttps://example.com/charts\tunpacked\nreqsubchart2\t0.2.0 \thttps://example.com/charts\tunpacked\n", + name: "Requirements in chart dir", + args: []string{"testdata/testcharts/reqtest"}, + expect: "NAME \tVERSION\tREPOSITORY \tSTATUS \n" + + "reqsubchart \t0.1.0 \thttps://example.com/charts\tunpacked\n" + + "reqsubchart2\t0.2.0 \thttps://example.com/charts\tunpacked\n" + + "reqsubchart3\t>=0.1.0\thttps://example.com/charts\tok \n\n", }, { name: "Requirements in chart archive", diff --git a/cmd/helm/testdata/testcharts/reqtest/charts/reqsubchart3-0.2.0.tgz b/cmd/helm/testdata/testcharts/reqtest/charts/reqsubchart3-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..84b0fb65e6b05967ef186f30248384033a7d0a5f Binary files /dev/null and b/cmd/helm/testdata/testcharts/reqtest/charts/reqsubchart3-0.2.0.tgz differ diff --git a/cmd/helm/testdata/testcharts/reqtest/requirements.yaml b/cmd/helm/testdata/testcharts/reqtest/requirements.yaml index 4b0b8c2db8193243552d441b124917315fedb284..1ddedc7427ceb2a019789a878214faa1f4b31b2c 100644 --- a/cmd/helm/testdata/testcharts/reqtest/requirements.yaml +++ b/cmd/helm/testdata/testcharts/reqtest/requirements.yaml @@ -5,3 +5,6 @@ dependencies: - name: reqsubchart2 version: 0.2.0 repository: "https://example.com/charts" + - name: reqsubchart3 + version: ">=0.1.0" + repository: "https://example.com/charts"