Commit 6b092950 authored by Russ Cox's avatar Russ Cox

cmd/go: fix two bugs

Issue 3207 was caused by setting GOPATH=GOROOT.
This is a common mistake, so diagnose it at command start
and also correct the bug that it caused in get (downloading
to GOROOT/src/foo instead of GOROOT/src/pkg/foo).

Issue 3268 was caused by recognizing 'packages' that
had installed binaries but no source.  This behavior is not
documented and causes trouble, so remove it.  We can
revisit the concept of binary-only packages after Go 1.

Fixes #3207.
Fixes #3268.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5930044
parent 14da5298
...@@ -252,7 +252,9 @@ func downloadPackage(p *Package) error { ...@@ -252,7 +252,9 @@ func downloadPackage(p *Package) error {
if p.build.SrcRoot == "" { if p.build.SrcRoot == "" {
// Package not found. Put in first directory of $GOPATH or else $GOROOT. // Package not found. Put in first directory of $GOPATH or else $GOROOT.
if list := filepath.SplitList(buildContext.GOPATH); len(list) > 0 { // Guard against people setting GOPATH=$GOROOT. We have to use
// $GOROOT's directory hierarchy (src/pkg, not just src) in that case.
if list := filepath.SplitList(buildContext.GOPATH); len(list) > 0 && list[0] != goroot {
p.build.SrcRoot = filepath.Join(list[0], "src") p.build.SrcRoot = filepath.Join(list[0], "src")
p.build.PkgRoot = filepath.Join(list[0], "pkg") p.build.PkgRoot = filepath.Join(list[0], "pkg")
} else { } else {
......
...@@ -16,6 +16,7 @@ import ( ...@@ -16,6 +16,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"regexp" "regexp"
"runtime"
"strings" "strings"
"sync" "sync"
"text/template" "text/template"
...@@ -121,6 +122,13 @@ func main() { ...@@ -121,6 +122,13 @@ func main() {
return return
} }
// Diagnose common mistake: GOPATH==GOROOT.
// This setting is equivalent to not setting GOPATH at all,
// which is not what most people want when they do it.
if gopath := os.Getenv("GOPATH"); gopath == runtime.GOROOT() {
fmt.Fprintf(os.Stderr, "warning: GOPATH set to GOROOT (%s) has no effect\n", gopath)
}
for _, cmd := range commands { for _, cmd := range commands {
if cmd.Name() == args[0] && cmd.Run != nil { if cmd.Name() == args[0] && cmd.Run != nil {
cmd.Flag.Usage = func() { cmd.Usage() } cmd.Flag.Usage = func() { cmd.Usage() }
......
...@@ -217,7 +217,10 @@ func loadImport(path string, srcDir string, stk *importStack, importPos []token. ...@@ -217,7 +217,10 @@ func loadImport(path string, srcDir string, stk *importStack, importPos []token.
// Load package. // Load package.
// Import always returns bp != nil, even if an error occurs, // Import always returns bp != nil, even if an error occurs,
// in order to return partial information. // in order to return partial information.
bp, err := buildContext.Import(path, srcDir, build.AllowBinary) //
// TODO: After Go 1, decide when to pass build.AllowBinary here.
// See issue 3268 for mistakes to avoid.
bp, err := buildContext.Import(path, srcDir, 0)
bp.ImportPath = importPath bp.ImportPath = importPath
p.load(stk, bp, err) p.load(stk, bp, err)
if p.Error != nil && len(importPos) > 0 { if p.Error != nil && len(importPos) > 0 {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment