aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2011-10-18 10:28:30 -0700
committerRobert Griesemer <gri@golang.org>2011-10-18 10:28:30 -0700
commit0e4d1c3e2cae6474a0b01a79c37b440817cbfa5f (patch)
tree8c26f0e9e22e9eae83b46fabe009f4e2373021ed
parent9d99d52fcb898433d58c861bd942b2caec22c16f (diff)
downloadgo-0e4d1c3e2cae6474a0b01a79c37b440817cbfa5f.tar.gz
go-0e4d1c3e2cae6474a0b01a79c37b440817cbfa5f.zip
godoc: fix ToAbsolute mapping
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
-rw-r--r--src/cmd/godoc/mapping.go29
1 files changed, 14 insertions, 15 deletions
diff --git a/src/cmd/godoc/mapping.go b/src/cmd/godoc/mapping.go
index 51f23ab985..89e531e2f3 100644
--- a/src/cmd/godoc/mapping.go
+++ b/src/cmd/godoc/mapping.go
@@ -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
}