@@ -20,22 +20,22 @@ import (
20
20
"fmt"
21
21
"log"
22
22
"os"
23
+ "os/exec"
23
24
"path/filepath"
24
- "runtime"
25
25
"strconv"
26
26
"strings"
27
27
28
+ "github.com/Masterminds/semver"
28
29
"github.com/kubernetes-sigs/kubebuilder/cmd/kubebuilder/util"
29
30
"github.com/spf13/cobra"
30
31
"sigs.k8s.io/controller-tools/pkg/scaffold/manager"
31
32
"sigs.k8s.io/controller-tools/pkg/scaffold/project"
32
33
)
33
34
34
-
35
35
type initOptions struct {
36
- domain string
37
- copyright string
38
- bazel bool
36
+ domain string
37
+ copyright string
38
+ bazel bool
39
39
controllerOnly bool
40
40
projectVersion string
41
41
projectOptions
@@ -52,20 +52,19 @@ func AddInit(cmd *cobra.Command) {
52
52
kubebuilder init repo --domain mydomain
53
53
`,
54
54
Run: func(cmd *cobra.Command, args []string) {
55
- o.runInitRepo()
55
+ o.runInitRepo()
56
56
},
57
57
}
58
58
59
59
v0comment := "Works only with project-version v0, "
60
60
initCmd.Flags().StringVar(&o.domain, "domain", "", "domain for the API groups")
61
- initCmd.Flags().StringVar(&o.copyright, "copyright", filepath.Join("hack", "boilerplate.go.txt"), v0comment + "Location of copyright boilerplate file.")
62
- initCmd.Flags().BoolVar(&o.bazel, "bazel", false, v0comment + "if true, setup Bazel workspace artifacts")
63
- initCmd.Flags().BoolVar(&o.controllerOnly, "controller-only", false, v0comment + "if true, setup controller only")
61
+ initCmd.Flags().StringVar(&o.copyright, "copyright", filepath.Join("hack", "boilerplate.go.txt"), v0comment+ "Location of copyright boilerplate file.")
62
+ initCmd.Flags().BoolVar(&o.bazel, "bazel", false, v0comment+ "if true, setup Bazel workspace artifacts")
63
+ initCmd.Flags().BoolVar(&o.controllerOnly, "controller-only", false, v0comment+ "if true, setup controller only")
64
64
initCmd.Flags().StringVar(&o.projectVersion, "project-version", "v1", "if set to v0, init project with kubebuilder legacy version")
65
65
66
-
67
66
initCmd.Flags().BoolVar(
68
- &o.dep, "dep", true,"if specified, determines whether dep will be used.")
67
+ &o.dep, "dep", true, "if specified, determines whether dep will be used.")
69
68
o.depFlag = initCmd.Flag("dep")
70
69
71
70
o.prj = projectForFlags(initCmd.Flags())
@@ -78,10 +77,8 @@ kubebuilder init repo --domain mydomain
78
77
}
79
78
80
79
func (o *initOptions) runInitRepo() {
81
- version := runtime.Version()
82
- if versionCmp(version, "go1.10") < 0 {
83
- log.Fatalf("The go version is %v, must be 1.10+", version)
84
- }
80
+ checkGoVersion()
81
+
85
82
if !depExists() {
86
83
log.Fatalf("Dep is not installed. Follow steps at: https://golang.github.io/dep/docs/installation.html")
87
84
}
@@ -129,6 +126,32 @@ func (o *initOptions) runInitRepo() {
129
126
"$ kubebuilder create resource\n")
130
127
}
131
128
129
+ func checkGoVersion() {
130
+ cmd := exec.Command("go", "version")
131
+ out, err := cmd.Output()
132
+ if err != nil {
133
+ log.Fatalf("Could not execute 'go version': %v", err)
134
+ }
135
+
136
+ split := strings.Split(string(out), " ")
137
+ if len(split) < 3 {
138
+ log.Fatalf("Invalid go version: %q", string(out))
139
+ }
140
+ goVersion := strings.TrimPrefix(split[2], "go")
141
+ if ver, err := semver.NewVersion(goVersion); err != nil {
142
+ if err != nil {
143
+ log.Fatalf("Invalid go version %q: %v", goVersion, err)
144
+ }
145
+ c, err := semver.NewConstraint(">= 1.10")
146
+ if err != nil {
147
+ log.Fatal("Invalid constraint: %v", err)
148
+ }
149
+ if !c.Check(ver) {
150
+ log.Fatalf("The go version is %v, must be 1.10+", goVersion)
151
+ }
152
+ }
153
+ }
154
+
132
155
func execute(path, templateName, templateValue string, data interface{}) {
133
156
dir, err := os.Getwd()
134
157
if err != nil {
0 commit comments