Skip to content
This repository was archived by the owner on Dec 22, 2021. It is now read-only.

Commit f85efe2

Browse files
committed
added pctl version flag
1 parent 951af3a commit f85efe2

14 files changed

+472
-4
lines changed

.goreleaser.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ builds:
1313
- CGO_ENABLED=0
1414
ldflags:
1515
# gitTag set from a generated file (see ./tag_release.sh)
16-
- -s -w
16+
- -s -w -X github.com/weaveworks/pctl/pkg/version.buildDate={{.Date}} -X github.com/weaveworks/pctl/pkg/version.gitCommit={{.ShortCommit}}
1717
goos:
1818
- linux
1919
- darwin

Makefile

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
version_pkg := github.com/weaveworks/pctl/pkg/version
2+
build_date := $(shell date +%Y-%m-%dT%H:%M:%SZ)
3+
git_commit = $(shell git rev-parse --short HEAD)
4+
15
##@ Test
26

37
test: lint unit integration docs ## Lint, run all tests and update the docs
@@ -18,7 +22,7 @@ lint: ## Run the linter
1822
golangci-lint run --exclude-use-default=false --timeout=5m0s
1923

2024
build: ## Build the pctl binary to ./pctl
21-
go build -o pctl ./cmd/pctl
25+
CGO_ENABLED=0 go build -ldflags "-X $(version_pkg).gitCommit=$(git_commit) -X $(version_pkg).buildDate=$(build_date)" -o pctl ./cmd/pctl
2226

2327
local-env: submodule ## Create local environment
2428
cd dependencies/profiles && make local-env

