cmd/doc: try better when looking for package dir
When go doc is invoked with a single package name argument (e.g. go doc pkgname)
it needs to find the directory of the requested package sources in GOPATH.
GOPATH might contain directories with the same name as the requested package
that do no contain any *.go files. This change makes "go doc" ignore such
directories when looking for possible package directories.
This fixes #10882
Change-Id: Ib3d4ea69a25801c34cbe7b044de9870ba12f9aa8
Reviewed-on: https://go-review.googlesource.com/10190
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/src/cmd/doc/main.go b/src/cmd/doc/main.go
index 18dafc2..720b85e 100644
--- a/src/cmd/doc/main.go
+++ b/src/cmd/doc/main.go
@@ -276,7 +276,7 @@
return filepath.SkipDir
}
// Is the tail of the path correct?
- if strings.HasSuffix(pathName, pkgString) {
+ if strings.HasSuffix(pathName, pkgString) && hasGoFiles(pathName) {
result = pathName
panic(nil)
}
@@ -287,6 +287,31 @@
return "" // Call to panic above sets the real value.
}
+// hasGoFiles tests whether the directory contains at least one file with ".go"
+// extension
+func hasGoFiles(path string) bool {
+ dir, err := os.Open(path)
+ if err != nil {
+ // ignore unreadable directories
+ return false
+ }
+ defer dir.Close()
+
+ names, err := dir.Readdirnames(0)
+ if err != nil {
+ // ignore unreadable directories
+ return false
+ }
+
+ for _, name := range names {
+ if strings.HasSuffix(name, ".go") {
+ return true
+ }
+ }
+
+ return false
+}
+
// pwd returns the current directory.
func pwd() string {
wd, err := os.Getwd()