summaryrefslogtreecommitdiff
path: root/src/go
diff options
context:
space:
mode:
authorJens Frederich <jfrederich@gmail.com>2014-10-14 23:24:58 -0400
committerJens Frederich <jfrederich@gmail.com>2014-10-14 23:24:58 -0400
commitf617e5520bbfe677fed06a1fd2bfedd5ef61a5ef (patch)
treed21c8f3f89b14a99650353a0336abd678607b77f /src/go
parenta789400a8e4b1ad09076edacc1efeaef2446e619 (diff)
downloadgo-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>
Diffstat (limited to 'src/go')
-rw-r--r--src/go/build/build.go15
-rw-r--r--src/go/build/build_test.go14
-rw-r--r--src/go/build/testdata/empty/dummy0
-rw-r--r--src/go/build/testdata/multi/file.go5
-rw-r--r--src/go/build/testdata/multi/file_appengine.go5
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() {}