From 2ceb79db526eabff880a8a03caab07258883b216 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 22 Feb 2021 17:05:32 -0500 Subject: [PATCH] cmd/go/internal/modload: make EditBuildList report whether the build list was changed For #36460 Change-Id: I8dd6e6f998a217a4287212815ce61209df6f007f Reviewed-on: https://go-review.googlesource.com/c/go/+/296609 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob --- src/cmd/go/internal/modget/get.go | 11 +++++------ src/cmd/go/internal/modload/buildlist.go | 17 +++++++++++------ src/cmd/go/internal/work/build.go | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 9340a582e5..6b416d3622 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -30,7 +30,6 @@ import ( "fmt" "os" "path/filepath" - "reflect" "runtime" "sort" "strings" @@ -1635,7 +1634,8 @@ func (r *resolver) updateBuildList(ctx context.Context, additions []module.Versi } } - if err := modload.EditBuildList(ctx, additions, resolved); err != nil { + changed, err := modload.EditBuildList(ctx, additions, resolved) + if err != nil { var constraint *modload.ConstraintError if !errors.As(err, &constraint) { base.Errorf("go get: %v", err) @@ -1654,12 +1654,11 @@ func (r *resolver) updateBuildList(ctx context.Context, additions []module.Versi } return false } - - buildList := modload.LoadAllModules(ctx) - if reflect.DeepEqual(r.buildList, buildList) { + if !changed { return false } - r.buildList = buildList + + r.buildList = modload.LoadAllModules(ctx) r.buildListVersion = make(map[string]string, len(r.buildList)) for _, m := range r.buildList { r.buildListVersion[m.Path] = m.Version diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go index 5de26357e1..3412548efc 100644 --- a/src/cmd/go/internal/modload/buildlist.go +++ b/src/cmd/go/internal/modload/buildlist.go @@ -12,6 +12,7 @@ import ( "context" "fmt" "os" + "reflect" "strings" "golang.org/x/mod/module" @@ -81,12 +82,12 @@ func Selected(path string) (version string) { // If the versions listed in mustSelect are mutually incompatible (due to one of // the listed modules requiring a higher version of another), EditBuildList // returns a *ConstraintError and leaves the build list in its previous state. -func EditBuildList(ctx context.Context, add, mustSelect []module.Version) error { +func EditBuildList(ctx context.Context, add, mustSelect []module.Version) (changed bool, err error) { LoadModFile(ctx) final, err := editBuildList(ctx, buildList, add, mustSelect) if err != nil { - return err + return false, err } selected := make(map[string]module.Version, len(final)) @@ -106,14 +107,18 @@ func EditBuildList(ctx context.Context, add, mustSelect []module.Version) error } if !inconsistent { - buildList = final additionalExplicitRequirements = make([]string, 0, len(mustSelect)) for _, m := range mustSelect { if m.Version != "none" { additionalExplicitRequirements = append(additionalExplicitRequirements, m.Path) } } - return nil + changed := false + if !reflect.DeepEqual(buildList, final) { + buildList = final + changed = true + } + return changed, nil } // We overshot one or more of the modules in mustSelect, which means that @@ -136,7 +141,7 @@ func EditBuildList(ctx context.Context, add, mustSelect []module.Version) error m, queue = queue[0], queue[1:] required, err := reqs.Required(m) if err != nil { - return err + return false, err } for _, r := range required { if _, ok := reason[r]; !ok { @@ -164,7 +169,7 @@ func EditBuildList(ctx context.Context, add, mustSelect []module.Version) error } } - return &ConstraintError{ + return false, &ConstraintError{ Conflicts: conflicts, } } diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 0e7af6d33f..a80eb27798 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -836,7 +836,7 @@ func installOutsideModule(ctx context.Context, args []string) { // Since we are in NoRoot mode, the build list initially contains only // the dummy command-line-arguments module. Add a requirement on the // module that provides the packages named on the command line. - if err := modload.EditBuildList(ctx, nil, []module.Version{installMod}); err != nil { + if _, err := modload.EditBuildList(ctx, nil, []module.Version{installMod}); err != nil { base.Fatalf("go install %s: %v", args[0], err) } -- 2.48.1