mirror of
https://github.com/golang/go
synced 2024-11-18 10:34:51 -07:00
9badcbe49b
There is nothing else we can do other than just showing a message that user need to remove it from their PATH not to conflict with the current installation. Fixes #21217. Change-Id: Ie65385f4d536d5bb789387ba0229f54f2ee793f0 Reviewed-on: https://go-review.googlesource.com/51930 Run-TryBot: Jaana Burcu Dogan <jbd@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Kevin Burke <kev@inburke.com>
87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
// 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 windows
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
const (
|
|
envSeparator = ";"
|
|
homeKey = "USERPROFILE"
|
|
lineEnding = "/r/n"
|
|
pathVar = "$env:Path"
|
|
)
|
|
|
|
var installPath = `c:\go`
|
|
|
|
func isWindowsXP() bool {
|
|
v, err := syscall.GetVersion()
|
|
if err != nil {
|
|
log.Fatalf("GetVersion failed: %v", err)
|
|
}
|
|
major := byte(v)
|
|
return major < 6
|
|
}
|
|
|
|
func whichGo(ctx context.Context) (string, error) {
|
|
return findGo(ctx, "where")
|
|
}
|
|
|
|
// currentShell reports the current shell.
|
|
// It might be "powershell.exe", "cmd.exe" or any of the *nix shells.
|
|
//
|
|
// Returns empty string if the shell is unknown.
|
|
func currentShell() string {
|
|
shell := os.Getenv("SHELL")
|
|
if shell != "" {
|
|
return shell
|
|
}
|
|
|
|
pid := os.Getppid()
|
|
pe, err := getProcessEntry(pid)
|
|
if err != nil {
|
|
verbosef("getting shell from process entry failed: %v", err)
|
|
return ""
|
|
}
|
|
|
|
return syscall.UTF16ToString(pe.ExeFile[:])
|
|
}
|
|
|
|
func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
|
|
// From https://go.googlesource.com/go/+/go1.8.3/src/syscall/syscall_windows.go#941
|
|
snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer syscall.CloseHandle(snapshot)
|
|
|
|
var procEntry syscall.ProcessEntry32
|
|
procEntry.Size = uint32(unsafe.Sizeof(procEntry))
|
|
if err = syscall.Process32First(snapshot, &procEntry); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for {
|
|
if procEntry.ProcessID == uint32(pid) {
|
|
return &procEntry, nil
|
|
}
|
|
|
|
if err := syscall.Process32Next(snapshot, &procEntry); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
func persistEnvChangesForSession() error {
|
|
return nil
|
|
}
|