cmd/go/internal/modget: move vgo.CmdGet implementation to modget.CmdGet

There are no semantic changes here.
The only diffs in the copied code are adjustments to refer
back to (sometimes newly exported) identifiers left behind
in package vgo.

Change-Id: I65cbbb70e2e8d280bc7899d6009865e7aca1dde7
Reviewed-on: https://go-review.googlesource.com/122262
Reviewed-by: Bryan C. Mills <bcmills@google.com>
diff --git a/vendor/cmd/go/internal/modget/get.go b/vendor/cmd/go/internal/modget/get.go
index 17ffdcf..e6756c3 100644
--- a/vendor/cmd/go/internal/modget/get.go
+++ b/vendor/cmd/go/internal/modget/get.go
@@ -8,7 +8,14 @@
 import (
 	"cmd/go/internal/base"
 	"cmd/go/internal/get"
+	"cmd/go/internal/load"
+	"cmd/go/internal/modfetch"
+	"cmd/go/internal/module"
+	"cmd/go/internal/mvs"
+	"cmd/go/internal/semver"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/work"
+	"strings"
 )
 
 var CmdGet = &base.Command{
@@ -139,8 +146,9 @@
 	getFix = CmdGet.Flag.Bool("fix", false, "")
 	getM   = CmdGet.Flag.Bool("m", false, "")
 	getT   = CmdGet.Flag.Bool("t", false, "")
-	getU   = CmdGet.Flag.Bool("u", false, "")
+
 	// -insecure is get.Insecure
+	// -u is vgo.GetU
 	// -v is cfg.BuildV
 )
 
@@ -148,10 +156,131 @@
 	work.AddBuildFlags(CmdGet)
 	CmdGet.Run = runGet // break init loop
 	CmdGet.Flag.BoolVar(&get.Insecure, "insecure", get.Insecure, "")
