]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: create executable when installing to working directory
authorRoss Light <light@google.com>
Thu, 25 Jun 2015 16:56:08 +0000 (09:56 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 7 Jul 2015 21:00:44 +0000 (21:00 +0000)
Fixes #11065.

Change-Id: Idd854facd5fa78c0334f86740f351d404f9a5b2d
Reviewed-on: https://go-review.googlesource.com/11511
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/go/build.go
src/cmd/go/go_test.go

index 637198edd6135ee3e226b4952edad74c719cb11b..e678367ff8ea6dbb9dc1841ea6b96be0639b9a71 100644 (file)
@@ -559,12 +559,14 @@ func runInstall(cmd *Command, args []string) {
                // If it exists and is an executable file, remove it.
                _, targ := filepath.Split(pkgs[0].ImportPath)
                targ += exeSuffix
-               fi, err := os.Stat(targ)
-               if err == nil {
-                       m := fi.Mode()
-                       if m.IsRegular() {
-                               if m&0111 != 0 || goos == "windows" { // windows never sets executable bit
-                                       os.Remove(targ)
+               if filepath.Join(pkgs[0].Dir, targ) != pkgs[0].Target { // maybe $GOBIN is the current directory
+                       fi, err := os.Stat(targ)
+                       if err == nil {
+                               m := fi.Mode()
+                               if m.IsRegular() {
+                                       if m&0111 != 0 || goos == "windows" { // windows never sets executable bit
+                                               os.Remove(targ)
+                                       }
                                }
                        }
                }
index f8d784545df1373079474b3cd9ebfb5433d6fdd4..28bee16a00d96b19ab8f16c38cc9d91a343dc2a4 100644 (file)
@@ -439,7 +439,7 @@ func (tg *testgoData) grepCountBoth(match string) int {
 // removed if it exists.
 func (tg *testgoData) creatingTemp(path string) {
        if filepath.IsAbs(path) && !strings.HasPrefix(path, tg.tempdir) {
-               tg.t.Fatal("internal testsuite error: creatingTemp(%q) with absolute path not in temporary directory")
+               tg.t.Fatal("internal testsuite error: creatingTemp(%q) with absolute path not in temporary directory", path)
        }
        // If we have changed the working directory, make sure we have
        // an absolute path, because we are going to change directory
@@ -1109,6 +1109,19 @@ func TestInstallIntoGOBIN(t *testing.T) {
        tg.wantExecutable("testdata/bin1/go-cmd-test"+exeSuffix, "go install go-cmd-test did not write to testdata/bin1/go-cmd-test")
 }
 
+// Issue 11065
+func TestInstallToCurrentDirectoryCreatesExecutable(t *testing.T) {
+       tg := testgo(t)
+       defer tg.cleanup()
+       pkg := filepath.Join(tg.pwd(), "testdata", "src", "go-cmd-test")
+       tg.creatingTemp(filepath.Join(pkg, "go-cmd-test"+exeSuffix))
+       tg.setenv("GOBIN", pkg)
+       tg.setenv("GOPATH", filepath.Join(tg.pwd(), "testdata"))
+       tg.cd(pkg)
+       tg.run("install")
+       tg.wantExecutable("go-cmd-test"+exeSuffix, "go install did not write to current directory")
+}
+
 // Without $GOBIN set, installing a program outside $GOPATH should fail
 // (there is nowhere to install it).
 func TestInstallWithoutDestinationFails(t *testing.T) {