From: Emmanuel Odeke Date: Wed, 11 May 2016 04:28:30 +0000 (-0700) Subject: cmd/build: reject non-existant directories in ImportDir X-Git-Tag: go1.7beta1~230 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7af2ce3f159760033c903b3730bfb5995b4edd40;p=gostls13.git cmd/build: reject non-existant directories in ImportDir Re-apply @adg's CL https://golang.org/cl/7129048 that was previously disabled in https://golang.org/cl/7235052 because it broke `godoc net/http` for go1.1. Currently `godoc net/http` seems to work fine with this CL. Fixes #3428. Change-Id: I7df06df02fd62dededac6ec60bea62561be59cf1 Reviewed-on: https://go-review.googlesource.com/23013 Run-TryBot: Andrew Gerrand TryBot-Result: Gobot Gobot Reviewed-by: Andrew Gerrand --- diff --git a/src/go/build/build.go b/src/go/build/build.go index fa258d3dc6..0818aa0501 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -403,7 +403,11 @@ func (p *Package) IsCommand() bool { // ImportDir is like Import but processes the Go package found in // the named directory. func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error) { - return ctxt.Import(".", dir, mode) + p, err := ctxt.Import(".", dir, mode) + if err == nil && !ctxt.isDir(p.Dir) { + err = fmt.Errorf("%q is not a directory", p.Dir) + } + return p, err } // NoGoError is the error used by Import to describe a directory diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index c9f906a7da..6bade1d318 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -5,6 +5,7 @@ package build import ( + "fmt" "internal/testenv" "io" "os" @@ -345,3 +346,13 @@ func TestImportVendorParentFailure(t *testing.T) { t.Fatalf("error on failed import does not mention GOROOT/src/vendor directory:\n%s", e) } } + +// Issue 3248 +func TestBogusDirectory(t *testing.T) { + const dir = "/foo/bar/baz/gopher" + _, err := ImportDir(dir, FindOnly) + want := fmt.Sprintf("%q is not a directory", filepath.FromSlash(dir)) + if err == nil || err.Error() != want { + t.Errorf("got error %q, want %q", err, want) + } +}