diff --git a/godoc/vfs/zipfs/zipfs.go b/godoc/vfs/zipfs/zipfs.go index b216f558..d3ef88a3 100644 --- a/godoc/vfs/zipfs/zipfs.go +++ b/godoc/vfs/zipfs/zipfs.go @@ -86,7 +86,7 @@ func (fs *zipFS) String() string { func (fs *zipFS) RootType(abspath string) vfs.RootType { var t vfs.RootType switch { - case abspath == vfs.GOROOT: + case exists(path.Join(vfs.GOROOT, abspath)): t = vfs.RootTypeGoRoot case isGoPath(abspath): t = vfs.RootTypeGoPath @@ -94,15 +94,20 @@ func (fs *zipFS) RootType(abspath string) vfs.RootType { return t } -func isGoPath(path string) bool { +func isGoPath(abspath string) bool { for _, p := range filepath.SplitList(build.Default.GOPATH) { - if p == path { + if exists(path.Join(p, abspath)) { return true } } return false } +func exists(path string) bool { + _, err := os.Stat(path) + return err == nil +} + func (fs *zipFS) Close() error { fs.list = nil return fs.ReadCloser.Close() diff --git a/godoc/vfs/zipfs/zipfs_test.go b/godoc/vfs/zipfs/zipfs_test.go index 19407e48..2c52a60c 100644 --- a/godoc/vfs/zipfs/zipfs_test.go +++ b/godoc/vfs/zipfs/zipfs_test.go @@ -187,3 +187,20 @@ func TestZipFSOpenSeek(t *testing.T) { } } } + +func TestRootType(t *testing.T) { + tests := []struct { + path string + fsType vfs.RootType + }{ + {"/src/net/http", vfs.RootTypeGoRoot}, + {"/src/badpath", ""}, + {"/", vfs.RootTypeGoRoot}, + } + + for _, item := range tests { + if fs.RootType(item.path) != item.fsType { + t.Errorf("unexpected fsType. Expected- %v, Got- %v", item.fsType, fs.RootType(item.path)) + } + } +}