diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index ef93c25121..53cb6c2ffe 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -21,6 +21,7 @@ import ( "cmd/go/internal/modfetch/codehost" "cmd/go/internal/modinfo" "cmd/go/internal/search" + "cmd/internal/par" "cmd/internal/pkgpattern" "golang.org/x/mod/module" @@ -273,19 +274,29 @@ func listModules(ctx context.Context, rs *Requirements, args []string, mode List continue } - matched := false + var matches []module.Version for _, m := range mg.BuildList() { if match(m.Path) { - matched = true if !matchedModule[m] { matchedModule[m] = true - mods = append(mods, moduleInfo(ctx, rs, m, mode, reuse)) + matches = append(matches, m) } } } - if !matched { + + if len(matches) == 0 { fmt.Fprintf(os.Stderr, "warning: pattern %q matched no module dependencies\n", arg) } + + q := par.NewQueue(runtime.GOMAXPROCS(0)) + fetchedMods := make([]*modinfo.ModulePublic, len(matches)) + for i, m := range matches { + q.Add(func() { + fetchedMods[i] = moduleInfo(ctx, rs, m, mode, reuse) + }) + } + <-q.Idle() + mods = append(mods, fetchedMods...) } return rs, mods, mgErr