From af58b8eff9dbfe75c164957b45dfe949823671cd Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Fri, 16 Dec 2016 17:04:33 -0700 Subject: [PATCH] feat(1480): add --version flag to package command This adds a `helm package --version=SEMVER` param that allows users to set a version during a package operation. Closes #1480 Closes #1699 --- cmd/helm/package.go | 25 +++++++++++++++++++++++++ cmd/helm/package_test.go | 22 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/cmd/helm/package.go b/cmd/helm/package.go index 3d29b6e54..c85fd3d40 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -25,11 +25,13 @@ import ( "path/filepath" "syscall" + "github.com/Masterminds/semver" "github.com/spf13/cobra" "golang.org/x/crypto/ssh/terminal" "k8s.io/helm/cmd/helm/helmpath" "k8s.io/helm/pkg/chartutil" + "k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/provenance" "k8s.io/helm/pkg/repo" ) @@ -51,6 +53,7 @@ type packageCmd struct { path string key string keyring string + version string out io.Writer home helmpath.Home } @@ -92,6 +95,7 @@ func newPackageCmd(out io.Writer) *cobra.Command { f.BoolVar(&pkg.sign, "sign", false, "use a PGP private key to sign this package") f.StringVar(&pkg.key, "key", "", "name of the key to use when signing. Used if --sign is true") f.StringVar(&pkg.keyring, "keyring", defaultKeyring(), "location of a public keyring") + f.StringVar(&pkg.version, "version", "", "set the version on the chart to this semver version") return cmd } @@ -107,6 +111,16 @@ func (p *packageCmd) run(cmd *cobra.Command, args []string) error { return err } + // If version is set, modify the version. + if len(p.version) != 0 { + if err := setVersion(ch, p.version); err != nil { + return err + } + if flagDebug { + fmt.Fprintf(p.out, "Setting version to %s", p.version) + } + } + if filepath.Base(path) != ch.Metadata.Name { return fmt.Errorf("directory name (%s) and Chart.yaml name (%s) must match", filepath.Base(path), ch.Metadata.Name) } @@ -139,6 +153,17 @@ func (p *packageCmd) run(cmd *cobra.Command, args []string) error { return err } +func setVersion(ch *chart.Chart, ver string) error { + // Verify that version is a SemVer, and error out if it is not. + if _, err := semver.NewVersion(ver); err != nil { + return err + } + + // Set the version field on the chart. + ch.Metadata.Version = ver + return nil +} + func (p *packageCmd) clearsign(filename string) error { // Load keyring signer, err := provenance.NewFromKeyring(p.keyring, p.key) diff --git a/cmd/helm/package_test.go b/cmd/helm/package_test.go index c21cdb22c..1655bf23c 100644 --- a/cmd/helm/package_test.go +++ b/cmd/helm/package_test.go @@ -26,8 +26,30 @@ import ( "github.com/spf13/cobra" "k8s.io/helm/cmd/helm/helmpath" + "k8s.io/helm/pkg/proto/hapi/chart" ) +func TestSetVersion(t *testing.T) { + c := &chart.Chart{ + Metadata: &chart.Metadata{ + Name: "prow", + Version: "0.0.1", + }, + } + expect := "1.2.3-beta.5" + if err := setVersion(c, expect); err != nil { + t.Fatal(err) + } + + if c.Metadata.Version != expect { + t.Errorf("Expected %q, got %q", expect, c.Metadata.Version) + } + + if err := setVersion(c, "monkeyface"); err == nil { + t.Error("Expected bogus version to return an error.") + } +} + func TestPackage(t *testing.T) { tests := []struct {