From 30119bcca997d154e4ab200b01afa7007b088994 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 16 Oct 2020 21:57:46 -0400 Subject: [PATCH] cmd/go/internal/modload: fix sort condition in (*replacementRepo).Versions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In CL 258220 I added replacement versions to the repo versions used in the modload.Query functions. The versions are computed from a map in the modfile index, which has a nondeterministic iteration order. I added a short-circuit condition to skip sorting in the (vastly common) case where no replacement versions are added. However, while cleaning up the change I accidentally deleted the line of code that sets that condition. As a result, the test of that functionality (mod_get_replaced) has been failing nondeterministically. This change fixes the condition by comparing the slices before and after adding versions, rather than by setting a separate variable. The test now passes reliably (tested with -count=200). Updates #41577 Updates #41416 Updates #37438 Updates #26241 Change-Id: I49a66a3a5510da00ef42b47f20a168de66100db6 Reviewed-on: https://go-review.googlesource.com/c/go/+/263266 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Daniel Martí --- src/cmd/go/internal/modload/query.go | 6 +++--- src/cmd/go/testdata/script/mod_get_replaced.txt | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index d16a247f72..3b27e66d01 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -891,12 +891,12 @@ func (rr *replacementRepo) ModulePath() string { return rr.repo.ModulePath() } // Versions returns the versions from rr.repo augmented with any matching // replacement versions. func (rr *replacementRepo) Versions(prefix string) ([]string, error) { - versions, err := rr.repo.Versions(prefix) + repoVersions, err := rr.repo.Versions(prefix) if err != nil && !errors.Is(err, os.ErrNotExist) { return nil, err } - added := false + versions := repoVersions if index != nil && len(index.replace) > 0 { path := rr.ModulePath() for m, _ := range index.replace { @@ -906,7 +906,7 @@ func (rr *replacementRepo) Versions(prefix string) ([]string, error) { } } - if !added { + if len(versions) == len(repoVersions) { // No replacement versions added. return versions, nil } diff --git a/src/cmd/go/testdata/script/mod_get_replaced.txt b/src/cmd/go/testdata/script/mod_get_replaced.txt index 0b82eb7f4f..2e2dc51ca7 100644 --- a/src/cmd/go/testdata/script/mod_get_replaced.txt +++ b/src/cmd/go/testdata/script/mod_get_replaced.txt @@ -19,7 +19,7 @@ go get -d example.com/x go list -m example.com/x stdout '^example.com/x v0.2.0 ' -go get -d example.com/x@'v1.3.1' +go get -d rsc.io/quote@>v1.3.1 go list -m rsc.io/quote stdout '^rsc.io/quote v1.4.0' -- 2.48.1