+++ /dev/null
-// Copyright 2017 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// +build !plan9
-
-// The getgo command installs Go to the user's system.
-package main
-
-import (
- "bufio"
- "context"
- "errors"
- "flag"
- "fmt"
- "os"
- "os/exec"
- "strings"
-)
-
-var (
- interactive = flag.Bool("i", false, "Interactive mode, prompt for inputs.")
- verbose = flag.Bool("v", false, "Verbose.")
- setupOnly = flag.Bool("skip-dl", false, "Don't download - only set up environment variables")
- goVersion = flag.String("version", "", `Version of Go to install (e.g. "1.8.3"). If empty, uses the latest version.`)
-
- version = "devel"
-)
-
-var errExitCleanly error = errors.New("exit cleanly sentinel value")
-
-func main() {
- flag.Parse()
- if *goVersion != "" && !strings.HasPrefix(*goVersion, "go") {
- *goVersion = "go" + *goVersion
- }
-
- ctx := context.Background()
-
- verbosef("version " + version)
-
- runStep := func(s step) {
- err := s(ctx)
- if err == errExitCleanly {
- os.Exit(0)
- }
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(2)
- }
- }
-
- if !*setupOnly {
- runStep(welcome)
- runStep(checkOthers)
- runStep(chooseVersion)
- runStep(downloadGo)
- }
-
- runStep(setupGOPATH)
-}
-
-func verbosef(format string, v ...interface{}) {
- if !*verbose {
- return
- }
-
- fmt.Printf(format+"\n", v...)
-}
-
-func prompt(ctx context.Context, query, defaultAnswer string) (string, error) {
- if !*interactive {
- return defaultAnswer, nil
- }
-
- fmt.Printf("%s [%s]: ", query, defaultAnswer)
-
- type result struct {
- answer string
- err error
- }
- ch := make(chan result, 1)
- go func() {
- s := bufio.NewScanner(os.Stdin)
- if !s.Scan() {
- ch <- result{"", s.Err()}
- return
- }
- answer := s.Text()
- if answer == "" {
- answer = defaultAnswer
- }
- ch <- result{answer, nil}
- }()
-
- select {
- case r := <-ch:
- return r.answer, r.err
- case <-ctx.Done():
- return "", ctx.Err()
- }
-}
-
-func runCommand(ctx context.Context, prog string, args ...string) ([]byte, error) {
- verbosef("Running command: %s %v", prog, args)
-
- cmd := exec.CommandContext(ctx, prog, args...)
- out, err := cmd.CombinedOutput()
- if err != nil {
- return nil, fmt.Errorf("running cmd '%s %s' failed: %s err: %v", prog, strings.Join(args, " "), string(out), err)
- }
- if out != nil && err == nil && len(out) != 0 {
- verbosef("%s", out)
- }
-
- return out, nil
-}