From 96f4d6655761d8717885e259c3ca93015f2226a9 Mon Sep 17 00:00:00 2001 From: Aaron Son Date: Sat, 19 Aug 2023 09:24:35 -0700 Subject: [PATCH] fix: go_repository: never shadow a module with a compatibility mapping for major versions. (#1608) Fixes #1595. Co-authored-by: Fabian Meumertzheim --- repo/remote.go | 23 ++++++++++++++++++----- repo/remote_test.go | 12 ++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/repo/remote.go b/repo/remote.go index 361a3242d..1422d4560 100644 --- a/repo/remote.go +++ b/repo/remote.go @@ -180,15 +180,28 @@ func NewRemoteCache(knownRepos []Repo) (r *RemoteCache, cleanup func() error) { // allowed to use them. However, we'll return the same result nearly all // the time, and simpler is better. for _, repo := range knownRepos { - path := pathWithoutSemver(repo.GoPrefix) - if path == "" || r.root.cache[path] != nil { + newPath := pathWithoutSemver(repo.GoPrefix) + if newPath == "" { continue } - r.root.cache[path] = r.root.cache[repo.GoPrefix] + // Avoid adding the semver-less path for this module if there + // is another known module which already covers this path. + // See https://github.com/bazelbuild/bazel-gazelle/issues/1595. + found := false + for prefix := newPath; prefix != "." && prefix != "/"; prefix = path.Dir(prefix) { + if _, ok := r.root.cache[prefix]; ok { + found = true + break + } + } + if found { + continue + } + r.root.cache[newPath] = r.root.cache[repo.GoPrefix] if e := r.remote.cache[repo.GoPrefix]; e != nil { - r.remote.cache[path] = e + r.remote.cache[newPath] = e } - r.mod.cache[path] = r.mod.cache[repo.GoPrefix] + r.mod.cache[newPath] = r.mod.cache[repo.GoPrefix] } return r, r.cleanup diff --git a/repo/remote_test.go b/repo/remote_test.go index c7ddcaec6..b4149dff6 100644 --- a/repo/remote_test.go +++ b/repo/remote_test.go @@ -288,6 +288,18 @@ func TestMod(t *testing.T) { }}, wantModPath: "example.com/known", wantName: "known", + }, { + desc: "semver_less_path_is_safe", + importPath: "example.com/known/internal/endpoints", + repos: []Repo{{ + Name: "known", + GoPrefix: "example.com/known", + }, { + Name: "known_internal_endpoints_v2", + GoPrefix: "example.com/known/internal/endpoints/v2", + }}, + wantModPath: "example.com/known", + wantName: "known", }, { desc: "lookup", importPath: "example.com/stub/v2/foo",