From 90bbb78dee6192fb1cf2c839639a1183359d63ff Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 29 Nov 2013 22:46:51 -0500 Subject: [PATCH] Added gopm bin --- README.md | 7 ++- cmd/bin.go | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/get.go | 22 ++++---- gopm.go | 3 +- 4 files changed, 176 insertions(+), 15 deletions(-) create mode 100644 cmd/bin.go diff --git a/README.md b/README.md index 1fbf8532f..111b022be 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ gopm - Go Package Manager Gopm(Go Package Manager) is a Go package manage tool for search, install, update and share packages in Go. -Current Version: **v0.5.5** +Current Version: **v0.5.6** # Requirement @@ -40,13 +40,14 @@ USAGE: gopm [global options] command [command options] [arguments...] VERSION: - 0.5.5.1111 + 0.5.6.1130 COMMANDS: get fetch remote package(s) and dependencies to local repository + bin download and link dependencies and build executable binary gen generate a gopmfile according current go project run link dependencies and go run - build link dependencies and go build + build link dependencies and go build install link dependencies and go install help, h Shows a list of commands or help for one command diff --git a/cmd/bin.go b/cmd/bin.go new file mode 100644 index 000000000..fe2cfa5fc --- /dev/null +++ b/cmd/bin.go @@ -0,0 +1,159 @@ +// Copyright 2013 gopm authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +package cmd + +import ( + "os" + "path" + "strings" + + "github.com/Unknwon/com" + "github.com/codegangsta/cli" + + "github.com/gpmgo/gopm/doc" + "github.com/gpmgo/gopm/log" +) + +var CmdBin = cli.Command{ + Name: "bin", + Usage: "download and link dependencies and build executable binary", + Description: `Command bin downloads and links dependencies according to gopmfile, +and build executable binary to work directory + +gopm bin @[:] +gopm bin @[:] + +Can only specify one each time, and only works for projects that +contains main package`, + Action: runBin, + Flags: []cli.Flag{ + cli.BoolFlag{"dir", "build binary to given directory(second argument)"}, + }, +} + +func runBin(ctx *cli.Context) { + if len(ctx.Args()) == 0 { + log.Error("Bin", "Fail to start command") + log.Fatal("", "No package specified") + } + + hd, err := com.HomeDir() + if err != nil { + log.Error("Bin", "Fail to get current user") + log.Fatal("", err.Error()) + } + + doc.HomeDir = strings.Replace(doc.RawHomeDir, "~", hd, -1) + doc.LoadPkgNameList(doc.HomeDir + "/data/pkgname.list") + + installRepoPath = doc.HomeDir + "/repos" + + // Check arguments. + num := 1 + if ctx.Bool("dir") { + num = 2 + } + if len(ctx.Args()) != num { + log.Error("Bin", "Fail to start command") + log.Fatal("", "Invalid argument number") + } + + // Check if given directory exists. + if ctx.Bool("dir") && !com.IsDir(ctx.Args()[1]) { + log.Error("Bin", "Fail to start command") + log.Fatal("", "Given directory does not exist") + } + + // Parse package version. + info := ctx.Args()[0] + pkgName := info + ver := "" + if i := strings.Index(info, "@"); i > -1 { + pkgName = info[:i] + _, ver, err = validPath(info[i+1:]) + if err != nil { + log.Error("Bin", "Fail to parse version") + log.Fatal("", err.Error()) + } + } + + // Check package name. + if !strings.Contains(pkgName, "/") { + name, ok := doc.PackageNameList[pkgName] + if !ok { + log.Error("Bin", "Invalid package name: "+pkgName) + log.Fatal("", "No match in the package name list") + } + pkgName = name + } + + // Get code. + com.ExecCmd("gopm", "get", ctx.Args()[0]) + + // Check if previous steps were successful. + pkgPath := installRepoPath + "/" + pkgName + if len(ver) > 0 { + pkgPath += "." + ver + } + if !com.IsDir(pkgPath) { + log.Error("Bin", "Fail to continue command") + log.Fatal("", "Previous steps weren't successful") + } + + wd, err := os.Getwd() + if err != nil { + log.Error("Bin", "Fail to get work directory") + log.Fatal("", err.Error()) + } + + // Change to repository path. + log.Log("Changing work directory to %s", pkgPath) + err = os.Chdir(pkgPath) + if err != nil { + log.Error("Bin", "Fail to change work directory") + log.Fatal("", err.Error()) + } + + // Build application. + com.ExecCmd("gopm", "build") + defer func() { + // Clean files. + os.RemoveAll(pkgPath + "/vendor") + }() + + // Check if previous steps were successful. + binName := path.Base(pkgName) + if !com.IsFile(binName) { + log.Error("Bin", "Fail to continue command") + log.Fatal("", "Previous 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] + } + _, err = com.Move(binName, movePath+"/"+binName) + if err != nil { + log.Error("Bin", "Fail to move binary") + log.Fatal("", err.Error()) + } + os.Chmod(movePath+"/"+binName, os.ModePerm) + + log.Log("Changing work directory back to %s", wd) + os.Chdir(wd) + + log.Success("SUCC", "Bin", "Command execute successfully!") +} diff --git a/cmd/get.go b/cmd/get.go index 33875f8a6..c11d2c713 100644 --- a/cmd/get.go +++ b/cmd/get.go @@ -63,7 +63,7 @@ func init() { func runGet(ctx *cli.Context) { hd, err := com.HomeDir() if err != nil { - log.Error("get", "Fail to get current user") + log.Error("Get", "Fail to get current user") log.Fatal("", err.Error()) } @@ -134,27 +134,27 @@ func getByGopmfile(ctx *cli.Context) { func getByPath(ctx *cli.Context) { nodes := make([]*doc.Node, 0, len(ctx.Args())) for _, info := range ctx.Args() { - pkg := info - node := doc.NewNode(pkg, pkg, doc.BRANCH, "", true) + pkgName := info + node := doc.NewNode(pkgName, pkgName, doc.BRANCH, "", true) if i := strings.Index(info, "@"); i > -1 { - pkg = info[:i] + pkgName = info[:i] tp, ver, err := validPath(info[i+1:]) if err != nil { - log.Error("", "Fail to parse version") + log.Error("Get", "Fail to parse version") log.Fatal("", err.Error()) } - node = doc.NewNode(pkg, pkg, tp, ver, true) + node = doc.NewNode(pkgName, pkgName, tp, ver, true) } - // Cheeck package name. - if !strings.Contains(pkg, "/") { - name, ok := doc.PackageNameList[pkg] + // Check package name. + if !strings.Contains(pkgName, "/") { + name, ok := doc.PackageNameList[pkgName] if !ok { - log.Error("", "Invalid package name: "+pkg) + log.Error("Get", "Invalid package name: "+pkgName) log.Fatal("", "No match in the package name list") } - pkg = name + pkgName = name } nodes = append(nodes, node) diff --git a/gopm.go b/gopm.go index d2cc16d27..0386df4f0 100644 --- a/gopm.go +++ b/gopm.go @@ -29,7 +29,7 @@ import ( // Test that go1.1 tag above is included in builds. main.go refers to this definition. const go11tag = true -const APP_VER = "0.5.5.1129" +const APP_VER = "0.5.6.1130" // //cmd.CmdSearch, // cmdClean, @@ -53,6 +53,7 @@ func main() { app.Version = APP_VER app.Commands = []cli.Command{ cmd.CmdGet, + cmd.CmdBin, cmd.CmdGen, cmd.CmdRun, cmd.CmdBuild,