@@ -23,9 +23,10 @@ import (
23
23
"os"
24
24
"os/exec"
25
25
"path/filepath"
26
+ "regexp"
27
+ "strconv"
26
28
"strings"
27
29
28
- "github.com/Masterminds/semver"
29
30
"github.com/spf13/cobra"
30
31
flag "github.com/spf13/pflag"
31
32
@@ -63,6 +64,8 @@ kubebuilder init --domain example.org --license apache2 --owner "The Kubernetes
63
64
},
64
65
}
65
66
67
+ initCmd .Flags ().BoolVar (
68
+ & o .skipGoVersionCheck , "skip-go-version-check" , false , "if specified, skip checking the Go version" )
66
69
initCmd .Flags ().BoolVar (
67
70
& o .dep , "dep" , true , "if specified, determines whether dep will be used." )
68
71
o .depFlag = initCmd .Flag ("dep" )
@@ -78,18 +81,21 @@ kubebuilder init --domain example.org --license apache2 --owner "The Kubernetes
78
81
}
79
82
80
83
type projectOptions struct {
81
- prj * project.Project
82
- bp * project.Boilerplate
83
- gopkg * project.GopkgToml
84
- mgr * manager.Cmd
85
- dkr * manager.Dockerfile
86
- dep bool
87
- depFlag * flag.Flag
88
- depArgs []string
84
+ prj * project.Project
85
+ bp * project.Boilerplate
86
+ gopkg * project.GopkgToml
87
+ mgr * manager.Cmd
88
+ dkr * manager.Dockerfile
89
+ dep bool
90
+ depFlag * flag.Flag
91
+ depArgs []string
92
+ skipGoVersionCheck bool
89
93
}
90
94
91
95
func (o * projectOptions ) runInit () {
92
- checkGoVersion ()
96
+ if ! o .skipGoVersionCheck {
97
+ ensureGoVersionIsCompatible ()
98
+ }
93
99
94
100
if ! depExists () {
95
101
log .Fatalf ("Dep is not installed. Follow steps at: https://golang.github.io/dep/docs/installation.html" )
@@ -190,30 +196,54 @@ func boilerplateForFlags(f *flag.FlagSet) *project.Boilerplate {
190
196
f .StringVar (& b .Owner , "owner" , "" , "Owner to add to the copyright" )
191
197
return b
192
198
}
193
- func checkGoVersion () {
199
+
200
+ func ensureGoVersionIsCompatible () {
201
+ err := fetchAndCheckGoVersion ()
202
+ if err != nil {
203
+ log .Fatalf ("%s. You can skip this check using the --skip-go-version-check flag" , err )
204
+ }
205
+ }
206
+
207
+ func fetchAndCheckGoVersion () error {
194
208
cmd := exec .Command ("go" , "version" )
195
209
out , err := cmd .Output ()
196
210
if err != nil {
197
- log . Fatalf ( "Could not execute 'go version': %v" , err )
211
+ return fmt . Errorf ( "Failed to retrieve 'go version': %v" , string ( out ) )
198
212
}
199
213
200
214
split := strings .Split (string (out ), " " )
201
215
if len (split ) < 3 {
202
- log . Fatalf ( "Invalid go version: %q" , string (out ))
216
+ return fmt . Errorf ( "Found invalid Go version: %q" , string (out ))
203
217
}
204
- goVersion := strings .TrimPrefix (split [2 ], "go" )
205
- if ver , err := semver .NewVersion (goVersion ); err != nil {
206
- if err != nil {
207
- log .Fatalf ("Invalid go version %q: %v" , goVersion , err )
208
- }
209
- c , err := semver .NewConstraint (">= 1.10" )
210
- if err != nil {
211
- log .Fatal ("Invalid constraint: %v" , err )
212
- }
213
- if ! c .Check (ver ) {
214
- log .Fatalf ("The go version is %v, must be 1.10+" , goVersion )
215
- }
218
+ goVer := split [2 ]
219
+ if err := checkGoVersion (goVer ); err != nil {
220
+ return fmt .Errorf ("Go version '%s' is incompatible because '%s'" , goVer , err )
221
+ }
222
+ return nil
223
+ }
224
+
225
+ func checkGoVersion (verStr string ) error {
226
+ goVerRegex := `^go?([0-9]+)\.([0-9]+)([\.0-9A-Za-z\-]+)?$`
227
+ m := regexp .MustCompile (goVerRegex ).FindStringSubmatch (verStr )
228
+ if m == nil {
229
+ return fmt .Errorf ("invalid version string" )
230
+ }
231
+
232
+ major , err := strconv .Atoi (m [1 ])
233
+ if err != nil {
234
+ return fmt .Errorf ("error parsing major version '%s': %s" , m [1 ], err )
216
235
}
236
+
237
+ minor , err := strconv .Atoi (m [2 ])
238
+ if err != nil {
239
+ return fmt .Errorf ("error parsing minor version '%s': %s" , m [2 ], err )
240
+ }
241
+
242
+ if major < 1 || minor < 10 {
243
+ return fmt .Errorf ("requires version >= 1.10" )
244
+ }
245
+
246
+ return nil
217
247
}
218
248
219
249
func depExists () bool {
0 commit comments