]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: fix ToAbsolute mapping
authorRobert Griesemer <gri@golang.org>
Tue, 18 Oct 2011 17:28:30 +0000 (10:28 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 18 Oct 2011 17:28:30 +0000 (10:28 -0700)
The implementation of splitFirst was broken;
splitFirst("foo/") must be the same as splitFirst("foo").
As a result, ToAbsolute could be simplified, and as a side
effect this fixes a long-standing bug.

Thanks to Luca Greco <luca.greco@alcacoop.it> for doing
the investigation.

Fixes #1157.

R=rsc
CC=golang-dev
https://golang.org/cl/5278050

src/cmd/godoc/mapping.go

index 51f23ab9853cac390501211691daed8b77670487..89e531e2f3d1ffbd45de3ba433dc61c2f1697579 100644 (file)
@@ -139,13 +139,18 @@ func (m *Mapping) Fprint(w io.Writer) {
        }
 }
 
+// splitFirst splits a path at the first path separator and returns
+// the path's head (the top-most directory specified by the path) and
+// its tail (the rest of the path). If there is no path separator,
+// splitFirst returns path as head, and the the empty string as tail.
+// Specifically, splitFirst("foo") == splitFirst("foo/").
+//
 func splitFirst(path string) (head, tail string) {
-       i := strings.Index(path, string(filepath.Separator))
-       if i > 0 {
+       if i := strings.Index(path, string(filepath.Separator)); i > 0 {
                // 0 < i < len(path)
                return path[0:i], path[i+1:]
        }
-       return "", path
+       return path, ""
 }
 
 // ToAbsolute maps a slash-separated relative path to an absolute filesystem
@@ -156,20 +161,14 @@ func (m *Mapping) ToAbsolute(spath string) string {
        fpath := filepath.FromSlash(spath)
        prefix, tail := splitFirst(fpath)
        for _, e := range m.list {
-               switch {
-               case e.prefix == prefix:
-                       // use tail
-               case e.prefix == "":
-                       tail = fpath
-               default:
-                       continue // no match
-               }
-               abspath := filepath.Join(e.path, tail)
-               if _, err := fs.Stat(abspath); err == nil {
-                       return abspath
+               if e.prefix == prefix {
+                       // found potential mapping
+                       abspath := filepath.Join(e.path, tail)
+                       if _, err := fs.Stat(abspath); err == nil {
+                               return abspath
+                       }
                }
        }
-
        return "" // no match
 }