cmd/pctl/main.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/urfave/cli/v2"
99
"github.com/weaveworks/pctl/pkg/client"
10+
"github.com/weaveworks/pctl/pkg/version"
1011
profilesv1 "github.com/weaveworks/profiles/api/v1alpha1"
1112
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1213
"k8s.io/client-go/tools/clientcmd"
@@ -20,8 +21,9 @@ const (
2021

2122
func main() {
2223
app := &cli.App{
23-
Usage: "A cli tool for interacting with profiles",
24-
Flags: globalFlags(),
24+
Version: version.GetVersion(),
25+
Usage: "A cli tool for interacting with profiles",
26+
Flags: globalFlags(),
2527
Commands: []*cli.Command{
2628
searchCmd(),
2729
showCmd(),

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module github.com/weaveworks/pctl
33
go 1.16
44

55
require (
6+
github.com/blang/semver v3.5.1+incompatible
7+
github.com/dave/jennifer v1.4.1
68
github.com/fluxcd/helm-controller/api v0.11.1
79
github.com/fluxcd/kustomize-controller/api v0.13.2
810
github.com/fluxcd/source-controller/api v0.15.3
@@ -13,6 +15,7 @@ require (
1315
github.com/onsi/ginkgo v1.16.4
1416
github.com/onsi/gomega v1.14.0
1517
github.com/otiai10/copy v1.6.0
18+
github.com/pkg/errors v0.9.1
1619
github.com/urfave/cli/v2 v2.3.0
1720
github.com/weaveworks/profiles v0.0.13
1821
gopkg.in/yaml.v2 v2.4.0

go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
134134
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
135135
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
136136
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
137+
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
137138
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
138139
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
139140
github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=
@@ -199,6 +200,8 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do
199200
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
200201
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
201202
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
203+
github.com/dave/jennifer v1.4.1 h1:XyqG6cn5RQsTj3qlWQTKlRGAyrTcsk1kUmWdZBzRjDw=
204+
github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA=
202205
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
203206
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
204207
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package main
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
)
9+
10+
func TestProfile(t *testing.T) {
11+
RegisterFailHandler(Fail)
12+
RunSpecs(t, "Generate Suite")
13+
}
+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// +build release
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"log"
8+
"os"
9+
"strconv"
10+
"strings"
11+
12+
"github.com/blang/semver"
13+
"github.com/dave/jennifer/jen"
14+
15+
"github.com/weaveworks/pctl/pkg/version"
16+
)
17+
18+
const versionFilename = "pkg/version/release.go"
19+
const defaultPreReleaseID = "dev"
20+
const defaultReleaseCandidate = "rc.0"
21+
22+
func main() {
23+
if len(os.Args) < 2 {
24+
log.Fatal("missing argument")
25+
}
26+
27+
command := os.Args[1]
28+
29+
var newVersion, newPreRelease string
30+
switch command {
31+
case "release":
32+
newVersion, newPreRelease = prepareRelease()
33+
case "release-candidate":
34+
newVersion, newPreRelease = prepareReleaseCandidate()
35+
case "development":
36+
newVersion, newPreRelease = nextDevelopmentIteration()
37+
case "full-version":
38+
fmt.Println(version.GetVersion())
39+
return
40+
case "print-version":
41+
// Print simplified version X.Y.Z
42+
fmt.Println(version.Version)
43+
return
44+
case "print-major-minor-version":
45+
fmt.Println(printMajorMinor())
46+
return
47+
default:
48+
log.Fatalf("unknown option %q. Expected 'release', 'release-candidate', 'development', 'print-version' or 'print-major-minor-version'", command)
49+
}
50+
51+
if err := writeVersionToFile(newVersion, newPreRelease, versionFilename); err != nil {
52+
log.Fatalf("unable to write file: %s", err.Error())
53+
}
54+
55+
version.Version = newVersion
56+
version.PreReleaseID = newPreRelease
57+
fmt.Println(version.GetVersion())
58+
}
59+
60+
func prepareRelease() (string, string) {
61+
return version.Version, ""
62+
}
63+
64+
func prepareReleaseCandidate() (string, string) {
65+
if strings.HasPrefix(version.PreReleaseID, "rc.") {
66+
// Next RC
67+
rcNumber, err := strconv.Atoi(strings.TrimPrefix(version.PreReleaseID, "rc."))
68+
if err != nil {
69+
log.Fatalf("cannot parse rc version from pre-release id %s", version.PreReleaseID)
70+
}
71+
newRC := rcNumber + 1
72+
return version.Version, fmt.Sprintf("rc.%d", newRC)
73+
}
74+
return version.Version, defaultReleaseCandidate
75+
}
76+
77+
func printMajorMinor() string {
78+
ver := semver.MustParse(version.Version)
79+
return fmt.Sprintf("%v.%v", ver.Major, ver.Minor)
80+
}
81+
82+
func nextDevelopmentIteration() (string, string) {
83+
ver := semver.MustParse(version.Version)
84+
ver.Minor++
85+
return ver.String(), defaultPreReleaseID
86+
}
87+
88+
func writeVersionToFile(version, preReleaseID, fileName string) error {
89+
f := jen.NewFilePath("pkg/version")
90+
91+
f.Comment("This file was generated by release_generate.go; DO NOT EDIT.")
92+
f.Line()
93+
94+
f.Comment("Version is the version number in semver format X.Y.Z")
95+
f.Var().Id("Version").Op("=").Lit(version)
96+
97+
f.Comment("PreReleaseID can be empty for releases, \"rc.X\" for release candidates and \"dev\" for snapshots")
98+
f.Var().Id("PreReleaseID").Op("=").Lit(preReleaseID)
99+
100+
f.Comment("gitCommit is the short commit hash. It will be set by the linker.")
101+
f.Var().Id("gitCommit").Op("=").Lit("")
102+
103+
f.Comment("buildDate is the time of the build with format yyyy-mm-ddThh:mm:ssZ. It will be set by the linker.")
104+
f.Var().Id("buildDate").Op("=").Lit("")
105+
106+
if err := f.Save(fileName); err != nil {
107+
return err
108+
}
109+
return nil
110+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
// +build release
2+
3+
package main
4+
5+
import (
6+
. "github.com/onsi/ginkgo"
7+
. "github.com/onsi/gomega"
8+
9+
"github.com/weaveworks/pctl/pkg/version"
10+
)
11+
12+
var _ = Describe("release tests", func() {
13+
BeforeEach(func() {
14+
version.Version = "0.5.0"
15+
version.PreReleaseID = "dev"
16+
})
17+
18+
It("produces a release without a pre-release id", func() {
19+
v, p := prepareRelease()
20+
21+
Expect(v).To(Equal("0.5.0"))
22+
Expect(p).To(BeEmpty())
23+
})
24+
25+
It("produces the correct release for 2 digit minor versions", func() {
26+
version.Version = "0.25.0"
27+
v, p := prepareRelease()
28+
29+
Expect(v).To(Equal("0.25.0"))
30+
Expect(p).To(BeEmpty())
31+
})
32+
33+
It("increases minor version for the next development iteration from a release", func() {
34+
version.PreReleaseID = ""
35+
36+
v, p := nextDevelopmentIteration()
37+
38+
Expect(v).To(Equal("0.6.0"))
39+
Expect(p).To(Equal("dev"))
40+
})
41+
42+
It("increases minor version for the next development iteration from an rc", func() {
43+
version.PreReleaseID = "rc.1"
44+
45+
v, p := nextDevelopmentIteration()
46+
47+
Expect(v).To(Equal("0.6.0"))
48+
Expect(p).To(Equal("dev"))
49+
})
50+
51+
It("produces the correct default release candidate from dev", func() {
52+
version.PreReleaseID = "dev"
53+
54+
v, p := prepareReleaseCandidate()
55+
56+
Expect(v).To(Equal("0.5.0"))
57+
Expect(p).To(Equal("rc.0"))
58+
})
59+
It("produces the correct default release candidate from release", func() {
60+
version.PreReleaseID = ""
61+
62+
v, p := prepareReleaseCandidate()
63+
64+
Expect(v).To(Equal("0.5.0"))
65+
Expect(p).To(Equal("rc.0"))
66+
})
67+
68+
It("produces next release candidate", func() {
69+
version.PreReleaseID = "rc.1"
70+
71+
v, p := prepareReleaseCandidate()
72+
73+
Expect(v).To(Equal("0.5.0"))
74+
Expect(p).To(Equal("rc.2"))
75+
})
76+
77+
})

pkg/version/parse.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package version
2+
3+
import (
4+
"strings"
5+
6+
"github.com/blang/semver"
7+
"github.com/pkg/errors"
8+
)
9+
10+
// ParsePctlVersion parses the an pctl version as semver while ignoring
11+
// extra build metadata
12+
func ParsePctlVersion(raw string) (semver.Version, error) {
13+
// We don't want any extra info from the version
14+
semverVersion := strings.Split(raw, ExtraSep)[0]
15+
v, err := semver.ParseTolerant(semverVersion)
16+
if err != nil {
17+
return v, errors.Wrapf(err, "unexpected error parsing pctl version %q", raw)
18+
}
19+
return v, nil
20+
}

pkg/version/parse_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package version
2+
3+
import (
4+
"github.com/blang/semver"
5+
. "github.com/onsi/ginkgo"
6+
. "github.com/onsi/gomega"
7+
)
8+
9+
var _ = Describe("ParsePctlVersion", func() {
10+
It("handles versions with metadata", func() {
11+
gitVersion := "0.27.0-dev+001eeced.2020-08-27T03:03:31Z"
12+
13+
v, err := ParsePctlVersion(gitVersion)
14+
15+
Expect(err).NotTo(HaveOccurred())
16+
Expect(v).To(Equal(
17+
semver.Version{
18+
Major: 0,
19+
Minor: 27,
20+
Patch: 0,
21+
},
22+
))
23+
})
24+
It("handles versions without metadata", func() {
25+
gitVersion := "0.27.0"
26+
27+
v, err := ParsePctlVersion(gitVersion)
28+
29+
Expect(err).NotTo(HaveOccurred())
30+
Expect(v).To(Equal(
31+
semver.Version{
32+
Major: 0,
33+
Minor: 27,
34+
Patch: 0,
35+
},
36+
))
37+
})
38+
})

pkg/version/release.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package version
2+
3+
// This file was generated by release_generate.go; DO NOT EDIT.
4+
5+
// Version is the version number in semver format X.Y.Z
6+
var Version = "0.57.0"
7+
8+
// PreReleaseID can be empty for releases, "rc.X" for release candidates and "dev" for snapshots
9+
var PreReleaseID = "dev"
10+
11+
// gitCommit is the short commit hash. It will be set by the linker.
12+
var gitCommit = ""
13+
14+
// buildDate is the time of the build with format yyyy-mm-ddThh:mm:ssZ. It will be set by the linker.
15+
var buildDate = ""

0 commit comments

Comments
 (0)