summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/spf13/cobra/cobra/cmd/helpers.go')
-rw-r--r--vendor/github.com/spf13/cobra/cobra/cmd/helpers.go340
1 files changed, 62 insertions, 278 deletions
diff --git a/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go b/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
index 7cd3be18b..6114227db 100644
--- a/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
+++ b/vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
@@ -21,335 +21,119 @@ import (
"path/filepath"
"strings"
"text/template"
- "time"
-
- "github.com/spf13/viper"
)
-// var BaseDir = ""
-// var AppName = ""
-// var CommandDir = ""
-
-var funcMap template.FuncMap
-var projectPath = ""
-var inputPath = ""
-var projectBase = ""
-
-// for testing only
-var testWd = ""
-
-var cmdDirs = []string{"cmd", "cmds", "command", "commands"}
+var cmdDirs = [...]string{"cmd", "cmds", "command", "commands"}
+var srcPaths []string
func init() {
- funcMap = template.FuncMap{
- "comment": commentifyString,
+ // Initialize srcPaths.
+ envGoPath := os.Getenv("GOPATH")
+ goPaths := filepath.SplitList(envGoPath)
+ if len(goPaths) == 0 {
+ er("$GOPATH is not set")
+ }
+ srcPaths = make([]string, 0, len(goPaths))
+ for _, goPath := range goPaths {
+ srcPaths = append(srcPaths, filepath.Join(goPath, "src"))
}
}
func er(msg interface{}) {
fmt.Println("Error:", msg)
- os.Exit(-1)
-}
-
-// Check if a file or directory exists.
-func exists(path string) (bool, error) {
- _, err := os.Stat(path)
- if err == nil {
- return true, nil
- }
- if os.IsNotExist(err) {
- return false, nil
- }
- return false, err
-}
-
-func ProjectPath() string {
- if projectPath == "" {
- guessProjectPath()
- }
-
- return projectPath
-}
-
-// wrapper of the os package so we can test better
-func getWd() (string, error) {
- if testWd == "" {
- return os.Getwd()
- }
- return testWd, nil
-}
-
-func guessCmdDir() string {
- guessProjectPath()
- if b, _ := isEmpty(projectPath); b {
- return "cmd"
- }
-
- files, _ := filepath.Glob(projectPath + string(os.PathSeparator) + "c*")
- for _, f := range files {
- for _, c := range cmdDirs {
- if f == c {
- return c
- }
- }
- }
-
- return "cmd"
-}
-
-func guessImportPath() string {
- guessProjectPath()
-
- if !strings.HasPrefix(projectPath, getSrcPath()) {
- er("Cobra only supports project within $GOPATH")
- }
-
- return filepath.ToSlash(filepath.Clean(strings.TrimPrefix(projectPath, getSrcPath())))
-}
-
-func getSrcPath() string {
- return filepath.Join(os.Getenv("GOPATH"), "src") + string(os.PathSeparator)
-}
-
-func projectName() string {
- return filepath.Base(ProjectPath())
-}
-
-func guessProjectPath() {
- // if no path is provided... assume CWD.
- if inputPath == "" {
- x, err := getWd()
- if err != nil {
- er(err)
- }
-
- // inspect CWD
- base := filepath.Base(x)
-
- // if we are in the cmd directory.. back up
- for _, c := range cmdDirs {
- if base == c {
- projectPath = filepath.Dir(x)
- return
- }
- }
-
- if projectPath == "" {
- projectPath = filepath.Clean(x)
- return
- }
- }
-
- srcPath := getSrcPath()
- // if provided, inspect for logical locations
- if strings.ContainsRune(inputPath, os.PathSeparator) {
- if filepath.IsAbs(inputPath) || filepath.HasPrefix(inputPath, string(os.PathSeparator)) {
- // if Absolute, use it
- projectPath = filepath.Clean(inputPath)
- return
- }
- // If not absolute but contains slashes,
- // assuming it means create it from $GOPATH
- count := strings.Count(inputPath, string(os.PathSeparator))
-
- switch count {
- // If only one directory deep, assume "github.com"
- case 1:
- projectPath = filepath.Join(srcPath, "github.com", inputPath)
- return
- case 2:
- projectPath = filepath.Join(srcPath, inputPath)
- return
- default:
- er("Unknown directory")
- }
- } else {
- // hardest case.. just a word.
- if projectBase == "" {
- x, err := getWd()
- if err == nil {
- projectPath = filepath.Join(x, inputPath)
- return
- }
- er(err)
- } else {
- projectPath = filepath.Join(srcPath, projectBase, inputPath)
- return
- }
- }
+ os.Exit(1)
}
// isEmpty checks if a given path is empty.
-func isEmpty(path string) (bool, error) {
- if b, _ := exists(path); !b {
- return false, fmt.Errorf("%q path does not exist", path)
- }
+func isEmpty(path string) bool {
fi, err := os.Stat(path)
if err != nil {
- return false, err
+ er(err)
}
if fi.IsDir() {
f, err := os.Open(path)
- // FIX: Resource leak - f.close() should be called here by defer or is missed
- // if the err != nil branch is taken.
- defer f.Close()
if err != nil {
- return false, err
+ er(err)
}
- list, _ := f.Readdir(-1)
- // f.Close() - see bug fix above
- return len(list) == 0, nil
+ defer f.Close()
+ dirs, err := f.Readdirnames(1)
+ if err != nil && err != io.EOF {
+ er(err)
+ }
+ return len(dirs) == 0
}
- return fi.Size() == 0, nil
+ return fi.Size() == 0
}
-// isDir checks if a given path is a directory.
-func isDir(path string) (bool, error) {
- fi, err := os.Stat(path)
- if err != nil {
- return false, err
+// exists checks if a file or directory exists.
+func exists(path string) bool {
+ if path == "" {
+ return false
}
- return fi.IsDir(), nil
-}
-
-// dirExists checks if a path exists and is a directory.
-func dirExists(path string) (bool, error) {
- fi, err := os.Stat(path)
- if err == nil && fi.IsDir() {
- return true, nil
- }
- if os.IsNotExist(err) {
- return false, nil
- }
- return false, err
-}
-
-func writeTemplateToFile(path string, file string, template string, data interface{}) error {
- filename := filepath.Join(path, file)
-
- r, err := templateToReader(template, data)
-
- if err != nil {
- return err
+ _, err := os.Stat(path)
+ if err == nil {
+ return true
}
-
- err = safeWriteToDisk(filename, r)
-
- if err != nil {
- return err
+ if !os.IsNotExist(err) {
+ er(err)
}
- return nil
+ return false
}
-func writeStringToFile(path, file, text string) error {
- filename := filepath.Join(path, file)
-
- r := strings.NewReader(text)
- err := safeWriteToDisk(filename, r)
-
+func executeTemplate(tmplStr string, data interface{}) (string, error) {
+ tmpl, err := template.New("").Funcs(template.FuncMap{"comment": commentifyString}).Parse(tmplStr)
if err != nil {
- return err
+ return "", err
}
- return nil
-}
-func templateToReader(tpl string, data interface{}) (io.Reader, error) {
- tmpl := template.New("")
- tmpl.Funcs(funcMap)
- tmpl, err := tmpl.Parse(tpl)
-
- if err != nil {
- return nil, err
- }
buf := new(bytes.Buffer)
err = tmpl.Execute(buf, data)
-
- return buf, err
+ return buf.String(), err
}
-// Same as WriteToDisk but checks to see if file/directory already exists.
-func safeWriteToDisk(inpath string, r io.Reader) (err error) {
- dir, _ := filepath.Split(inpath)
- ospath := filepath.FromSlash(dir)
+func writeStringToFile(path string, s string) error {
+ return writeToFile(path, strings.NewReader(s))
+}
- if ospath != "" {
- err = os.MkdirAll(ospath, 0777) // rwx, rw, r
- if err != nil {
- return
- }
+// writeToFile writes r to file with path only
+// if file/directory on given path doesn't exist.
+// If file/directory exists on given path, then
+// it terminates app and prints an appropriate error.
+func writeToFile(path string, r io.Reader) error {
+ if exists(path) {
+ return fmt.Errorf("%v already exists", path)
}
- ex, err := exists(inpath)
- if err != nil {
- return
- }
- if ex {
- return fmt.Errorf("%v already exists", inpath)
+ dir := filepath.Dir(path)
+ if dir != "" {
+ if err := os.MkdirAll(dir, 0777); err != nil {
+ return err
+ }
}
- file, err := os.Create(inpath)
+ file, err := os.Create(path)
if err != nil {
- return
+ return err
}
defer file.Close()
_, err = io.Copy(file, r)
- return
-}
-
-func getLicense() License {
- l := whichLicense()
- if l != "" {
- if x, ok := Licenses[l]; ok {
- return x
- }
- }
-
- return Licenses["apache"]
-}
-
-func whichLicense() string {
- // if explicitly flagged, use that
- if userLicense != "" {
- return matchLicense(userLicense)
- }
-
- // if already present in the project, use that
- // TODO: Inspect project for existing license
-
- // default to viper's setting
-
- if viper.IsSet("license.header") || viper.IsSet("license.text") {
- if custom, ok := Licenses["custom"]; ok {
- custom.Header = viper.GetString("license.header")
- custom.Text = viper.GetString("license.text")
- Licenses["custom"] = custom
- return "custom"
- }
- }
-
- return matchLicense(viper.GetString("license"))
-}
-
-func copyrightLine() string {
- author := viper.GetString("author")
- year := time.Now().Format("2006")
-
- return "Copyright © " + year + " " + author
+ return err
}
+// commentfyString comments every line of in.
func commentifyString(in string) string {
var newlines []string
lines := strings.Split(in, "\n")
- for _, x := range lines {
- if !strings.HasPrefix(x, "//") {
- if x != "" {
- newlines = append(newlines, "// "+x)
- } else {
+ for _, line := range lines {
+ if strings.HasPrefix(line, "//") {
+ newlines = append(newlines, line)
+ } else {
+ if line == "" {
newlines = append(newlines, "//")
+ } else {
+ newlines = append(newlines, "// "+line)
}
- } else {
- newlines = append(newlines, x)
}
}
return strings.Join(newlines, "\n")