...
1
2
3
4
5 package gocommand
6
7 import (
8 "context"
9 "fmt"
10 "regexp"
11 "strings"
12 )
13
14
15
16
17
18
19
20
21
22
23 func GoVersion(ctx context.Context, inv Invocation, r *Runner) (int, error) {
24 inv.Verb = "list"
25 inv.Args = []string{"-e", "-f", `{{context.ReleaseTags}}`, `--`, `unsafe`}
26 inv.BuildFlags = nil
27 inv.ModFlag = ""
28 inv.ModFile = ""
29 inv.Env = append(inv.Env[:len(inv.Env):len(inv.Env)], "GO111MODULE=off")
30
31 stdoutBytes, err := r.Run(ctx, inv)
32 if err != nil {
33 return 0, err
34 }
35 stdout := stdoutBytes.String()
36 if len(stdout) < 3 {
37 return 0, fmt.Errorf("bad ReleaseTags output: %q", stdout)
38 }
39
40 tags := strings.Fields(stdout[1 : len(stdout)-2])
41 for i := len(tags) - 1; i >= 0; i-- {
42 var version int
43 if _, err := fmt.Sscanf(tags[i], "go1.%d", &version); err != nil {
44 continue
45 }
46 return version, nil
47 }
48 return 0, fmt.Errorf("no parseable ReleaseTags in %v", tags)
49 }
50
51
52 func GoVersionOutput(ctx context.Context, inv Invocation, r *Runner) (string, error) {
53 inv.Verb = "version"
54 goVersion, err := r.Run(ctx, inv)
55 if err != nil {
56 return "", err
57 }
58 return goVersion.String(), nil
59 }
60
61
62
63
64 func ParseGoVersionOutput(data string) string {
65 re := regexp.MustCompile(`^go version (go\S+|devel \S+)`)
66 m := re.FindStringSubmatch(data)
67 if len(m) != 2 {
68 return ""
69 }
70 return m[1]
71 }
72
View as plain text