]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/go: evaluate root symlink in matchPackages
authorMichael Matloob <matloob@golang.org>
Fri, 21 Jan 2022 21:05:02 +0000 (16:05 -0500)
committerMichael Matloob <matloob@golang.org>
Fri, 21 Jan 2022 21:58:14 +0000 (21:58 +0000)
This fixes checks for crossing module boundaries when the root of
the module is a symlink. We're comparing paths by string, so we need
to follow the symlink to get the proper path to compare.

Change-Id: Idf5f0dd5c49bcae5fffb5372e99a7fab89169a9d
Reviewed-on: https://go-review.googlesource.com/c/go/+/380057
Trust: Michael Matloob <matloob@golang.org>
Run-TryBot: Michael Matloob <matloob@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/go/internal/modload/search.go
src/cmd/go/testdata/script/work_root_is_symlink.txt [new file with mode: 0644]

index 799c48e50a8caca851b197c1ee584411bf2ad55c..771968d02348965a75a4d89378864f576f7e3f78 100644 (file)
@@ -54,6 +54,11 @@ func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, f
        )
 
        walkPkgs := func(root, importPathRoot string, prune pruning) {
+               // Follow root if it's a symlink so path == root comparisons don't
+               // spuriously fail when root is a symlink and it points to path.
+               if r, err := filepath.EvalSymlinks(root); err == nil {
+                       root = r
+               }
                root = filepath.Clean(root)
                err := fsys.Walk(root, func(path string, fi fs.FileInfo, err error) error {
                        if err != nil {
diff --git a/src/cmd/go/testdata/script/work_root_is_symlink.txt b/src/cmd/go/testdata/script/work_root_is_symlink.txt
new file mode 100644 (file)
index 0000000..a1c0b46
--- /dev/null
@@ -0,0 +1,20 @@
+# Test that cmd/go follows the symlink and properly determines
+# the module boundary when the working directory is a symlink.
+
+[!symlink] skip
+
+symlink worksym -> workspace
+cd worksym
+go list all
+stdout example.com/workspace
+
+-- workspace/go.work --
+go 1.18
+
+use .
+-- workspace/go.mod --
+module example.com/workspace
+
+go  1.18
+-- workspace/pkg.go --
+package workspace
\ No newline at end of file