mirror of https://github.com/golang/go.git
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: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
979d9027ae
commit
440368da52
|
|
@ -22,6 +22,16 @@ func ScanDir(dir string, tags map[string]bool) ([]string, []string, error) {
|
|||
var files []string
|
||||
for _, info := range infos {
|
||||
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) {
|
||||
files = append(files, filepath.Join(dir, name))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
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"
|
||||
Loading…
Reference in New Issue