]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/doc: try better when looking for package dir
authorKonstantin Shaposhnikov <k.shaposhnikov@gmail.com>
Sun, 17 May 2015 04:07:04 +0000 (12:07 +0800)
committerRob Pike <r@golang.org>
Mon, 1 Jun 2015 19:59:40 +0000 (19:59 +0000)
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>
src/cmd/doc/main.go

index 18dafc298ca7721af68cc1c4c6ad2f8de6987161..720b85e9022b676e0b7210cbbf511b0c3edff8d7 100644 (file)
@@ -276,7 +276,7 @@ func pathFor(root, pkg string) (result string) {
                        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 @@ func pathFor(root, pkg string) (result string) {
        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()