From ae3674c2e87a411bd83780637627dcf8f683e5c2 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 10 Oct 2013 16:20:34 +0800 Subject: [PATCH] added gopm gen --- cmd/gen.go | 85 +++++++++++++++++++++++++++++++++++++++++++-- docs/features_CN.md | 40 +++++++++++++++------ gopm.go | 1 + 3 files changed, 114 insertions(+), 12 deletions(-) diff --git a/cmd/gen.go b/cmd/gen.go index 03c3d8a7a..499c80921 100644 --- a/cmd/gen.go +++ b/cmd/gen.go @@ -14,6 +14,15 @@ package cmd +import ( + "github.com/Unknwon/com" + "go/build" + "os" + "path" + "runtime" + "strings" +) + var CmdGen = &Command{ UsageLine: "gen [.gopmfile]", Short: "generate a gopmfile according current go project", @@ -23,10 +32,82 @@ generate a gopmfile according current go project } func init() { - CmdGen.Run = gen + CmdGen.Run = runGen + CmdGen.Flags = map[string]bool{} +} + +func printGenPrompt(flag string) { +} + +func isStdPkg(pkgName string) bool { + return com.IsExist(path.Join(path.Join(runtime.GOROOT(), "src/pkg"), pkgName)) +} + +func getPkgs(path string, inludeSys bool) ([]string, error) { + pkg, err := build.ImportDir(path, build.AllowBinary) + if err != nil { + return []string{}, err + } + + if inludeSys { + return pkg.Imports, nil + } else { + pkgs := make([]string, 0) + for _, name := range pkg.Imports { + if !isStdPkg(name) { + pkgs = append(pkgs, name) + } + } + return pkgs, nil + } } // scan a directory and gen a gopm file -func gen(cmd *Command, args []string) { +func runGen(cmd *Command, args []string) { + // Check flags. + num := checkFlags(cmd.Flags, args, printGenPrompt) + if num == -1 { + return + } + args = args[num:] + + var gopmFile string = ".gopmfile" + if len(args) > 0 { + gopmFile = args[0] + } + + curPath, err := os.Getwd() + if err != nil { + com.ColorLog("[ERRO] %v.\n", err) + return + } + + gopmPath := path.Join(curPath, gopmFile) + + if com.IsExist(gopmPath) { + com.ColorLog("[WARN] %v already existed.\n", gopmFile) + return + } + + // search the project and gen gopmfile + pkgs, err := getPkgs(curPath, false) + if err != nil { + com.ColorLog("[ERRO] %v.\n", err) + return + } + + f, err := os.OpenFile(gopmPath, os.O_RDWR|os.O_CREATE, 0700) + if err != nil { + com.ColorLog("[ERRO] %v.\n", err) + return + } + defer f.Close() + contents := "[build]\n" + strings.Join(pkgs, "\n") + _, err = f.WriteString(contents) + if err != nil { + com.ColorLog("[ERRO] %v.\n", err) + return + } + com.ColorLog("[INFO] %v generated successfully.\n", gopmFile) } diff --git a/docs/features_CN.md b/docs/features_CN.md index 923c91bf3..642a2888b 100644 --- a/docs/features_CN.md +++ b/docs/features_CN.md @@ -22,7 +22,7 @@ gopm * [gopmspec文件格式](#50) -#总体设计目标 +# 总体设计目标 1. 支持go语言的版本管理 2. 支持文档管理 @@ -32,15 +32,24 @@ gopm 6. 支持从github, code.google.com, gitLab, 等常见的源码托管服务下载 -#最终程序只有一个,但是通过配置,可以有三种模式: +# 最终程序只有一个,但是通过配置,可以有三种模式: + 1 独立服务器 2 子服务器 3 客户端(默认) -##独立服务器 +## 独立服务器 独立服务器就是本身的包都是直接从源服务器中获取的。 +## 子服务器 + +子服务器就是包是从所配置的独立服务器上获取的,而不是直接从github等源服务器获取,在一个局域网中,可以通过架设子服务器来加快包的分发。 + +## 客户端 + +默认下载即为客户端模式,客户端默认是从源服务器获取包,如果要从包服务器获取包,则可在配置文件中通过配置即可。 + #Go包版本说明 @@ -62,14 +71,25 @@ http://gopm.io ~/.gopm/repos #数据库说明 -包信息数据采用goleveldb,这是一个key/value数据库。数据存放规则如下: -"lastId" : "{lastId}" lastId中存放最大的Id,Id为自增 +包信息数据采用goleveldb,这是一个key/value数据库。数据库存默认放在~/.gopm/repos下。数据存放规则如下: + +* "lastId" : "{lastId}" lastId中存放最大的Id,Id为自增 + +* "index:{packageName}": "{id}" index:中存放的是包名,value中存放的是这个包的不同版本的id,不同版本用逗号分隔 + +* “pkg:{id}” : "{pkg}" 某个包的名称 + +* “ver:{id}” : "{verString1}, {verString2}" 某个包版本对应的内容 + +* "desc:{id}" : "{desc}" 某个包的最新版本的描述 + +* "down:{id}" : "{down}" 某个包的下载url -"index:{packageName}": "{id}" index:中存放的是包名,value中存放的是这个包的不同版本的id,不同版本用逗号分隔 +* "deps:{id}" : "{deps}" 某个包的最新版本的描述 -“ver:{id}” : "{verString1}, {verString2}" 某个包版本对应的内容 +* “key:{keyword}:{id}” : "" 关键词及其对应的版本 -“key:{keyword}:{id}” : "" 关键词及其对应的版本 +* “total” :"{total}" 包总数 #各命令的目标和作用 @@ -106,9 +126,9 @@ http://gopm.io 去除一个包,如果不加版本标示,则删除该包的所有版本 -###gopm search {keyword} +###gopm search [-e] {keyword} -根据关键词查找包 +根据关键词查找包名或者包的描述,如果有-e开关,则完全匹配包名 ###gopm doc [-b] {packagename}[:{version}] diff --git a/gopm.go b/gopm.go index 547871869..13a91f1c0 100644 --- a/gopm.go +++ b/gopm.go @@ -45,6 +45,7 @@ var commands = []*cmd.Command{ cmd.CmdGet, cmd.CmdSearch, cmd.CmdServe, + cmd.CmdGen, /* cmdBuild, cmdClean,