diff options
author | Jens Frederich <jfrederich@gmail.com> | 2014-10-14 23:24:58 -0400 |
---|---|---|
committer | Jens Frederich <jfrederich@gmail.com> | 2014-10-14 23:24:58 -0400 |
commit | f617e5520bbfe677fed06a1fd2bfedd5ef61a5ef (patch) | |
tree | d21c8f3f89b14a99650353a0336abd678607b77f | |
parent | a789400a8e4b1ad09076edacc1efeaef2446e619 (diff) | |
download | go-f617e5520bbfe677fed06a1fd2bfedd5ef61a5ef.tar.gz |
go/build: Return MultiplePackageError on importing a dir containing multiple packages
When the Import function in go/build encounters a directory
without any buildable Go source files, it returns a handy
NoGoError. Now if, instead it encounters multiple Go source files
from multiple packages, it returns a handy MultiplePackageError.
A new test for NoGoError and MultiplePackageError is also provided.
Fixes issue 8286.
LGTM=adg, rsc
R=bradfitz, rsc, adg
CC=golang-codereviews
https://codereview.appspot.com/155050043
Committer: Russ Cox <rsc@golang.org>
-rw-r--r-- | src/go/build/build.go | 15 | ||||
-rw-r--r-- | src/go/build/build_test.go | 14 | ||||
-rw-r--r-- | src/go/build/testdata/empty/dummy | 0 | ||||
-rw-r--r-- | src/go/build/testdata/multi/file.go | 5 | ||||
-rw-r--r-- | src/go/build/testdata/multi/file_appengine.go | 5 |
5 files changed, 38 insertions, 1 deletions
diff --git a/src/go/build/build.go b/src/go/build/build.go index 3ac798083..7a51cf3c0 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -417,6 +417,19 @@ func (e *NoGoError) Error() string { return "no buildable Go source files in " + e.Dir } +// MultiplePackageError describes a directory containing +// multiple buildable Go source files for multiple packages. +type MultiplePackageError struct { + Dir string // directory containing files + Packages []string // package names found + Files []string // corresponding files: Files[i] declares package Packages[i] +} + +func (e *MultiplePackageError) Error() string { + // Error string limited to two entries for compatibility. + return fmt.Sprintf("found packages %s (%s) and %s (%s) in %s", e.Packages[0], e.Files[0], e.Packages[1], e.Files[1], e.Dir) +} + func nameExt(name string) string { i := strings.LastIndex(name, ".") if i < 0 { @@ -675,7 +688,7 @@ Found: p.Name = pkg firstFile = name } else if pkg != p.Name { - return p, fmt.Errorf("found packages %s (%s) and %s (%s) in %s", p.Name, firstFile, pkg, name, p.Dir) + return p, &MultiplePackageError{p.Dir, []string{firstFile, name}, []string{p.Name, pkg}} } if pf.Doc != nil && p.Doc == "" { p.Doc = doc.Synopsis(pf.Doc.Text()) diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index 23ce89b4b..43d09cbd1 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -85,6 +85,20 @@ func TestEmptyImport(t *testing.T) { } } +func TestEmptyFolderImport(t *testing.T) { + _, err := Import(".", "testdata/empty", 0) + if _, ok := err.(*NoGoError); !ok { + t.Fatal(`Import("testdata/empty") did not return NoGoError.`) + } +} + +func TestMultiplePackageImport(t *testing.T) { + _, err := Import(".", "testdata/multi", 0) + if _, ok := err.(*MultiplePackageError); !ok { + t.Fatal(`Import("testdata/multi") did not return MultiplePackageError.`) + } +} + func TestLocalDirectory(t *testing.T) { cwd, err := os.Getwd() if err != nil { diff --git a/src/go/build/testdata/empty/dummy b/src/go/build/testdata/empty/dummy new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/src/go/build/testdata/empty/dummy diff --git a/src/go/build/testdata/multi/file.go b/src/go/build/testdata/multi/file.go new file mode 100644 index 000000000..ee946eb2a --- /dev/null +++ b/src/go/build/testdata/multi/file.go @@ -0,0 +1,5 @@ +// Test data - not compiled. + +package main + +func main() {} diff --git a/src/go/build/testdata/multi/file_appengine.go b/src/go/build/testdata/multi/file_appengine.go new file mode 100644 index 000000000..4ea31e703 --- /dev/null +++ b/src/go/build/testdata/multi/file_appengine.go @@ -0,0 +1,5 @@ +// Test data - not compiled. + +package test_package + +func init() {} |