File: steps.go

package info (click to toggle)
golang-golang-x-tools 1%3A0.0~git20190125.d66bd3c%2Bds-4
  • links: PTS, VCS
  • area: main
  • in suites: buster, buster-backports
  • size: 8,912 kB
  • sloc: asm: 1,394; yacc: 155; makefile: 109; sh: 108; ansic: 17; xml: 11
file content (133 lines) | stat: -rw-r--r-- 2,884 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// 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

package main

import (
	"context"
	"fmt"
	"os"
	"path/filepath"
	"runtime"
	"strings"
)

type step func(context.Context) error

func welcome(ctx context.Context) error {
	fmt.Println("Welcome to the Go installer!")
	answer, err := prompt(ctx, "Would you like to install Go? Y/n", "Y")
	if err != nil {
		return err
	}
	if strings.ToLower(answer) != "y" {
		fmt.Println("Exiting install.")
		return exitCleanly
	}

	return nil
}

func checkOthers(ctx context.Context) error {
	// TODO: if go is currently installed install new version over that
	path, err := whichGo(ctx)
	if err != nil {
		fmt.Printf("Cannot check if Go is already installed:\n%v\n", err)
	}
	if path == "" {
		return nil
	}
	if path != installPath {
		fmt.Printf("Go is already installed at %v; remove it from your PATH.\n", path)
	}
	return nil
}

func chooseVersion(ctx context.Context) error {
	if *goVersion != "" {
		return nil
	}

	var err error
	*goVersion, err = getLatestGoVersion()
	if err != nil {
		return err
	}

	answer, err := prompt(ctx, fmt.Sprintf("The latest Go version is %s, install that? Y/n", *goVersion), "Y")
	if err != nil {
		return err
	}

	if strings.ToLower(answer) != "y" {
		// TODO: handle passing a version
		fmt.Println("Aborting install.")
		return exitCleanly
	}

	return nil
}

func downloadGo(ctx context.Context) error {
	answer, err := prompt(ctx, fmt.Sprintf("Download Go version %s to %s? Y/n", *goVersion, installPath), "Y")
	if err != nil {
		return err
	}

	if strings.ToLower(answer) != "y" {
		fmt.Println("Aborting install.")
		return exitCleanly
	}

	fmt.Printf("Downloading Go version %s to %s\n", *goVersion, installPath)
	fmt.Println("This may take a bit of time...")

	if err := downloadGoVersion(*goVersion, runtime.GOOS, arch, installPath); err != nil {
		return err
	}

	if err := appendToPATH(filepath.Join(installPath, "bin")); err != nil {
		return err
	}

	fmt.Println("Downloaded!")
	return nil
}

func setupGOPATH(ctx context.Context) error {
	answer, err := prompt(ctx, "Would you like us to setup your GOPATH? Y/n", "Y")
	if err != nil {
		return err
	}

	if strings.ToLower(answer) != "y" {
		fmt.Println("Exiting and not setting up GOPATH.")
		return exitCleanly
	}

	fmt.Println("Setting up GOPATH")
	home, err := getHomeDir()
	if err != nil {
		return err
	}

	gopath := os.Getenv("GOPATH")
	if gopath == "" {
		// set $GOPATH
		gopath = filepath.Join(home, "go")
		if err := persistEnvVar("GOPATH", gopath); err != nil {
			return err
		}
		fmt.Println("GOPATH has been set up!")
	} else {
		verbosef("GOPATH is already set to %s", gopath)
	}

	if err := appendToPATH(filepath.Join(gopath, "bin")); err != nil {
		return err
	}
	return persistEnvChangesForSession()
}