1 // Copyright 2017 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
8 // The getgo command installs Go to the user's system.
17 exec "golang.org/x/sys/execabs"
23 interactive = flag.Bool("i", false, "Interactive mode, prompt for inputs.")
24 verbose = flag.Bool("v", false, "Verbose.")
25 setupOnly = flag.Bool("skip-dl", false, "Don't download - only set up environment variables")
26 goVersion = flag.String("version", "", `Version of Go to install (e.g. "1.8.3"). If empty, uses the latest version.`)
31 var errExitCleanly error = errors.New("exit cleanly sentinel value")
35 if *goVersion != "" && !strings.HasPrefix(*goVersion, "go") {
36 *goVersion = "go" + *goVersion
39 ctx := context.Background()
41 verbosef("version " + version)
43 runStep := func(s step) {
45 if err == errExitCleanly {
49 fmt.Fprintln(os.Stderr, err)
57 runStep(chooseVersion)
64 func verbosef(format string, v ...interface{}) {
69 fmt.Printf(format+"\n", v...)
72 func prompt(ctx context.Context, query, defaultAnswer string) (string, error) {
74 return defaultAnswer, nil
77 fmt.Printf("%s [%s]: ", query, defaultAnswer)
83 ch := make(chan result, 1)
85 s := bufio.NewScanner(os.Stdin)
87 ch <- result{"", s.Err()}
92 answer = defaultAnswer
94 ch <- result{answer, nil}
99 return r.answer, r.err
105 func runCommand(ctx context.Context, prog string, args ...string) ([]byte, error) {
106 verbosef("Running command: %s %v", prog, args)
108 cmd := exec.CommandContext(ctx, prog, args...)
109 out, err := cmd.CombinedOutput()
111 return nil, fmt.Errorf("running cmd '%s %s' failed: %s err: %v", prog, strings.Join(args, " "), string(out), err)
113 if out != nil && err == nil && len(out) != 0 {