diff options
author | Robert Griesemer <gri@golang.org> | 2011-10-18 10:28:30 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2011-10-18 10:28:30 -0700 |
commit | 0e4d1c3e2cae6474a0b01a79c37b440817cbfa5f (patch) | |
tree | 8c26f0e9e22e9eae83b46fabe009f4e2373021ed | |
parent | 9d99d52fcb898433d58c861bd942b2caec22c16f (diff) | |
download | go-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.go | 29 |
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 } |