Commit 440368da authored by Bryan C. Mills's avatar Bryan C. Mills

cmd/go/internal/imports: resolve symlinks in ScanDir

We were using the mode reported by ReadDir to decide whether each
entry is a file, but in the case of symlinks that isn't sufficient: a
symlink could point to either a file or a directory, and if it is a
file we should treat it as such.

Fixes #28107

Change-Id: Icf6e495dce427a7b1124c9cc9f085e40a215c169
Reviewed-on: https://go-review.googlesource.com/c/141097
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
parent 979d9027
...@@ -22,6 +22,16 @@ func ScanDir(dir string, tags map[string]bool) ([]string, []string, error) { ...@@ -22,6 +22,16 @@ func ScanDir(dir string, tags map[string]bool) ([]string, []string, error) {
var files []string var files []string
for _, info := range infos { for _, info := range infos {
name := info.Name() name := info.Name()
// If the directory entry is a symlink, stat it to obtain the info for the
// link target instead of the link itself.
if info.Mode()&os.ModeSymlink != 0 {
info, err = os.Stat(name)
if err != nil {
continue // Ignore broken symlinks.
}
}
if info.Mode().IsRegular() && !strings.HasPrefix(name, "_") && strings.HasSuffix(name, ".go") && MatchFile(name, tags) { if info.Mode().IsRegular() && !strings.HasPrefix(name, "_") && strings.HasSuffix(name, ".go") && MatchFile(name, tags) {
files = append(files, filepath.Join(dir, name)) files = append(files, filepath.Join(dir, name))
} }
......
env GO111MODULE=on
[!symlink] skip
# 'go list' should resolve modules of imported packages.
go list -deps -f '{{.Module}}'
stdout golang.org/x/text
# They should continue to resolve if the importing file is a symlink.
mkdir links
cd links
symlink go.mod -> ../go.mod
symlink issue.go -> ../issue.go
go list -deps -f '{{.Module}}'
stdout golang.org/x/text
-- go.mod --
module golang.org/issue/28107
-- issue.go --
package issue
import _ "golang.org/x/text/language"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment