func getByPath(ctx *cli.Context) { nodes := make([]*doc.Node, 0, len(ctx.Args())) for _, info := range ctx.Args() { pkgPath := info node := doc.NewNode(pkgPath, pkgPath, doc.BRANCH, "", true) if i := strings.Index(info, "@"); i > -1 { pkgPath = info[:i] tp, ver := validPath(info[i+1:]) node = doc.NewNode(pkgPath, pkgPath, tp, ver, true) } // Check package name. if !strings.Contains(pkgPath, "/") { pkgPath = doc.GetPkgFullPath(pkgPath) } nodes = append(nodes, node) } downloadPackages(ctx, nodes) doc.SaveLocalNodes() log.Log("%d package(s) downloaded, %d failed", downloadCount, failConut) }
func runExec(ctx *cli.Context) { setup(ctx) if len(ctx.Args()) == 0 { log.Error("exec", "Cannot start command:") log.Fatal("", "\tNo package specified") } installRepoPath = doc.HomeDir + "/repos" log.Log("Local repository path: %s", installRepoPath) // Parse package version. info := ctx.Args()[0] pkgPath := info node := doc.NewNode(pkgPath, pkgPath, doc.BRANCH, "", true) if i := strings.Index(info, "@"); i > -1 { // Specify version by argument. pkgPath = info[:i] node.Type, node.Value = validPath(info[i+1:]) } // Check package name. if !strings.Contains(pkgPath, "/") { pkgPath = doc.GetPkgFullPath(pkgPath) } node.ImportPath = pkgPath node.DownloadURL = pkgPath if len(node.Value) == 0 && com.IsFile(".gopmfile") { // Specify version by gopmfile. gf := doc.NewGopmfile(".") info, err := gf.GetValue("exec", pkgPath) if err == nil && len(info) > 0 { node.Type, node.Value = validPath(info) } } // Check if binary exists. binPath := path.Join(doc.HomeDir, "bins", node.ImportPath, path.Base(node.ImportPath)+versionSuffix(node.Value)) log.Log("Binary path: %s", binPath) if !com.IsFile(binPath) { // Calling bin command. args := []string{"bin", "-d"} if ctx.Bool("verbose") { args = append(args, "-v") } if ctx.Bool("update") { args = append(args, "-u") } args = append(args, node.ImportPath+"@"+node.Type+":"+node.Value) args = append(args, path.Dir(binPath)) stdout, stderr, err := com.ExecCmd("gopm", args...) if err != nil { log.Error("exec", "Building binary failed:") log.Fatal("", "\t"+err.Error()) } if len(stderr) > 0 { fmt.Print(stderr) } if len(stdout) > 0 { fmt.Print(stdout) } } fmt.Printf("%+v\n", node) return stdout, stderr, err := com.ExecCmd(binPath, ctx.Args()[1:]...) if err != nil { log.Error("exec", "Calling binary failed:") log.Fatal("", "\t"+err.Error()) } if len(stderr) > 0 { fmt.Print(stderr) } if len(stdout) > 0 { fmt.Print(stdout) } }
func runBin(ctx *cli.Context) { setup(ctx) if len(ctx.Args()) == 0 { log.Error("bin", "Cannot start command:") log.Fatal("", "\tNo package specified") } installRepoPath = doc.HomeDir + "/repos" log.Log("Local repository path: %s", installRepoPath) // Check arguments. num := 1 if ctx.Bool("dir") { num = 2 } if len(ctx.Args()) != num { log.Error("bin", "Cannot start command:") log.Fatal("", "\tMissing indicated path to build binary") } // Check if given directory exists. if ctx.Bool("dir") && !com.IsDir(ctx.Args()[1]) { log.Error("bin", "Cannot start command:") log.Fatal("", "\tIndicated path does not exist or is not a directory") } // Parse package version. info := ctx.Args()[0] pkgPath := info node := doc.NewNode(pkgPath, pkgPath, doc.BRANCH, "", true) var err error if i := strings.Index(info, "@"); i > -1 { pkgPath = info[:i] node.ImportPath = pkgPath node.DownloadURL = pkgPath node.Type, node.Value = validPath(info[i+1:]) } // Check package name. if !strings.Contains(pkgPath, "/") { pkgPath = doc.GetPkgFullPath(pkgPath) } // Get code. downloadPackages(ctx, []*doc.Node{node}) // Check if previous steps were successful. repoPath := installRepoPath + "/" + pkgPath + versionSuffix(node.Value) if !com.IsDir(repoPath) { log.Error("bin", "Cannot continue command:") log.Fatal("", "\tPrevious steps weren't successful") } wd, err := os.Getwd() if err != nil { log.Error("bin", "Cannot get work directory:") log.Fatal("", "\t"+err.Error()) } // Change to repository path. log.Log("Changing work directory to %s", repoPath) if err = os.Chdir(repoPath); err != nil { log.Error("bin", "Fail to change work directory:") log.Fatal("", "\t"+err.Error()) } // Build application. buildBinary(ctx) defer func() { // Clean files. os.RemoveAll(path.Join(repoPath, doc.VENDOR)) }() includes := make([]string, 0, 3) // Check if previous steps were successful. if com.IsFile(doc.GOPM_FILE_NAME) { log.Trace("Loading gopmfile...") gf := doc.NewGopmfile(".") var err error pkgName, err = gf.GetValue("target", "path") if err == nil { log.Log("Target name: %s", pkgName) } includes = strings.Split(gf.MustValue("res", "include"), "|") } if len(pkgName) == 0 { _, pkgName = filepath.Split(pkgPath) } // Because build command moved binary to root path. binName := path.Base(pkgName) if runtime.GOOS == "windows" { binName += ".exe" } if !com.IsFile(binName) { log.Error("bin", "Binary does not exist:") log.Error("", "\t"+binName) log.Fatal("", "\tPrevious steps weren't successful or the project does not contain main package") } // Move binary to given directory. movePath := wd if ctx.Bool("dir") { movePath = ctx.Args()[1] } if com.IsExist(movePath + "/" + binName) { if err = os.Remove(movePath + "/" + binName); err != nil { log.Warn("Cannot remove binary in work directory:") log.Warn("\t %s", err) } } if err = os.Rename(binName, movePath+"/"+binName); err != nil { log.Error("bin", "Fail to move binary:") log.Fatal("", "\t"+err.Error()) } os.Chmod(movePath+"/"+binName, os.ModePerm) if len(includes) > 0 { log.Log("Copying resources to %s", movePath) for _, include := range includes { if com.IsDir(include) { if err = com.CopyDir(include, filepath.Join(movePath, include)); err != nil { log.Error("bin", "Fail to copy following resource:") log.Error("", "\t"+include) } } } } log.Log("Changing work directory back to %s", wd) os.Chdir(wd) log.Success("SUCC", "bin", "Command executed successfully!") fmt.Println("Binary has been built into: " + movePath) }