diff options
author | Russ Cox <rsc@golang.org> | 2018-08-10 13:26:32 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2018-08-17 19:21:57 +0000 |
commit | d46587c4eaaf64a7e9cb0797fcfa238f5138b170 (patch) | |
tree | 44babdf5839a0f951a2909235b55251785933557 /src/cmd/go/internal/get/get.go | |
parent | 08d10f9af1429d19633722e36f7bfeda6c000aa5 (diff) | |
download | go-d46587c4eaaf64a7e9cb0797fcfa238f5138b170.tar.gz go-d46587c4eaaf64a7e9cb0797fcfa238f5138b170.zip |
cmd/go: distinguish patterns from the results of matching them
To date the go command has always just treated the command line
package patterns as a []string, expanded by pattern matching into
another []string. As a result, the code is not always clear about
whether a particular []string contains patterns or results.
A few different important bugs are caused by not keeping
this distinction clear enough. This CL sets us up well for fixing those,
by introducing an explicit search.Match struct holding the
results of matching a single pattern.
The added clarity here also makes it clear how to avoid duplicate
warnings about unmatched packages.
Fixes #26925. (Test in followup CL.)
Change-Id: Ic2f0606f7ab8b3734a40e22d3cb1e6f58d031061
Reviewed-on: https://go-review.googlesource.com/129058
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Alan Donovan <adonovan@google.com>
Diffstat (limited to 'src/cmd/go/internal/get/get.go')
-rw-r--r-- | src/cmd/go/internal/get/get.go | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index fd97c6dcb6..47953f09a4 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -163,9 +163,8 @@ func runGet(cmd *base.Command, args []string) { if *getT { mode |= load.GetTestDeps } - args = downloadPaths(args) - for _, arg := range args { - download(arg, nil, &stk, mode) + for _, pkg := range downloadPaths(args) { + download(pkg, nil, &stk, mode) } base.ExitIfErrors() @@ -184,8 +183,7 @@ func runGet(cmd *base.Command, args []string) { // This leads to duplicated loads of the standard packages. load.ClearCmdCache() - args = load.ImportPaths(args) - load.PackagesForBuild(args) + pkgs := load.PackagesForBuild(args) // Phase 3. Install. if *getD { @@ -195,7 +193,7 @@ func runGet(cmd *base.Command, args []string) { return } - work.InstallPackages(args) + work.InstallPackages(args, pkgs) } // downloadPaths prepares the list of paths to pass to download. @@ -203,34 +201,21 @@ func runGet(cmd *base.Command, args []string) { // for a particular pattern, downloadPaths leaves it in the result list, // in the hope that we can figure out the repository from the // initial ...-free prefix. -func downloadPaths(args []string) []string { - for _, arg := range args { +func downloadPaths(patterns []string) []string { + for _, arg := range patterns { if strings.Contains(arg, "@") { base.Fatalf("go: cannot use path@version syntax in GOPATH mode") } } - - args = load.ImportPathsForGoGet(args) - var out []string - for _, a := range args { - if strings.Contains(a, "...") { - var expand []string - // Use matchPackagesInFS to avoid printing - // warnings. They will be printed by the - // eventual call to importPaths instead. - if build.IsLocalImport(a) { - expand = search.MatchPackagesInFS(a) - } else { - expand = search.MatchPackages(a) - } - if len(expand) > 0 { - out = append(out, expand...) - continue - } + var pkgs []string + for _, m := range search.ImportPathsQuiet(patterns) { + if len(m.Pkgs) == 0 && strings.Contains(m.Pattern, "...") { + pkgs = append(pkgs, m.Pattern) + } else { + pkgs = append(pkgs, m.Pkgs...) } - out = append(out, a) } - return out + return pkgs } // downloadCache records the import paths we have already @@ -311,9 +296,9 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) // for p has been replaced in the package cache. if wildcardOkay && strings.Contains(arg, "...") { if build.IsLocalImport(arg) { - args = search.MatchPackagesInFS(arg) + args = search.MatchPackagesInFS(arg).Pkgs } else { - args = search.MatchPackages(arg) + args = search.MatchPackages(arg).Pkgs } isWildcard = true } |