diff options
author | Bryan C. Mills <bcmills@google.com> | 2020-05-06 16:22:15 -0400 |
---|---|---|
committer | Bryan C. Mills <bcmills@google.com> | 2020-05-13 18:51:10 +0000 |
commit | 14bec27743365511495eadb2accf76efaccbc525 (patch) | |
tree | 5af6e61b7e5e5633750688e6869b16aeff19ff1f /src/cmd/go/internal/modload/query.go | |
parent | b819adfe6d3bb53b1c863d5c5a8b64b89698d9f7 (diff) | |
download | go-14bec27743365511495eadb2accf76efaccbc525.tar.gz go-14bec27743365511495eadb2accf76efaccbc525.zip |
cmd/go: do not ignore permission errors when matching patterns
While reviewing CL 228784, I noticed that various filepath.WalkFunc
implementations within cmd/go were dropping non-nil errors.
Those errors turn out to be significant, at least in some cases: for
example, they can cause packages to appear to be missing when any
parent of the directory had the wrong permissions set.
(This also turned up a bug in the existing list_dedup_packages test,
which was accidentally passing a nonexistent directory instead of the
intended duplicate path.)
Change-Id: Ia09a0a33aa7a966d9f132d3747d6c674a5370b2d
Reviewed-on: https://go-review.googlesource.com/c/go/+/232579
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Diffstat (limited to 'src/cmd/go/internal/modload/query.go')
-rw-r--r-- | src/cmd/go/internal/modload/query.go | 51 |
1 files changed, 35 insertions, 16 deletions
diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 5e9cfdcfe3..acc886bf21 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -403,30 +403,42 @@ func QueryPackage(path, query string, allowed func(module.Version) bool) ([]Quer // possible modules. func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { base := pattern - var match func(m module.Version, root string, isLocal bool) (pkgs []string) + + firstError := func(m *search.Match) error { + if len(m.Errs) == 0 { + return nil + } + return m.Errs[0] + } + + var match func(mod module.Version, root string, isLocal bool) *search.Match if i := strings.Index(pattern, "..."); i >= 0 { base = pathpkg.Dir(pattern[:i+3]) - match = func(m module.Version, root string, isLocal bool) []string { - return matchPackages(pattern, imports.AnyTags(), false, []module.Version{m}) + match = func(mod module.Version, root string, isLocal bool) *search.Match { + m := search.NewMatch(pattern) + matchPackages(m, imports.AnyTags(), omitStd, []module.Version{mod}) + return m } } else { - match = func(m module.Version, root string, isLocal bool) []string { - prefix := m.Path - if m == Target { + match = func(mod module.Version, root string, isLocal bool) *search.Match { + m := search.NewMatch(pattern) + prefix := mod.Path + if mod == Target { prefix = targetPrefix } - if _, ok := dirInModule(pattern, prefix, root, isLocal); ok { - return []string{pattern} - } else { - return nil + if _, ok, err := dirInModule(pattern, prefix, root, isLocal); err != nil { + m.AddError(err) + } else if ok { + m.Pkgs = []string{pattern} } + return m } } if HasModRoot() { - pkgs := match(Target, modRoot, true) - if len(pkgs) > 0 { + m := match(Target, modRoot, true) + if len(m.Pkgs) > 0 { if query != "latest" { return nil, fmt.Errorf("can't query specific version for package %s in the main module (%s)", pattern, Target.Path) } @@ -436,9 +448,12 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q return []QueryResult{{ Mod: Target, Rev: &modfetch.RevInfo{Version: Target.Version}, - Packages: pkgs, + Packages: m.Pkgs, }}, nil } + if err := firstError(m); err != nil { + return nil, err + } } var ( @@ -466,8 +481,12 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q if err != nil { return r, err } - r.Packages = match(r.Mod, root, isLocal) + m := match(r.Mod, root, isLocal) + r.Packages = m.Pkgs if len(r.Packages) == 0 { + if err := firstError(m); err != nil { + return r, err + } return r, &PackageNotInModuleError{ Mod: r.Mod, Replacement: Replacement(r.Mod), @@ -684,8 +703,8 @@ func ModuleHasRootPackage(m module.Version) (bool, error) { if err != nil { return false, err } - _, ok := dirInModule(m.Path, m.Path, root, isLocal) - return ok, nil + _, ok, err := dirInModule(m.Path, m.Path, root, isLocal) + return ok, err } func versionHasGoMod(m module.Version) (bool, error) { |