GoPLS Viewer

Home|gopls/cmd/getgo/path.go
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
8package main
9
10import (
11    "bufio"
12    "context"
13    "fmt"
14    "os"
15    "os/user"
16    "path/filepath"
17    "runtime"
18    "strings"
19)
20
21const (
22    bashConfig = ".bash_profile"
23    zshConfig  = ".zshrc"
24)
25
26// appendToPATH adds the given path to the PATH environment variable and
27// persists it for future sessions.
28func appendToPATH(value stringerror {
29    if isInPATH(value) {
30        return nil
31    }
32    return persistEnvVar("PATH"pathVar+envSeparator+value)
33}
34
35func isInPATH(dir stringbool {
36    p := os.Getenv("PATH")
37
38    paths := strings.Split(penvSeparator)
39    for _d := range paths {
40        if d == dir {
41            return true
42        }
43    }
44
45    return false
46}
47
48func getHomeDir() (stringerror) {
49    home := os.Getenv(homeKey)
50    if home != "" {
51        return homenil
52    }
53
54    uerr := user.Current()
55    if err != nil {
56        return ""err
57    }
58    return u.HomeDirnil
59}
60
61func checkStringExistsFile(filenamevalue string) (boolerror) {
62    fileerr := os.OpenFile(filenameos.O_RDONLY0600)
63    if err != nil {
64        if os.IsNotExist(err) {
65            return falsenil
66        }
67        return falseerr
68    }
69    defer file.Close()
70
71    scanner := bufio.NewScanner(file)
72    for scanner.Scan() {
73        line := scanner.Text()
74        if line == value {
75            return truenil
76        }
77    }
78
79    return falsescanner.Err()
80}
81
82func appendToFile(filenamevalue stringerror {
83    verbosef("Adding %q to %s"valuefilename)
84
85    okerr := checkStringExistsFile(filenamevalue)
86    if err != nil {
87        return err
88    }
89    if ok {
90        // Nothing to do.
91        return nil
92    }
93
94    ferr := os.OpenFile(filenameos.O_APPEND|os.O_WRONLY|os.O_CREATE0600)
95    if err != nil {
96        return err
97    }
98    defer f.Close()
99
100    _err = f.WriteString(lineEnding + value + lineEnding)
101    return err
102}
103
104func isShell(name stringbool {
105    return strings.Contains(currentShell(), name)
106}
107
108// persistEnvVarWindows sets an environment variable in the Windows
109// registry.
110func persistEnvVarWindows(namevalue stringerror {
111    _err := runCommand(context.Background(), "powershell""-command",
112        fmt.Sprintf(`[Environment]::SetEnvironmentVariable("%s", "%s", "User")`namevalue))
113    return err
114}
115
116func persistEnvVar(namevalue stringerror {
117    if runtime.GOOS == "windows" {
118        if err := persistEnvVarWindows(namevalue); err != nil {
119            return err
120        }
121
122        if isShell("cmd.exe") || isShell("powershell.exe") {
123            return os.Setenv(strings.ToUpper(name), value)
124        }
125        // User is in bash, zsh, etc.
126        // Also set the environment variable in their shell config.
127    }
128
129    rcerr := shellConfigFile()
130    if err != nil {
131        return err
132    }
133
134    line := fmt.Sprintf("export %s=%s"strings.ToUpper(name), value)
135    if err := appendToFile(rcline); err != nil {
136        return err
137    }
138
139    return os.Setenv(strings.ToUpper(name), value)
140}
141
142func shellConfigFile() (stringerror) {
143    homeerr := getHomeDir()
144    if err != nil {
145        return ""err
146    }
147
148    switch {
149    case isShell("bash"):
150        return filepath.Join(homebashConfig), nil
151    case isShell("zsh"):
152        return filepath.Join(homezshConfig), nil
153    default:
154        return ""fmt.Errorf("%q is not a supported shell"currentShell())
155    }
156}
157
MembersX
getHomeDir.u
persistEnvVarWindows.err
persistEnvVar.line
isInPATH
isInPATH.dir
isInPATH.p
persistEnvVarWindows.value
persistEnvVar.name
bashConfig
zshConfig
checkStringExistsFile.filename
persistEnvVarWindows
persistEnvVarWindows._
appendToPATH
getHomeDir
isShell.name
appendToFile.filename
isShell
shellConfigFile
shellConfigFile.home
shellConfigFile.err
runtime
checkStringExistsFile
appendToFile
persistEnvVarWindows.name
persistEnvVar.rc
persistEnvVar.err
checkStringExistsFile.BlockStmt.line
appendToFile.ok
appendToFile.f
isInPATH.paths
getHomeDir.home
checkStringExistsFile.file
appendToFile.value
appendToFile.err
persistEnvVar.value
appendToPATH.value
checkStringExistsFile.value
checkStringExistsFile.scanner
checkStringExistsFile.err
persistEnvVar
persistEnvVar.BlockStmt.err
user
isInPATH.RangeStmt_718.d
getHomeDir.err
Members
X