]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: don't compute Deps fields if they're not needed
authorMichael Matloob <matloob@golang.org>
Mon, 14 Mar 2022 17:00:03 +0000 (13:00 -0400)
committerGopher Robot <gobot@golang.org>
Wed, 20 Apr 2022 20:25:02 +0000 (20:25 +0000)
If the user provides the -json flag to explicitly specify fields, but
doesn't specify the Deps or DepsErrors fields, skip computing the deps
fields.

For #29666

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

src/cmd/go/internal/list/list.go
src/cmd/go/internal/load/pkg.go
src/cmd/go/testdata/script/list_json_fields.txt

index 17864e1da71db6e090ed394b2fa92e8d4aef979b..e9e0910f32a50dccecf269e8412920285bfbee7d 100644 (file)
@@ -568,6 +568,13 @@ func runList(ctx context.Context, cmd *base.Command, args []string) {
                IgnoreImports:   *listFind,
                ModResolveTests: *listTest,
                LoadVCS:         true,
+               // SuppressDeps is set if the user opts to explicitly ask for the json fields they
+               // need, don't ask for Deps or DepsErrors. It's not set when using a template string,
+               // even if *listFmt doesn't contain .Deps because Deps are used to find import cycles
+               // for test variants of packages and users who have been providing format strings
+               // might not expect those errors to stop showing up.
+               // See issue #52443.
+               SuppressDeps: !listJsonFields.needAny("Deps", "DepsErrors"),
        }
        pkgs := load.PackagesAndErrors(ctx, pkgOpts, args)
        if !*listE {
index e43117f3d36250f51c3a192902e007ddf258db63..51bf7176d119956b392ce546411e22bce5647c20 100644 (file)
@@ -1938,7 +1938,9 @@ func (p *Package) load(ctx context.Context, opts PackageOpts, path string, stk *
                }
        }
        p.Internal.Imports = imports
-       p.collectDeps()
+       if !opts.SuppressDeps {
+               p.collectDeps()
+       }
        if p.Error == nil && p.Name == "main" && !p.Internal.ForceLibrary && len(p.DepsErrors) == 0 {
                // TODO(bcmills): loading VCS metadata can be fairly slow.
                // Consider starting this as a background goroutine and retrieving the result
@@ -2679,6 +2681,12 @@ type PackageOpts struct {
 
        // LoadVCS controls whether we also load version-control metadata for main packages.
        LoadVCS bool
+
+       // NeedDepsFields is true if the caller does not need Deps and DepsErrors to be populated
+       // on the package. TestPackagesAndErrors examines the  Deps field to determine if the test
+       // variant has an import cycle, so SuppressDeps should not be set if TestPackagesAndErrors
+       // will be called on the package.
+       SuppressDeps bool
 }
 
 // PackagesAndErrors returns the packages named by the command line arguments
index 58c9efa162b4dda54b715a07fb35afc018deaf54..9b8edc6d7f6029e8297eb315c732cdb9337b3ba8 100644 (file)
@@ -21,6 +21,11 @@ cmp stdout want-json-name.txt
 go list -json=ImportPath,Name,GoFiles,Imports
 cmp stdout want-json-multiple.txt
 
+# Test -json=<field> with Deps outputs the Deps field.
+go list -json=Deps
+stdout '"Deps": \['
+stdout '"errors",'
+
 -- go.mod --
 module example.com/a