]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: 'go get' should not delete binaries when run from $GOBIN
authorJay Conrod <jayconrod@google.com>
Tue, 25 Jun 2019 21:25:01 +0000 (17:25 -0400)
committerJay Conrod <jayconrod@google.com>
Wed, 26 Jun 2019 15:02:32 +0000 (15:02 +0000)
When 'go install' is run without arguments in a directory containing a
main package, it deletes an executable file with the same name as the
package (presumably created by 'go build' previously).

'go get' in module mode executes the same code after updating and
downloading modules. However, the special case was misfiring because
we passed an empty list of patterns to InstallPackages.

Fixes #32766

Change-Id: I19aca64ee1fb5a216777dd7d559e8e6a45b3e90c
Reviewed-on: https://go-review.googlesource.com/c/go/+/183846
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/modget/get.go
src/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt [new file with mode: 0644]
src/cmd/go/testdata/script/mod_get_cmd.txt [new file with mode: 0644]

index 93d6a15dae039ce33c9e059e2237cc6d6ad827ba..491d2891c7ea0fb8eb5846e74e766f12da03bbce 100644 (file)
@@ -472,7 +472,6 @@ func runGet(cmd *base.Command, args []string) {
        // and the load and upgrade operations may only add and upgrade modules
        // in the build list.
        var matches []*search.Match
-       var install []string
        for {
                var seenPkgs map[string]bool
                seenQuery := make(map[querySpec]bool)
@@ -664,7 +663,7 @@ func runGet(cmd *base.Command, args []string) {
        }
        work.BuildInit()
        pkgs := load.PackagesForBuild(pkgPatterns)
-       work.InstallPackages(install, pkgs)
+       work.InstallPackages(pkgPatterns, pkgs)
 }
 
 // runQueries looks up modules at target versions in parallel. Results will be
diff --git a/src/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_tools_v1.0.0.txt
new file mode 100644 (file)
index 0000000..22e36b9
--- /dev/null
@@ -0,0 +1,12 @@
+-- .info --
+{"Version": "v1.0.0"}
+-- .mod --
+module example.com/tools
+-- cmd/hello/hello.go --
+package main
+
+import "fmt"
+
+func main() {
+       fmt.Println("hello")
+}
diff --git a/src/cmd/go/testdata/script/mod_get_cmd.txt b/src/cmd/go/testdata/script/mod_get_cmd.txt
new file mode 100644 (file)
index 0000000..d31cee1
--- /dev/null
@@ -0,0 +1,20 @@
+env GO111MODULE=on
+[short] skip
+
+# Test that when 'go get' is run from $GOBIN, it does not delete binaries
+# after it installs them. Verifies golang.org/issue/32766.
+
+go get example.com/tools/cmd/hello
+
+# 'go get' should not delete the command when run from $GOPATH/bin
+cd $GOPATH/bin
+exists hello$GOEXE
+go get example.com/tools/cmd/hello
+exists hello$GOEXE
+
+# 'go get' should not delete the command when run from a different $GOBIN
+mkdir $WORK/bin
+cd $WORK/bin
+env GOBIN=$WORK/bin
+go get example.com/tools/cmd/hello
+exists hello$GOEXE