From ae8529dc1617e5bdf52ad634399d6411d4b31324 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Fri, 28 Sep 2018 16:03:36 +0530 Subject: [PATCH] godoc/vfs/zipfs: join paths to get correct RootType The logic was incorrectly written from vfs/os.go. zipfs filesystem passes actual paths during dirTree building. So we need to join the paths to determine whether they are under GOROOT or GOPATH. Updates golang/go#27205 Change-Id: Ic4330fce02c6ebfc44ae21122e2412c33f0cd45a Reviewed-on: https://go-review.googlesource.com/138435 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- godoc/vfs/zipfs/zipfs.go | 11 ++++++++--- godoc/vfs/zipfs/zipfs_test.go | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) 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)) + } + } +}