+	CmdGet.Flag.BoolVar(&vgo.GetU, "u", vgo.GetU, "")
 }
 
 func runGet(cmd *base.Command, args []string) {
-	// OK because the command is also unregistered.
-	// For now we're still running vgo.CmdGet.
-	panic("unimplemented")
+	if vgo.GetU && len(args) > 0 {
+		base.Fatalf("vgo get: -u not supported with argument list")
+	}
+	if !vgo.GetU && len(args) == 0 {
+		base.Fatalf("vgo get: need arguments or -u")
+	}
+
+	if vgo.GetU {
+		vgo.LoadBuildList()
+		return
+	}
+
+	vgo.Init()
+	vgo.InitMod()
+	var upgrade []module.Version
+	var downgrade []module.Version
+	var newPkgs []string
+	for _, pkg := range args {
+		var path, vers string
+		/* OLD CODE
+		if n := strings.Count(pkg, "(") + strings.Count(pkg, ")"); n > 0 {
+			i := strings.Index(pkg, "(")
+			j := strings.Index(pkg, ")")
+			if n != 2 || i < 0 || j <= i+1 || j != len(pkg)-1 && pkg[j+1] != '/' {
+				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
+				continue
+			}
+			path, vers = pkg[:i], pkg[i+1:j]
+			pkg = pkg[:i] + pkg[j+1:]
+		*/
+		if i := strings.Index(pkg, "@"); i >= 0 {
+			path, pkg, vers = pkg[:i], pkg[:i], pkg[i+1:]
+			if strings.Contains(vers, "@") {
+				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
+				continue
+			}
+		} else {
+			path = pkg
+			vers = "latest"
+		}
+		if vers == "none" {
+			downgrade = append(downgrade, module.Version{Path: path, Version: ""})
+		} else {
+			info, err := modfetch.Query(path, vers, vgo.Allowed)
+			if err != nil {
+				base.Errorf("vgo get %v: %v", pkg, err)
+				continue
+			}
+			upgrade = append(upgrade, module.Version{Path: path, Version: info.Version})
+			newPkgs = append(newPkgs, pkg)
+		}
+	}
+	args = newPkgs
+
+	// Upgrade.
+	var err error
+	list, err := mvs.Upgrade(vgo.Target, vgo.Reqs(), upgrade...)
+	if err != nil {
+		base.Fatalf("vgo get: %v", err)
+	}
+	vgo.SetBuildList(list)
+
+	vgo.LoadBuildList()
+
+	// Downgrade anything that went too far.
+	version := make(map[string]string)
+	for _, mod := range vgo.BuildList() {
+		version[mod.Path] = mod.Version
+	}
+	for _, mod := range upgrade {
+		if semver.Compare(mod.Version, version[mod.Path]) < 0 {
+			downgrade = append(downgrade, mod)
+		}
+	}
+
+	if len(downgrade) > 0 {
+		list, err := mvs.Downgrade(vgo.Target, vgo.Reqs(), downgrade...)
+		if err != nil {
+			base.Fatalf("vgo get: %v", err)
+		}
+		vgo.SetBuildList(list)
+
+		// TODO: Check that everything we need to import is still available.
+		/*
+			local := v.matchPackages("all", v.Reqs[:1])
+			for _, path := range local {
+				dir, err := v.importDir(path)
+				if err != nil {
+					return err // TODO
+				}
+				imports, testImports, err := scanDir(dir, v.Tags)
+				for _, path := range imports {
+					xxx
+				}
+				for _, path := range testImports {
+					xxx
+				}
+			}
+		*/
+	}
+	vgo.WriteGoMod()
+
+	if *getD {
+		// Download all needed code as side-effect.
+		vgo.LoadALL()
+	}
+
+	if *getM {
+		return
+	}
+
+	if len(args) > 0 {
+		work.BuildInit()
+		var list []string
+		for _, p := range load.PackagesAndErrors(args) {
+			if p.Error == nil || !strings.HasPrefix(p.Error.Err, "no Go files") {
+				list = append(list, p.ImportPath)
+			}
+		}
+		if len(list) > 0 {
+			work.InstallPackages(list)
+		}
+	}
 }
