github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/cmd/getgo/steps.go (about) 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. 4 5 //go:build !plan9 6 // +build !plan9 7 8 package main 9 10 import ( 11 "context" 12 "fmt" 13 "os" 14 "path/filepath" 15 "runtime" 16 "strings" 17 ) 18 19 type step func(context.Context) error 20 21 func welcome(ctx context.Context) error { 22 fmt.Println("Welcome to the Go installer!") 23 answer, err := prompt(ctx, "Would you like to install Go? Y/n", "Y") 24 if err != nil { 25 return err 26 } 27 if strings.ToLower(answer) != "y" { 28 fmt.Println("Exiting install.") 29 return errExitCleanly 30 } 31 32 return nil 33 } 34 35 func checkOthers(ctx context.Context) error { 36 // TODO: if go is currently installed install new version over that 37 path, err := whichGo(ctx) 38 if err != nil { 39 fmt.Printf("Cannot check if Go is already installed:\n%v\n", err) 40 } 41 if path == "" { 42 return nil 43 } 44 if path != installPath { 45 fmt.Printf("Go is already installed at %v; remove it from your PATH.\n", path) 46 } 47 return nil 48 } 49 50 func chooseVersion(ctx context.Context) error { 51 if *goVersion != "" { 52 return nil 53 } 54 55 var err error 56 *goVersion, err = getLatestGoVersion() 57 if err != nil { 58 return err 59 } 60 61 answer, err := prompt(ctx, fmt.Sprintf("The latest Go version is %s, install that? Y/n", *goVersion), "Y") 62 if err != nil { 63 return err 64 } 65 66 if strings.ToLower(answer) != "y" { 67 // TODO: handle passing a version 68 fmt.Println("Aborting install.") 69 return errExitCleanly 70 } 71 72 return nil 73 } 74 75 func downloadGo(ctx context.Context) error { 76 answer, err := prompt(ctx, fmt.Sprintf("Download Go version %s to %s? Y/n", *goVersion, installPath), "Y") 77 if err != nil { 78 return err 79 } 80 81 if strings.ToLower(answer) != "y" { 82 fmt.Println("Aborting install.") 83 return errExitCleanly 84 } 85 86 fmt.Printf("Downloading Go version %s to %s\n", *goVersion, installPath) 87 fmt.Println("This may take a bit of time...") 88 89 if err := downloadGoVersion(*goVersion, runtime.GOOS, arch, installPath); err != nil { 90 return err 91 } 92 93 if err := appendToPATH(filepath.Join(installPath, "bin")); err != nil { 94 return err 95 } 96 97 fmt.Println("Downloaded!") 98 return nil 99 } 100 101 func setupGOPATH(ctx context.Context) error { 102 answer, err := prompt(ctx, "Would you like us to setup your GOPATH? Y/n", "Y") 103 if err != nil { 104 return err 105 } 106 107 if strings.ToLower(answer) != "y" { 108 fmt.Println("Exiting and not setting up GOPATH.") 109 return errExitCleanly 110 } 111 112 fmt.Println("Setting up GOPATH") 113 home, err := getHomeDir() 114 if err != nil { 115 return err 116 } 117 118 gopath := os.Getenv("GOPATH") 119 if gopath == "" { 120 // set $GOPATH 121 gopath = filepath.Join(home, "go") 122 if err := persistEnvVar("GOPATH", gopath); err != nil { 123 return err 124 } 125 fmt.Println("GOPATH has been set up!") 126 } else { 127 verbosef("GOPATH is already set to %s", gopath) 128 } 129 130 if err := appendToPATH(filepath.Join(gopath, "bin")); err != nil { 131 return err 132 } 133 return persistEnvChangesForSession() 134 }