mirror of https://github.com/k3s-io/k3s
97 lines
2.0 KiB
Go
97 lines
2.0 KiB
Go
![]() |
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
)
|
||
|
|
||
|
var cmdGet = &Command{
|
||
|
Name: "get",
|
||
|
Args: "[-t] [packages]",
|
||
|
Short: "download and install packages with specified dependencies",
|
||
|
Long: `
|
||
|
Get downloads to GOPATH the packages named by the import paths, and installs
|
||
|
them with the dependencies specified in their Godeps files.
|
||
|
|
||
|
If any of the packages do not have Godeps files, those are installed
|
||
|
as if by go get.
|
||
|
|
||
|
If -t is given, dependencies of test files are also downloaded and installed.
|
||
|
|
||
|
For more about specifying packages, see 'go help packages'.
|
||
|
`,
|
||
|
Run: runGet,
|
||
|
OnlyInGOPATH: true,
|
||
|
}
|
||
|
|
||
|
var getT bool
|
||
|
|
||
|
func init() {
|
||
|
cmdGet.Flag.BoolVar(&getT, "t", false, "get test dependencies")
|
||
|
}
|
||
|
|
||
|
func runGet(cmd *Command, args []string) {
|
||
|
if len(args) == 0 {
|
||
|
args = []string{"."}
|
||
|
}
|
||
|
|
||
|
cmdArgs := []interface{}{"get", "-d"}
|
||
|
if verbose {
|
||
|
cmdArgs = append(cmdArgs, "-v")
|
||
|
}
|
||
|
|
||
|
if getT {
|
||
|
cmdArgs = append(cmdArgs, "-t")
|
||
|
}
|
||
|
|
||
|
err := command("go", append(cmdArgs, args)...).Run()
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
|
||
|
// group import paths by Godeps location
|
||
|
groups := make(map[string][]string)
|
||
|
ps, err := LoadPackages(args...)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
for _, pkg := range ps {
|
||
|
if pkg.Error.Err != "" {
|
||
|
log.Fatalln(pkg.Error.Err)
|
||
|
}
|
||
|
dir, _ := findInParents(pkg.Dir, "Godeps")
|
||
|
groups[dir] = append(groups[dir], pkg.ImportPath)
|
||
|
}
|
||
|
for dir, packages := range groups {
|
||
|
var c *exec.Cmd
|
||
|
if dir == "" {
|
||
|
c = command("go", "install", packages)
|
||
|
} else {
|
||
|
c = command("godep", "go", "install", packages)
|
||
|
c.Dir = dir
|
||
|
}
|
||
|
if err := c.Run(); err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// command is like exec.Command, but the returned
|
||
|
// Cmd inherits stderr from the current process, and
|
||
|
// elements of args may be either string or []string.
|
||
|
func command(name string, args ...interface{}) *exec.Cmd {
|
||
|
var a []string
|
||
|
for _, arg := range args {
|
||
|
switch v := arg.(type) {
|
||
|
case string:
|
||
|
a = append(a, v)
|
||
|
case []string:
|
||
|
a = append(a, v...)
|
||
|
}
|
||
|
}
|
||
|
c := exec.Command(name, a...)
|
||
|
c.Stderr = os.Stderr
|
||
|
return c
|
||
|
}
|