diff --git a/vendor/cmd/go/internal/vgo/build.go b/vendor/cmd/go/internal/vgo/build.go
index ce06ee2..efee74b 100644
--- a/vendor/cmd/go/internal/vgo/build.go
+++ b/vendor/cmd/go/internal/vgo/build.go
@@ -70,7 +70,7 @@
 // addUpdate fills in m.Update if an updated version is available.
 func addUpdate(m *modinfo.ModulePublic) {
 	if m.Version != "" {
-		if info, err := modfetch.Query(m.Path, "latest", allowed); err == nil && info.Version != m.Version {
+		if info, err := modfetch.Query(m.Path, "latest", Allowed); err == nil && info.Version != m.Version {
 			m.Update = &modinfo.ModulePublic{
 				Path:    m.Path,
 				Version: info.Version,
diff --git a/vendor/cmd/go/internal/vgo/get.go b/vendor/cmd/go/internal/vgo/get.go
deleted file mode 100644
index fcc76d4..0000000
--- a/vendor/cmd/go/internal/vgo/get.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2018 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package vgo
-
-import (
-	"strings"
-
-	"cmd/go/internal/base"
-	"cmd/go/internal/load"
-	"cmd/go/internal/modfetch"
-	"cmd/go/internal/module"
-	"cmd/go/internal/mvs"
-	"cmd/go/internal/semver"
-	"cmd/go/internal/work"
-)
-
-var CmdGet = &base.Command{
-	UsageLine: "get [build flags] [modules or packages]",
-	Short:     "download and install versioned modules and dependencies",
-	Long: `
-Get downloads the latest versions of modules containing the named packages,
-along with the versions of the dependencies required by those modules
-(not necessarily the latest ones).
-
-It then installs the named packages, like 'go install'.
-
-By default, get downloads the named packages, updates go.mod, and builds the packages.
-As a special case if a package is a module root and has no code, no error is reported.
-
-TODO make this better
-
-The -m flag causes get to update the module file but not build anything.
-
-The -d flag causes get to download the code and update the module file but not build anything.
-
-The -u flag causes get to download the latest version of dependencies as well.
-
-Each package being updated can be suffixed with @version to specify
-the desired version. Specifying a version older than the one currently
-in use causes a downgrade, which may in turn downgrade other
-modules using that one, to keep everything consistent.
-
-TODO: Make this documentation better once the semantic dust settles.
-	`,
-}
-
-var (
-	getD = CmdGet.Flag.Bool("d", false, "")
-	getM = CmdGet.Flag.Bool("m", false, "")
-	getU = CmdGet.Flag.Bool("u", false, "")
-)
-
-func init() {
-	CmdGet.Run = runGet // break init loop
-	work.AddBuildFlags(CmdGet)
-}
-
-func runGet(cmd *base.Command, args []string) {
-	if *getU && len(args) > 0 {
-		base.Fatalf("vgo get: -u not supported with argument list")
-	}
-	if !*getU && len(args) == 0 {
-		base.Fatalf("vgo get: need arguments or -u")
-	}
-
-	if *getU {
-		LoadBuildList()
-		return
-	}
-
-	Init()
-	InitMod()
-	var upgrade []module.Version
-	var downgrade []module.Version
-	var newPkgs []string
-	for _, pkg := range args {
-		var path, vers string
-		/* OLD CODE
-		if n := strings.Count(pkg, "(") + strings.Count(pkg, ")"); n > 0 {
-			i := strings.Index(pkg, "(")
-			j := strings.Index(pkg, ")")
-			if n != 2 || i < 0 || j <= i+1 || j != len(pkg)-1 && pkg[j+1] != '/' {
-				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
-				continue
-			}
-			path, vers = pkg[:i], pkg[i+1:j]
-			pkg = pkg[:i] + pkg[j+1:]
-		*/
-		if i := strings.Index(pkg, "@"); i >= 0 {
-			path, pkg, vers = pkg[:i], pkg[:i], pkg[i+1:]
-			if strings.Contains(vers, "@") {
-				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
-				continue
-			}
-		} else {
-			path = pkg
-			vers = "latest"
-		}
-		if vers == "none" {
-			downgrade = append(downgrade, module.Version{Path: path, Version: ""})
-		} else {
-			info, err := modfetch.Query(path, vers, allowed)
-			if err != nil {
-				base.Errorf("vgo get %v: %v", pkg, err)
-				continue
-			}
-			upgrade = append(upgrade, module.Version{Path: path, Version: info.Version})
-			newPkgs = append(newPkgs, pkg)
-		}
-	}
-	args = newPkgs
-
-	// Upgrade.
-	var err error
-	buildList, err = mvs.Upgrade(Target, newReqs(buildList), upgrade...)
-	if err != nil {
-		base.Fatalf("vgo get: %v", err)
-	}
-
-	LoadBuildList()
-
-	// Downgrade anything that went too far.
-	version := make(map[string]string)
-	for _, mod := range buildList {
-		version[mod.Path] = mod.Version
-	}
-	for _, mod := range upgrade {
-		if semver.Compare(mod.Version, version[mod.Path]) < 0 {
-			downgrade = append(downgrade, mod)
-		}
-	}
-
-	if len(downgrade) > 0 {
-		buildList, err = mvs.Downgrade(Target, newReqs(buildList, buildList[1:]...), downgrade...)
-		if err != nil {
-			base.Fatalf("vgo get: %v", err)
-		}
-
-		// TODO: Check that everything we need to import is still available.
-		/*
-			local := v.matchPackages("all", v.Reqs[:1])
-			for _, path := range local {
-				dir, err := v.importDir(path)
-				if err != nil {
-					return err // TODO
-				}
-				imports, testImports, err := scanDir(dir, v.Tags)
-				for _, path := range imports {
-					xxx
-				}
-				for _, path := range testImports {
-					xxx
-				}
-			}
-		*/
-	}
-	WriteGoMod()
-
-	if *getD {
-		// Download all needed code as side-effect.
-		LoadALL()
-	}
-
-	if *getM {
-		return
-	}
-
-	if len(args) > 0 {
-		work.BuildInit()
-		var list []string
-		for _, p := range load.PackagesAndErrors(args) {
-			if p.Error == nil || !strings.HasPrefix(p.Error.Err, "no Go files") {
-				list = append(list, p.ImportPath)
-			}
-		}
-		if len(list) > 0 {
-			work.InstallPackages(list)
-		}
-	}
-}
diff --git a/vendor/cmd/go/internal/vgo/init.go b/vendor/cmd/go/internal/vgo/init.go
index f257a78..2d74967 100644
--- a/vendor/cmd/go/internal/vgo/init.go
+++ b/vendor/cmd/go/internal/vgo/init.go
@@ -259,7 +259,8 @@
 	WriteGoMod()
 }
 
-func allowed(m module.Version) bool {
+// Allowed reports whether module m is allowed (not excluded) by the main module's go.mod.
+func Allowed(m module.Version) bool {
 	return !excluded[m]
 }
 
diff --git a/vendor/cmd/go/internal/vgo/load.go b/vendor/cmd/go/internal/vgo/load.go
index 81861e3..dc2677e 100644
--- a/vendor/cmd/go/internal/vgo/load.go
+++ b/vendor/cmd/go/internal/vgo/load.go
@@ -47,6 +47,9 @@
 // which should be used instead.
 var loaded *loader
 
+// get -u flag; TODO: remove.
+var GetU bool
+
 // ImportPaths returns the set of packages matching the args (patterns),
 // adding modules to the build list as needed to satisfy new imports.
 func ImportPaths(args []string) []string {
@@ -382,7 +385,7 @@
 func (ld *loader) load(roots func() []string) {
 	var err error
 	mvsOp := mvs.BuildList
-	if *getU {
+	if GetU {
 		mvsOp = mvs.UpgradeAll
 	}
 	ld.buildList = buildList
@@ -633,7 +636,7 @@
 	ld.missingMu.Unlock()
 
 	fmt.Fprintf(os.Stderr, "resolving import %q\n", path)
-	repo, info, err := modfetch.Import(path, allowed)
+	repo, info, err := modfetch.Import(path, Allowed)
 	if err != nil {
 		base.Errorf("vgo: %s: %v", pkg.stackText(), err)
 		return
@@ -922,7 +925,7 @@
 	// only ever returns untagged versions,
 	// which is not what we want.
 	fmt.Fprintf(os.Stderr, "vgo: finding %s latest\n", m.Path)
-	info, err := modfetch.Query(m.Path, "latest", allowed)
+	info, err := modfetch.Query(m.Path, "latest", Allowed)
 	if err != nil {
 		return module.Version{}, err
 	}
diff --git a/vendor/cmd/go/main.go b/vendor/cmd/go/main.go
index 9df4d3a..6f25c25 100644
--- a/vendor/cmd/go/main.go
+++ b/vendor/cmd/go/main.go
@@ -87,7 +87,7 @@
 
 	if vgo.MustBeVgo {
 		// If running as vgo or with -vgo, change get now to change help message.
-		*get.CmdGet = *vgo.CmdGet
+		*get.CmdGet = *modget.CmdGet
 	}
 
 	cfg.CmdName = args[0] // for error messages
@@ -146,7 +146,7 @@
 		vgo.Init()
 		if vgo.Enabled() {
 			// Might not have done this above, so do it now.
-			*get.CmdGet = *vgo.CmdGet
+			*get.CmdGet = *modget.CmdGet
 		}
 	}