diff --git a/.gitignore b/.gitignore index 00268614f..44be10b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ _cgo_export.* _testmain.go *.exe +gpm \ No newline at end of file diff --git a/build.go b/build.go index acd692511..c9aa3e249 100644 --- a/build.go +++ b/build.go @@ -17,95 +17,12 @@ import ( ) var cmdBuild = &Command{ - UsageLine: "build [-o output] [build flags] [packages]", - Short: "compile and install packages and dependencies", - Long: ` -Build compiles the packages named by the import paths, -along with their dependencies, but it does not install the results. - -If the arguments are a list of .go files, build treats them as a list -of source files specifying a single package. - -When the command line specifies a single main package, -build writes the resulting executable to output. -Otherwise build compiles the packages but discards the results, -serving only as a check that the packages can be built. - -The -o flag specifies the output file name. If not specified, the -output file name depends on the arguments and derives from the name -of the package, such as p.a for package p, unless p is 'main'. If -the package is main and file names are provided, the file name -derives from the first file name mentioned, such as f1 for 'go build -f1.go f2.go'; with no files provided ('go build'), the output file7 -name is the base name of the containing directory. - -The build flags are shared by the build, install, run, and test commands: - - -a - force rebuilding of packages that are already up-to-date. - -n - print the commands but do not run them. - -p n - the number of builds that can be run in parallel. - The default is the number of CPUs available. - -race - enable data race detection. - Supported only on linux/amd64, darwin/amd64 and windows/amd64. - -v - print the names of packages as they are compiled. - -work - print the name of the temporary work directory and - do not delete it when exiting. - -x - print the commands. - - -ccflags 'arg list' - arguments to pass on each 5c, 6c, or 8c compiler invocation. - -compiler name - name of compiler to use, as in runtime.Compiler (gccgo or gc). - -gccgoflags 'arg list' - arguments to pass on each gccgo compiler/linker invocation. - -gcflags 'arg list' - arguments to pass on each 5g, 6g, or 8g compiler invocation. - -installsuffix suffix - a suffix to use in the name of the package installation directory, - in order to keep output separate from default builds. - If using the -race flag, the install suffix is automatically set to race - or, if set explicitly, has _race appended to it. - -ldflags 'flag list' - arguments to pass on each 5l, 6l, or 8l linker invocation. - -tags 'tag list' - a list of build tags to consider satisfied during the build. - See the documentation for the go/build package for - more information about build tags. - -The list flags accept a space-separated list of strings. To embed spaces -in an element in the list, surround it with either single or double quotes. - -For more about specifying packages, see 'go help packages'. -For more about where packages and binaries are installed, -see 'go help gopath'. - -See also: go install, go get, go clean. - `, + UsageLine: "build [build flags] [packages]", } func init() { - // break init cycle cmdBuild.Run = runBuild - //cmdInstall.Run = runInstall - - addBuildFlags(cmdBuild) - //addBuildFlags(cmdInstall) -} - -// Flags set by multiple commands. -var buildV bool // -v flag. - -// addBuildFlags adds the flags common to the build and install commands. -func addBuildFlags(cmd *Command) { - // NOTE: If you add flags here, also add them to testflag.go. - cmd.Flag.BoolVar(&buildV, "v", false, "") + cmdBuild.Flags = []string{"-v"} } func runBuild(cmd *Command, args []string) { diff --git a/gpm.go b/gpm.go index ea1db2921..a9f855513 100644 --- a/gpm.go +++ b/gpm.go @@ -53,11 +53,7 @@ type Command struct { Long string // Flag is a set of flags specific to this command. - Flag flag.FlagSet - - // CustomFlags indicates that the command will do its own - // flag parsing. - CustomFlags bool + Flags []string } // Name returns the command's name: the first word in the usage line. @@ -99,6 +95,44 @@ func setExitStatus(n int) { exitMu.Unlock() } +func loadUsage(lang string) bool { + // Load main usage. + f, err := os.Open(appPath + "i18n/usage_" + lang + ".tpl") + if err != nil { + fmt.Println(err) + return false + } + defer f.Close() + // Read usage. + fi, _ := f.Stat() + usageBytes := make([]byte, fi.Size()) + f.Read(usageBytes) + usageTemplate = string(usageBytes) + + // Load command usage. + for _, cmd := range commands { + f, err := os.Open(appPath + "i18n/usage_" + cmd.Name() + "_" + lang + ".txt") + if err != nil { + fmt.Println(err) + return false + } + defer f.Close() + // Read usage. + fi, _ := f.Stat() + usageBytes := make([]byte, fi.Size()) + f.Read(usageBytes) + usages := strings.Split(string(usageBytes), "|||") + if len(usages) < 2 { + fmt.Println("Unacceptable usage file: ", cmd.Name()) + return false + } + cmd.Short = usages[0] + cmd.Long = usages[1] + } + + return true +} + func main() { // Get application path. appPath, _ := exec.LookPath("gpm") @@ -111,17 +145,9 @@ func main() { } // Load usage template by language. - f, err := os.Open(appPath + "i18n/usage_" + config.Lang + ".tpl") - if err != nil { - fmt.Println(err) + if !loadUsage(config.Lang) { return } - defer f.Close() - // Read usage. - fi, _ := f.Stat() - usageBytes := make([]byte, fi.Size()) - f.Read(usageBytes) - usageTemplate = string(usageBytes) // Initialization. flag.Usage = usage @@ -161,7 +187,6 @@ func main() { for _, cmd := range commands { if cmd.Name() == args[0] && cmd.Run != nil { - cmd.Flag.Usage = func() { cmd.Usage() } cmd.Run(cmd, args[1:]) exit() return diff --git a/i18n/usage_build_en-US.txt b/i18n/usage_build_en-US.txt new file mode 100644 index 000000000..5e9e1f287 --- /dev/null +++ b/i18n/usage_build_en-US.txt @@ -0,0 +1,61 @@ +compile and install packages and dependencies||| +Build compiles and installs the packages named by the import paths, +along with their dependencies. + +If the arguments are a list of .go files, build treats them as a list +of source files specifying a single package. + +When the command line specifies a single main package, +build writes the resulting executable to output. +Otherwise build compiles the packages but discards the results, +serving only as a check that the packages can be built. + +If the package is main, the output file +name is the base name of the containing directory. + +The build flags are shared by the build and test commands: + + -a + force rebuilding of packages that are already up-to-date. + -n + print the commands but do not run them. + -p n + the number of builds that can be run in parallel. + The default is the number of CPUs available. + -race + enable data race detection. + Supported only on linux/amd64, darwin/amd64 and windows/amd64. + -v + print the names of packages as they are compiled. + -work + print the name of the temporary work directory and + do not delete it when exiting. + -x + print the commands. + + -ccflags 'arg list' + arguments to pass on each 5c, 6c, or 8c compiler invocation. + -compiler name + name of compiler to use, as in runtime.Compiler (gccgo or gc). + -gccgoflags 'arg list' + arguments to pass on each gccgo compiler/linker invocation. + -gcflags 'arg list' + arguments to pass on each 5g, 6g, or 8g compiler invocation. + -installsuffix suffix + a suffix to use in the name of the package installation directory, + in order to keep output separate from default builds. + If using the -race flag, the install suffix is automatically set to race + or, if set explicitly, has _race appended to it. + -ldflags 'flag list' + arguments to pass on each 5l, 6l, or 8l linker invocation. + -tags 'tag list' + a list of build tags to consider satisfied during the build. + See the documentation for the go/build package for + more information about build tags. + +The list flags accept a space-separated list of strings. To embed spaces +in an element in the list, surround it with either single or double quotes. + +For more about specifying packages, see 'go help packages'. + +See also: gpm install.