diff options
author | Jay Conrod <jayconrod@google.com> | 2020-10-15 15:53:09 -0400 |
---|---|---|
committer | Jay Conrod <jayconrod@google.com> | 2020-10-16 14:02:35 +0000 |
commit | 8ee4d6e1bf1e76a4eac627d5fc9b0d0332d209e2 (patch) | |
tree | 97df5c10a152dd0193026c674d22cb4b97603347 /src/cmd/go/internal/modload/import.go | |
parent | e981936855383883edb5fcc85a196c485b15f0f9 (diff) | |
download | go-8ee4d6e1bf1e76a4eac627d5fc9b0d0332d209e2.tar.gz go-8ee4d6e1bf1e76a4eac627d5fc9b0d0332d209e2.zip |
cmd/go/internal/modload: move fetch to import.go
From a comment in CL 262341. It makes more sense in import.go than in
mvs.go.
Change-Id: If4dfa1091077e110c5041bc849d99bc0be2bd8e2
Reviewed-on: https://go-review.googlesource.com/c/go/+/262780
Trust: Jay Conrod <jayconrod@google.com>
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Diffstat (limited to 'src/cmd/go/internal/modload/import.go')
-rw-r--r-- | src/cmd/go/internal/modload/import.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 76fe6745d9..8641cfec08 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -451,3 +451,42 @@ func dirInModule(path, mpath, mdir string, isLocal bool) (dir string, haveGoFile return dir, res.haveGoFiles, res.err } + +// fetch downloads the given module (or its replacement) +// and returns its location. +// +// The isLocal return value reports whether the replacement, +// if any, is local to the filesystem. +func fetch(ctx context.Context, mod module.Version) (dir string, isLocal bool, err error) { + if mod == Target { + return ModRoot(), true, nil + } + if r := Replacement(mod); r.Path != "" { + if r.Version == "" { + dir = r.Path + if !filepath.IsAbs(dir) { + dir = filepath.Join(ModRoot(), dir) + } + // Ensure that the replacement directory actually exists: + // dirInModule does not report errors for missing modules, + // so if we don't report the error now, later failures will be + // very mysterious. + if _, err := os.Stat(dir); err != nil { + if os.IsNotExist(err) { + // Semantically the module version itself “exists” — we just don't + // have its source code. Remove the equivalence to os.ErrNotExist, + // and make the message more concise while we're at it. + err = fmt.Errorf("replacement directory %s does not exist", r.Path) + } else { + err = fmt.Errorf("replacement directory %s: %w", r.Path, err) + } + return dir, true, module.VersionError(mod, err) + } + return dir, true, nil + } + mod = r + } + + dir, err = modfetch.Download(ctx, mod) + return dir, false, err +} |