From 7af2ce3f159760033c903b3730bfb5995b4edd40 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Tue, 10 May 2016 21:28:30 -0700 Subject: [PATCH] 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 --- src/go/build/build.go | 6 +++++- src/go/build/build_test.go | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/go/build/build.go b/src/go/build/build.go index fa258d3dc67..0818aa05017 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 c9f906a7da6..6bade1d318c 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) + } +}