aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/go/internal/modload/import.go
diff options
context:
space:
mode:
authorJay Conrod <jayconrod@google.com>2020-10-15 15:53:09 -0400
committerJay Conrod <jayconrod@google.com>2020-10-16 14:02:35 +0000
commit8ee4d6e1bf1e76a4eac627d5fc9b0d0332d209e2 (patch)
tree97df5c10a152dd0193026c674d22cb4b97603347 /src/cmd/go/internal/modload/import.go
parente981936855383883edb5fcc85a196c485b15f0f9 (diff)
downloadgo-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.go39
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
+}