mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-11-03 23:40:03 +00:00 
			
		
		
		
	Bump spf13/cobra
This commit is contained in:
		
							
								
								
									
										2
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -682,7 +682,7 @@
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/spf13/cobra",
 | 
			
		||||
			"Rev": "d732ab3a34e6e9e6b5bdac80707c2b6bad852936"
 | 
			
		||||
			"Rev": "1c44ec8d3f1552cac48999f9306da23c4d8a288b"
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"ImportPath": "github.com/spf13/pflag",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/.mailmap
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/.mailmap
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
Steve Francia <steve.francia@gmail.com>
 | 
			
		||||
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
 | 
			
		||||
Fabiano Franz <ffranz@redhat.com>                   <contact@fabianofranz.com>
 | 
			
		||||
							
								
								
									
										2
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,5 +5,5 @@ go:
 | 
			
		||||
  - 1.5.1
 | 
			
		||||
  - tip
 | 
			
		||||
script:
 | 
			
		||||
  - go test ./...
 | 
			
		||||
  - go test -v ./...
 | 
			
		||||
  - go build
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										772
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										772
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										39
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/bash_completions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/bash_completions.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -60,7 +60,9 @@ __handle_reply()
 | 
			
		||||
    __debug "${FUNCNAME}"
 | 
			
		||||
    case $cur in
 | 
			
		||||
        -*)
 | 
			
		||||
            compopt -o nospace
 | 
			
		||||
            if [[ $(type -t compopt) = "builtin" ]]; then
 | 
			
		||||
                compopt -o nospace
 | 
			
		||||
            fi
 | 
			
		||||
            local allflags
 | 
			
		||||
            if [ ${#must_have_one_flag[@]} -ne 0 ]; then
 | 
			
		||||
                allflags=("${must_have_one_flag[@]}")
 | 
			
		||||
@@ -68,7 +70,9 @@ __handle_reply()
 | 
			
		||||
                allflags=("${flags[*]} ${two_word_flags[*]}")
 | 
			
		||||
            fi
 | 
			
		||||
            COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") )
 | 
			
		||||
            [[ $COMPREPLY == *= ]] || compopt +o nospace
 | 
			
		||||
            if [[ $(type -t compopt) = "builtin" ]]; then
 | 
			
		||||
                [[ $COMPREPLY == *= ]] || compopt +o nospace
 | 
			
		||||
            fi
 | 
			
		||||
            return 0;
 | 
			
		||||
            ;;
 | 
			
		||||
    esac
 | 
			
		||||
@@ -175,11 +179,11 @@ __handle_word()
 | 
			
		||||
{
 | 
			
		||||
    if [[ $c -ge $cword ]]; then
 | 
			
		||||
        __handle_reply
 | 
			
		||||
	return
 | 
			
		||||
        return
 | 
			
		||||
    fi
 | 
			
		||||
    __debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
 | 
			
		||||
    if [[ "${words[c]}" == -* ]]; then
 | 
			
		||||
	__handle_flag
 | 
			
		||||
        __handle_flag
 | 
			
		||||
    elif __contains_word "${words[c]}" "${commands[@]}"; then
 | 
			
		||||
        __handle_command
 | 
			
		||||
    else
 | 
			
		||||
@@ -195,7 +199,7 @@ func postscript(out *bytes.Buffer, name string) {
 | 
			
		||||
	fmt.Fprintf(out, "__start_%s()\n", name)
 | 
			
		||||
	fmt.Fprintf(out, `{
 | 
			
		||||
    local cur prev words cword
 | 
			
		||||
    if declare -F _init_completions >/dev/null 2>&1; then
 | 
			
		||||
    if declare -F _init_completion >/dev/null 2>&1; then
 | 
			
		||||
        _init_completion -s || return
 | 
			
		||||
    else
 | 
			
		||||
        __my_init_completion || return
 | 
			
		||||
@@ -216,7 +220,13 @@ func postscript(out *bytes.Buffer, name string) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
`, name)
 | 
			
		||||
	fmt.Fprintf(out, "complete -F __start_%s %s\n", name, name)
 | 
			
		||||
	fmt.Fprintf(out, `if [[ $(type -t compopt) = "builtin" ]]; then
 | 
			
		||||
    complete -F __start_%s %s
 | 
			
		||||
else
 | 
			
		||||
    complete -o nospace -F __start_%s %s
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
`, name, name, name, name)
 | 
			
		||||
	fmt.Fprintf(out, "# ex: ts=4 sw=4 et filetype=sh\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -295,6 +305,12 @@ func writeFlags(cmd *Command, out *bytes.Buffer) {
 | 
			
		||||
			writeShortFlag(flag, out)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
 | 
			
		||||
		writeFlag(flag, out)
 | 
			
		||||
		if len(flag.Shorthand) > 0 {
 | 
			
		||||
			writeShortFlag(flag, out)
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(out, "\n")
 | 
			
		||||
}
 | 
			
		||||
@@ -380,6 +396,11 @@ func (cmd *Command) MarkFlagRequired(name string) error {
 | 
			
		||||
	return MarkFlagRequired(cmd.Flags(), name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag, if it exists.
 | 
			
		||||
func (cmd *Command) MarkPersistentFlagRequired(name string) error {
 | 
			
		||||
	return MarkFlagRequired(cmd.PersistentFlags(), name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag in the flag set, if it exists.
 | 
			
		||||
func MarkFlagRequired(flags *pflag.FlagSet, name string) error {
 | 
			
		||||
	return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"})
 | 
			
		||||
@@ -391,6 +412,12 @@ func (cmd *Command) MarkFlagFilename(name string, extensions ...string) error {
 | 
			
		||||
	return MarkFlagFilename(cmd.Flags(), name, extensions...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists.
 | 
			
		||||
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
 | 
			
		||||
func (cmd *Command) MarkPersistentFlagFilename(name string, extensions ...string) error {
 | 
			
		||||
	return MarkFlagFilename(cmd.PersistentFlags(), name, extensions...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists.
 | 
			
		||||
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
 | 
			
		||||
func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										128
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/add.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
// Copyright © 2015 Steve Francia <spf@spf13.com>.
 | 
			
		||||
//
 | 
			
		||||
// 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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	RootCmd.AddCommand(addCmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var pName string
 | 
			
		||||
 | 
			
		||||
// initialize Command
 | 
			
		||||
var addCmd = &cobra.Command{
 | 
			
		||||
	Use:     "add [command name]",
 | 
			
		||||
	Aliases: []string{"command"},
 | 
			
		||||
	Short:   "Add a command to a Cobra Application",
 | 
			
		||||
	Long: `Add (cobra add) will create a new command, with a license and
 | 
			
		||||
the appropriate structure for a Cobra-based CLI application,
 | 
			
		||||
and register it to its parent (default RootCmd).
 | 
			
		||||
 | 
			
		||||
If you want your command to be public, pass in the command name
 | 
			
		||||
with an initial uppercase letter.
 | 
			
		||||
 | 
			
		||||
Example: cobra add server  -> resulting in a new cmd/server.go
 | 
			
		||||
  `,
 | 
			
		||||
 | 
			
		||||
	Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
		if len(args) != 1 {
 | 
			
		||||
			er("add needs a name for the command")
 | 
			
		||||
		}
 | 
			
		||||
		guessProjectPath()
 | 
			
		||||
		createCmdFile(args[0])
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	addCmd.Flags().StringVarP(&pName, "parent", "p", "RootCmd", "name of parent command for this command")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parentName() string {
 | 
			
		||||
	if !strings.HasSuffix(strings.ToLower(pName), "cmd") {
 | 
			
		||||
		return pName + "Cmd"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return pName
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createCmdFile(cmdName string) {
 | 
			
		||||
	lic := getLicense()
 | 
			
		||||
 | 
			
		||||
	template := `{{ comment .copyright }}
 | 
			
		||||
{{ comment .license }}
 | 
			
		||||
 | 
			
		||||
package cmd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// {{.cmdName}}Cmd represents the {{.cmdName}} command
 | 
			
		||||
var {{ .cmdName }}Cmd = &cobra.Command{
 | 
			
		||||
	Use:   "{{ .cmdName }}",
 | 
			
		||||
	Short: "A brief description of your command",
 | 
			
		||||
	Long: ` + "`" + `A longer description that spans multiple lines and likely contains examples
 | 
			
		||||
and usage of using your command. For example:
 | 
			
		||||
 | 
			
		||||
Cobra is a CLI library for Go that empowers applications.
 | 
			
		||||
This application is a tool to generate the needed files
 | 
			
		||||
to quickly create a Cobra application.` + "`" + `,
 | 
			
		||||
	Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
		// TODO: Work your own magic here
 | 
			
		||||
		fmt.Println("{{ .cmdName }} called")
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	{{ .parentName }}.AddCommand({{ .cmdName }}Cmd)
 | 
			
		||||
 | 
			
		||||
	// Here you will define your flags and configuration settings.
 | 
			
		||||
 | 
			
		||||
	// Cobra supports Persistent Flags which will work for this command
 | 
			
		||||
	// and all subcommands, e.g.:
 | 
			
		||||
	// {{.cmdName}}Cmd.PersistentFlags().String("foo", "", "A help for foo")
 | 
			
		||||
 | 
			
		||||
	// Cobra supports local flags which will only run when this command
 | 
			
		||||
	// is called directly, e.g.:
 | 
			
		||||
	// {{.cmdName}}Cmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
	var data map[string]interface{}
 | 
			
		||||
	data = make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	data["copyright"] = copyrightLine()
 | 
			
		||||
	data["license"] = lic.Header
 | 
			
		||||
	data["appName"] = projectName()
 | 
			
		||||
	data["viper"] = viper.GetBool("useViper")
 | 
			
		||||
	data["parentName"] = parentName()
 | 
			
		||||
	data["cmdName"] = cmdName
 | 
			
		||||
 | 
			
		||||
	err := writeTemplateToFile(filepath.Join(ProjectPath(), guessCmdDir()), cmdName+".go", template, data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		er(err)
 | 
			
		||||
	}
 | 
			
		||||
	fmt.Println(cmdName, "created at", filepath.Join(ProjectPath(), guessCmdDir(), cmdName+".go"))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										347
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/helpers.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,347 @@
 | 
			
		||||
// Copyright © 2015 Steve Francia <spf@spf13.com>.
 | 
			
		||||
//
 | 
			
		||||
// 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 (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"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"}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	funcMap = template.FuncMap{
 | 
			
		||||
		"comment": commentifyString,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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.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) {
 | 
			
		||||
			// 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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
	}
 | 
			
		||||
	fi, err := os.Stat(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, 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
 | 
			
		||||
		}
 | 
			
		||||
		list, err := f.Readdir(-1)
 | 
			
		||||
		// f.Close() - see bug fix above
 | 
			
		||||
		return len(list) == 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	return fi.Size() == 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
	}
 | 
			
		||||
	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 = safeWriteToDisk(filename, r)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeStringToFile(path, file, text string) error {
 | 
			
		||||
	filename := filepath.Join(path, file)
 | 
			
		||||
 | 
			
		||||
	r := strings.NewReader(text)
 | 
			
		||||
	err := safeWriteToDisk(filename, r)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
 | 
			
		||||
	if ospath != "" {
 | 
			
		||||
		err = os.MkdirAll(ospath, 0777) // rwx, rw, r
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ex, err := exists(inpath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if ex {
 | 
			
		||||
		return fmt.Errorf("%v already exists", inpath)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	file, err := os.Create(inpath)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
	return matchLicense(viper.GetString("license"))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func copyrightLine() string {
 | 
			
		||||
	author := viper.GetString("author")
 | 
			
		||||
	year := time.Now().Format("2006")
 | 
			
		||||
 | 
			
		||||
	return "Copyright © " + year + " " + author
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
				newlines = append(newlines, "//")
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			newlines = append(newlines, x)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return strings.Join(newlines, "\n")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										226
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/init.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,226 @@
 | 
			
		||||
// Copyright © 2015 Steve Francia <spf@spf13.com>.
 | 
			
		||||
//
 | 
			
		||||
// 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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	RootCmd.AddCommand(initCmd)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// initialize Command
 | 
			
		||||
var initCmd = &cobra.Command{
 | 
			
		||||
	Use:     "init [name]",
 | 
			
		||||
	Aliases: []string{"initialize", "initalise", "create"},
 | 
			
		||||
	Short:   "Initalize a Cobra Application",
 | 
			
		||||
	Long: `Initialize (cobra init) will create a new application, with a license
 | 
			
		||||
and the appropriate structure for a Cobra-based CLI application.
 | 
			
		||||
 | 
			
		||||
  * If a name is provided, it will be created in the current directory;
 | 
			
		||||
  * If no name is provided, the current directory will be assumed;
 | 
			
		||||
  * If a relative path is provided, it will be created inside $GOPATH
 | 
			
		||||
    (e.g. github.com/spf13/hugo);
 | 
			
		||||
  * If an absolute path is provided, it will be created;
 | 
			
		||||
  * If the directory already exists but is empty, it will be used.
 | 
			
		||||
 | 
			
		||||
Init will not use an exiting directory with contents.`,
 | 
			
		||||
 | 
			
		||||
	Run: func(cmd *cobra.Command, args []string) {
 | 
			
		||||
		switch len(args) {
 | 
			
		||||
		case 0:
 | 
			
		||||
			inputPath = ""
 | 
			
		||||
 | 
			
		||||
		case 1:
 | 
			
		||||
			inputPath = args[0]
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			er("init doesn't support more than 1 parameter")
 | 
			
		||||
		}
 | 
			
		||||
		guessProjectPath()
 | 
			
		||||
		initalizePath(projectPath)
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initalizePath(path string) {
 | 
			
		||||
	b, err := exists(path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		er(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !b { // If path doesn't yet exist, create it
 | 
			
		||||
		err := os.MkdirAll(path, os.ModePerm)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			er(err)
 | 
			
		||||
		}
 | 
			
		||||
	} else { // If path exists and is not empty don't use it
 | 
			
		||||
		empty, err := exists(path)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			er(err)
 | 
			
		||||
		}
 | 
			
		||||
		if !empty {
 | 
			
		||||
			er("Cobra will not create a new project in a non empty directory")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// We have a directory and it's empty.. Time to initialize it.
 | 
			
		||||
 | 
			
		||||
	createLicenseFile()
 | 
			
		||||
	createMainFile()
 | 
			
		||||
	createRootCmdFile()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createLicenseFile() {
 | 
			
		||||
	lic := getLicense()
 | 
			
		||||
 | 
			
		||||
	template := lic.Text
 | 
			
		||||
 | 
			
		||||
	var data map[string]interface{}
 | 
			
		||||
	data = make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	// Try to remove the email address, if any
 | 
			
		||||
	data["copyright"] = strings.Split(copyrightLine(), " <")[0]
 | 
			
		||||
 | 
			
		||||
	err := writeTemplateToFile(ProjectPath(), "LICENSE", template, data)
 | 
			
		||||
	_ = err
 | 
			
		||||
	// if err != nil {
 | 
			
		||||
	// 	er(err)
 | 
			
		||||
	// }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createMainFile() {
 | 
			
		||||
	lic := getLicense()
 | 
			
		||||
 | 
			
		||||
	template := `{{ comment .copyright }}
 | 
			
		||||
{{ comment .license }}
 | 
			
		||||
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import "{{ .importpath }}"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	cmd.Execute()
 | 
			
		||||
}
 | 
			
		||||
`
 | 
			
		||||
	var data map[string]interface{}
 | 
			
		||||
	data = make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	data["copyright"] = copyrightLine()
 | 
			
		||||
	data["license"] = lic.Header
 | 
			
		||||
	data["importpath"] = guessImportPath() + "/" + guessCmdDir()
 | 
			
		||||
 | 
			
		||||
	err := writeTemplateToFile(ProjectPath(), "main.go", template, data)
 | 
			
		||||
	_ = err
 | 
			
		||||
	// if err != nil {
 | 
			
		||||
	// 	er(err)
 | 
			
		||||
	// }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createRootCmdFile() {
 | 
			
		||||
	lic := getLicense()
 | 
			
		||||
 | 
			
		||||
	template := `{{ comment .copyright }}
 | 
			
		||||
{{ comment .license }}
 | 
			
		||||
 | 
			
		||||
package cmd
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
{{ if .viper }}	"github.com/spf13/viper"
 | 
			
		||||
{{ end }})
 | 
			
		||||
{{if .viper}}
 | 
			
		||||
var cfgFile string
 | 
			
		||||
{{ end }}
 | 
			
		||||
// This represents the base command when called without any subcommands
 | 
			
		||||
var RootCmd = &cobra.Command{
 | 
			
		||||
	Use:   "{{ .appName }}",
 | 
			
		||||
	Short: "A brief description of your application",
 | 
			
		||||
	Long: ` + "`" + `A longer description that spans multiple lines and likely contains
 | 
			
		||||
examples and usage of using your application. For example:
 | 
			
		||||
 | 
			
		||||
Cobra is a CLI library for Go that empowers applications.
 | 
			
		||||
This application is a tool to generate the needed files
 | 
			
		||||
to quickly create a Cobra application.` + "`" + `,
 | 
			
		||||
// Uncomment the following line if your bare application
 | 
			
		||||
// has an action associated with it:
 | 
			
		||||
//	Run: func(cmd *cobra.Command, args []string) { },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Execute adds all child commands to the root command sets flags appropriately.
 | 
			
		||||
// This is called by main.main(). It only needs to happen once to the rootCmd.
 | 
			
		||||
func Execute() {
 | 
			
		||||
	if err := RootCmd.Execute(); err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		os.Exit(-1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
{{ if .viper }}	cobra.OnInitialize(initConfig)
 | 
			
		||||
 | 
			
		||||
{{ end }}	// Here you will define your flags and configuration settings.
 | 
			
		||||
	// Cobra supports Persistent Flags, which, if defined here,
 | 
			
		||||
	// will be global for your application.
 | 
			
		||||
{{ if .viper }}
 | 
			
		||||
	RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)")
 | 
			
		||||
{{ else }}
 | 
			
		||||
	// RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)")
 | 
			
		||||
{{ end }}	// Cobra also supports local flags, which will only run
 | 
			
		||||
	// when this action is called directly.
 | 
			
		||||
	RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
 | 
			
		||||
}
 | 
			
		||||
{{ if .viper }}
 | 
			
		||||
// initConfig reads in config file and ENV variables if set.
 | 
			
		||||
func initConfig() {
 | 
			
		||||
	if cfgFile != "" { // enable ability to specify config file via flag
 | 
			
		||||
		viper.SetConfigFile(cfgFile)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	viper.SetConfigName(".{{ .appName }}") // name of config file (without extension)
 | 
			
		||||
	viper.AddConfigPath("$HOME")  // adding home directory as first search path
 | 
			
		||||
	viper.AutomaticEnv()          // read in environment variables that match
 | 
			
		||||
 | 
			
		||||
	// If a config file is found, read it in.
 | 
			
		||||
	if err := viper.ReadInConfig(); err == nil {
 | 
			
		||||
		fmt.Println("Using config file:", viper.ConfigFileUsed())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
{{ end }}`
 | 
			
		||||
 | 
			
		||||
	var data map[string]interface{}
 | 
			
		||||
	data = make(map[string]interface{})
 | 
			
		||||
 | 
			
		||||
	data["copyright"] = copyrightLine()
 | 
			
		||||
	data["license"] = lic.Header
 | 
			
		||||
	data["appName"] = projectName()
 | 
			
		||||
	data["viper"] = viper.GetBool("useViper")
 | 
			
		||||
 | 
			
		||||
	err := writeTemplateToFile(ProjectPath()+string(os.PathSeparator)+guessCmdDir(), "root.go", template, data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		er(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Your Cobra application is ready at")
 | 
			
		||||
	fmt.Println(ProjectPath())
 | 
			
		||||
	fmt.Println("Give it a try by going there and running `go run main.go`")
 | 
			
		||||
	fmt.Println("Add commands to it by running `cobra add [cmdname]`")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1133
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1133
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/licenses.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										84
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/cmd/root.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
// Copyright © 2015 Steve Francia <spf@spf13.com>.
 | 
			
		||||
//
 | 
			
		||||
// 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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var cfgFile string
 | 
			
		||||
var userLicense string
 | 
			
		||||
 | 
			
		||||
// This represents the base command when called without any subcommands
 | 
			
		||||
var RootCmd = &cobra.Command{
 | 
			
		||||
	Use:   "cobra",
 | 
			
		||||
	Short: "A generator for Cobra based Applications",
 | 
			
		||||
	Long: `Cobra is a CLI library for Go that empowers applications.
 | 
			
		||||
This application is a tool to generate the needed files
 | 
			
		||||
to quickly create a Cobra application.`,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Execute adds all child commands to the root command sets flags appropriately.
 | 
			
		||||
func Execute() {
 | 
			
		||||
	if err := RootCmd.Execute(); err != nil {
 | 
			
		||||
		fmt.Println(err)
 | 
			
		||||
		os.Exit(-1)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	cobra.OnInitialize(initConfig)
 | 
			
		||||
	RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
 | 
			
		||||
	RootCmd.PersistentFlags().StringVarP(&projectBase, "projectbase", "b", "", "base project directory, e.g. github.com/spf13/")
 | 
			
		||||
	RootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "Author name for copyright attribution")
 | 
			
		||||
	RootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "Name of license for the project (can provide `licensetext` in config)")
 | 
			
		||||
	RootCmd.PersistentFlags().Bool("viper", true, "Use Viper for configuration")
 | 
			
		||||
	viper.BindPFlag("author", RootCmd.PersistentFlags().Lookup("author"))
 | 
			
		||||
	viper.BindPFlag("projectbase", RootCmd.PersistentFlags().Lookup("projectbase"))
 | 
			
		||||
	viper.BindPFlag("useViper", RootCmd.PersistentFlags().Lookup("viper"))
 | 
			
		||||
	viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
 | 
			
		||||
	viper.SetDefault("license", "apache")
 | 
			
		||||
	viper.SetDefault("licenseText", `
 | 
			
		||||
// 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.
 | 
			
		||||
`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Read in config file and ENV variables if set.
 | 
			
		||||
func initConfig() {
 | 
			
		||||
	if cfgFile != "" { // enable ability to specify config file via flag
 | 
			
		||||
		viper.SetConfigFile(cfgFile)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	viper.SetConfigName(".cobra") // name of config file (without extension)
 | 
			
		||||
	viper.AddConfigPath("$HOME")  // adding home directory as first search path
 | 
			
		||||
	viper.AutomaticEnv()          // read in environment variables that match
 | 
			
		||||
 | 
			
		||||
	// If a config file is found, read it in.
 | 
			
		||||
	if err := viper.ReadInConfig(); err == nil {
 | 
			
		||||
		fmt.Println("Using config file:", viper.ConfigFileUsed())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/cobra/main.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
// Copyright © 2015 Steve Francia <spf@spf13.com>.
 | 
			
		||||
//
 | 
			
		||||
// 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 main
 | 
			
		||||
 | 
			
		||||
import "github.com/spf13/cobra/cobra/cmd"
 | 
			
		||||
 | 
			
		||||
func main() {
 | 
			
		||||
	cmd.Execute()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/command.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,6 +20,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
@@ -61,6 +62,10 @@ type Command struct {
 | 
			
		||||
	pflags *flag.FlagSet
 | 
			
		||||
	// Flags that are declared specifically by this command (not inherited).
 | 
			
		||||
	lflags *flag.FlagSet
 | 
			
		||||
	// SilenceErrors is an option to quiet errors down stream
 | 
			
		||||
	SilenceErrors bool
 | 
			
		||||
	// Silence Usage is an option to silence usage when an error occurs.
 | 
			
		||||
	SilenceUsage bool
 | 
			
		||||
	// The *Run functions are executed in the following order:
 | 
			
		||||
	//   * PersistentPreRun()
 | 
			
		||||
	//   * PreRun()
 | 
			
		||||
@@ -88,6 +93,8 @@ type Command struct {
 | 
			
		||||
	PersistentPostRun func(cmd *Command, args []string)
 | 
			
		||||
	// PersistentPostRunE: PersistentPostRun but returns an error
 | 
			
		||||
	PersistentPostRunE func(cmd *Command, args []string) error
 | 
			
		||||
	// DisableAutoGenTag remove
 | 
			
		||||
	DisableAutoGenTag bool
 | 
			
		||||
	// Commands is the list of commands supported by this program.
 | 
			
		||||
	commands []*Command
 | 
			
		||||
	// Parent Command for this command
 | 
			
		||||
@@ -469,20 +476,38 @@ func (c *Command) SuggestionsFor(typedName string) []string {
 | 
			
		||||
	return suggestions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Command) VisitParents(fn func(*Command)) {
 | 
			
		||||
	var traverse func(*Command) *Command
 | 
			
		||||
 | 
			
		||||
	traverse = func(x *Command) *Command {
 | 
			
		||||
		if x != c {
 | 
			
		||||
			fn(x)
 | 
			
		||||
		}
 | 
			
		||||
		if x.HasParent() {
 | 
			
		||||
			return traverse(x.parent)
 | 
			
		||||
		}
 | 
			
		||||
		return x
 | 
			
		||||
	}
 | 
			
		||||
	traverse(c)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Command) Root() *Command {
 | 
			
		||||
	var findRoot func(*Command) *Command
 | 
			
		||||
 | 
			
		||||
	findRoot = func(x *Command) *Command {
 | 
			
		||||
		if x.HasParent() {
 | 
			
		||||
			return findRoot(x.parent)
 | 
			
		||||
		} else {
 | 
			
		||||
			return x
 | 
			
		||||
		}
 | 
			
		||||
		return x
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return findRoot(c)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ArgsLenAtDash will return the length of f.Args at the moment when a -- was
 | 
			
		||||
// found during arg parsing. This allows your program to know which args were
 | 
			
		||||
// before the -- and which came after. (Description from
 | 
			
		||||
// https://godoc.org/github.com/spf13/pflag#FlagSet.ArgsLenAtDash).
 | 
			
		||||
func (c *Command) ArgsLenAtDash() int {
 | 
			
		||||
	return c.Flags().ArgsLenAtDash()
 | 
			
		||||
}
 | 
			
		||||
@@ -589,11 +614,16 @@ func (c *Command) errorMsgFromParse() string {
 | 
			
		||||
// Call execute to use the args (os.Args[1:] by default)
 | 
			
		||||
// and run through the command tree finding appropriate matches
 | 
			
		||||
// for commands and then corresponding flags.
 | 
			
		||||
func (c *Command) Execute() (err error) {
 | 
			
		||||
func (c *Command) Execute() error {
 | 
			
		||||
	_, err := c.ExecuteC()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Command) ExecuteC() (cmd *Command, err error) {
 | 
			
		||||
 | 
			
		||||
	// Regardless of what command execute is called on, run on Root only
 | 
			
		||||
	if c.HasParent() {
 | 
			
		||||
		return c.Root().Execute()
 | 
			
		||||
		return c.Root().ExecuteC()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if EnableWindowsMouseTrap && runtime.GOOS == "windows" {
 | 
			
		||||
@@ -610,7 +640,8 @@ func (c *Command) Execute() (err error) {
 | 
			
		||||
 | 
			
		||||
	var args []string
 | 
			
		||||
 | 
			
		||||
	if len(c.args) == 0 {
 | 
			
		||||
	// Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155
 | 
			
		||||
	if len(c.args) == 0 && filepath.Base(os.Args[0]) != "cobra.test" {
 | 
			
		||||
		args = os.Args[1:]
 | 
			
		||||
	} else {
 | 
			
		||||
		args = c.args
 | 
			
		||||
@@ -622,22 +653,32 @@ func (c *Command) Execute() (err error) {
 | 
			
		||||
		if cmd != nil {
 | 
			
		||||
			c = cmd
 | 
			
		||||
		}
 | 
			
		||||
		c.Println("Error:", err.Error())
 | 
			
		||||
		c.Printf("Run '%v --help' for usage.\n", c.CommandPath())
 | 
			
		||||
		return err
 | 
			
		||||
		if !c.SilenceErrors {
 | 
			
		||||
			c.Println("Error:", err.Error())
 | 
			
		||||
			c.Printf("Run '%v --help' for usage.\n", c.CommandPath())
 | 
			
		||||
		}
 | 
			
		||||
		return c, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = cmd.execute(flags)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if err == flag.ErrHelp {
 | 
			
		||||
			cmd.HelpFunc()(cmd, args)
 | 
			
		||||
			return nil
 | 
			
		||||
		// If root command has SilentErrors flagged,
 | 
			
		||||
		// all subcommands should respect it
 | 
			
		||||
		if !cmd.SilenceErrors && !c.SilenceErrors {
 | 
			
		||||
			if err == flag.ErrHelp {
 | 
			
		||||
				cmd.HelpFunc()(cmd, args)
 | 
			
		||||
				return cmd, nil
 | 
			
		||||
			}
 | 
			
		||||
			c.Println("Error:", err.Error())
 | 
			
		||||
		}
 | 
			
		||||
		c.Println(cmd.UsageString())
 | 
			
		||||
		c.Println("Error:", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
		// If root command has SilentUsage flagged,
 | 
			
		||||
		// all subcommands should respect it
 | 
			
		||||
		if !cmd.SilenceUsage && !c.SilenceUsage {
 | 
			
		||||
			c.Println(cmd.UsageString())
 | 
			
		||||
		}
 | 
			
		||||
		return cmd, err
 | 
			
		||||
	}
 | 
			
		||||
	return cmd, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Command) initHelpFlag() {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										36
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/man_docs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/man_docs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -47,8 +47,14 @@ func (cmd *Command) GenManTree(header *GenManHeader, dir string) {
 | 
			
		||||
	}
 | 
			
		||||
	out := new(bytes.Buffer)
 | 
			
		||||
 | 
			
		||||
	needToResetTitle := header.Title == ""
 | 
			
		||||
 | 
			
		||||
	cmd.GenMan(header, out)
 | 
			
		||||
 | 
			
		||||
	if needToResetTitle {
 | 
			
		||||
		header.Title = ""
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	filename := cmd.CommandPath()
 | 
			
		||||
	filename = dir + strings.Replace(filename, " ", "-", -1) + ".1"
 | 
			
		||||
	outFile, err := os.Create(filename)
 | 
			
		||||
@@ -95,7 +101,7 @@ func (cmd *Command) GenMan(header *GenManHeader, out *bytes.Buffer) {
 | 
			
		||||
 | 
			
		||||
func fillHeader(header *GenManHeader, name string) {
 | 
			
		||||
	if header.Title == "" {
 | 
			
		||||
		header.Title = name
 | 
			
		||||
		header.Title = strings.ToUpper(strings.Replace(name, " ", "\\-", -1))
 | 
			
		||||
	}
 | 
			
		||||
	if header.Section == "" {
 | 
			
		||||
		header.Section = "1"
 | 
			
		||||
@@ -111,12 +117,13 @@ func fillHeader(header *GenManHeader, name string) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func manPreamble(out *bytes.Buffer, header *GenManHeader, name, short, long string) {
 | 
			
		||||
	dashName := strings.Replace(name, " ", "-", -1)
 | 
			
		||||
	fmt.Fprintf(out, `%% %s(%s)%s
 | 
			
		||||
%% %s
 | 
			
		||||
%% %s
 | 
			
		||||
# NAME
 | 
			
		||||
`, header.Title, header.Section, header.date, header.Source, header.Manual)
 | 
			
		||||
	fmt.Fprintf(out, "%s \\- %s\n\n", name, short)
 | 
			
		||||
	fmt.Fprintf(out, "%s \\- %s\n\n", dashName, short)
 | 
			
		||||
	fmt.Fprintf(out, "# SYNOPSIS\n")
 | 
			
		||||
	fmt.Fprintf(out, "**%s** [OPTIONS]\n\n", name)
 | 
			
		||||
	fmt.Fprintf(out, "# DESCRIPTION\n")
 | 
			
		||||
@@ -167,12 +174,13 @@ func manPrintOptions(out *bytes.Buffer, command *Command) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func genMarkdown(cmd *Command, header *GenManHeader) []byte {
 | 
			
		||||
	fillHeader(header, cmd.Name())
 | 
			
		||||
	// something like `rootcmd subcmd1 subcmd2`
 | 
			
		||||
	commandName := cmd.CommandPath()
 | 
			
		||||
	// something like `rootcmd-subcmd1-subcmd2`
 | 
			
		||||
	dashCommandName := strings.Replace(commandName, " ", "-", -1)
 | 
			
		||||
 | 
			
		||||
	fillHeader(header, commandName)
 | 
			
		||||
 | 
			
		||||
	buf := new(bytes.Buffer)
 | 
			
		||||
 | 
			
		||||
	short := cmd.Short
 | 
			
		||||
@@ -183,31 +191,37 @@ func genMarkdown(cmd *Command, header *GenManHeader) []byte {
 | 
			
		||||
 | 
			
		||||
	manPreamble(buf, header, commandName, short, long)
 | 
			
		||||
	manPrintOptions(buf, cmd)
 | 
			
		||||
 | 
			
		||||
	if len(cmd.Example) > 0 {
 | 
			
		||||
		fmt.Fprintf(buf, "# EXAMPLE\n")
 | 
			
		||||
		fmt.Fprintf(buf, "```\n%s\n```\n", cmd.Example)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if cmd.hasSeeAlso() {
 | 
			
		||||
		fmt.Fprintf(buf, "# SEE ALSO\n")
 | 
			
		||||
		if cmd.HasParent() {
 | 
			
		||||
			parentPath := cmd.Parent().CommandPath()
 | 
			
		||||
			dashParentPath := strings.Replace(parentPath, " ", "-", -1)
 | 
			
		||||
			fmt.Fprintf(buf, "**%s(%s)**, ", dashParentPath, header.Section)
 | 
			
		||||
			fmt.Fprintf(buf, "**%s(%s)**", dashParentPath, header.Section)
 | 
			
		||||
			cmd.VisitParents(func(c *Command) {
 | 
			
		||||
				if c.DisableAutoGenTag {
 | 
			
		||||
					cmd.DisableAutoGenTag = c.DisableAutoGenTag
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		children := cmd.Commands()
 | 
			
		||||
		sort.Sort(byName(children))
 | 
			
		||||
		for _, c := range children {
 | 
			
		||||
		for i, c := range children {
 | 
			
		||||
			if !c.IsAvailableCommand() || c == cmd.helpCommand {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Fprintf(buf, "**%s-%s(%s)**, ", dashCommandName, c.Name(), header.Section)
 | 
			
		||||
			if cmd.HasParent() || i > 0 {
 | 
			
		||||
				fmt.Fprintf(buf, ", ")
 | 
			
		||||
			}
 | 
			
		||||
			fmt.Fprintf(buf, "**%s-%s(%s)**", dashCommandName, c.Name(), header.Section)
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Fprintf(buf, "\n")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(buf, "# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006"))
 | 
			
		||||
	if !cmd.DisableAutoGenTag {
 | 
			
		||||
		fmt.Fprintf(buf, "# HISTORY\n%s Auto generated by spf13/cobra\n", header.Date.Format("2-Jan-2006"))
 | 
			
		||||
	}
 | 
			
		||||
	return buf.Bytes()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/man_docs.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/man_docs.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
# Generating Man Pages For Your Own cobra.Command
 | 
			
		||||
 | 
			
		||||
Generating bash completions from a cobra command is incredibly easy. An example is as follows:
 | 
			
		||||
Generating man pages from a cobra command is incredibly easy. An example is as follows:
 | 
			
		||||
 | 
			
		||||
```go
 | 
			
		||||
package main
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/md_docs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								Godeps/_workspace/src/github.com/spf13/cobra/md_docs.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -82,7 +82,6 @@ func (cmd *Command) GenMarkdownCustom(out *bytes.Buffer, linkHandler func(string
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	printOptions(out, cmd, name)
 | 
			
		||||
 | 
			
		||||
	if cmd.hasSeeAlso() {
 | 
			
		||||
		fmt.Fprintf(out, "### SEE ALSO\n")
 | 
			
		||||
		if cmd.HasParent() {
 | 
			
		||||
@@ -91,6 +90,11 @@ func (cmd *Command) GenMarkdownCustom(out *bytes.Buffer, linkHandler func(string
 | 
			
		||||
			link := pname + ".md"
 | 
			
		||||
			link = strings.Replace(link, " ", "_", -1)
 | 
			
		||||
			fmt.Fprintf(out, "* [%s](%s)\t - %s\n", pname, linkHandler(link), parent.Short)
 | 
			
		||||
			cmd.VisitParents(func(c *Command) {
 | 
			
		||||
				if c.DisableAutoGenTag {
 | 
			
		||||
					cmd.DisableAutoGenTag = c.DisableAutoGenTag
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		children := cmd.Commands()
 | 
			
		||||
@@ -107,8 +111,9 @@ func (cmd *Command) GenMarkdownCustom(out *bytes.Buffer, linkHandler func(string
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Fprintf(out, "\n")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fmt.Fprintf(out, "###### Auto generated by spf13/cobra on %s\n", time.Now().Format("2-Jan-2006"))
 | 
			
		||||
	if !cmd.DisableAutoGenTag {
 | 
			
		||||
		fmt.Fprintf(out, "###### Auto generated by spf13/cobra on %s\n", time.Now().Format("2-Jan-2006"))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GenMarkdownTree(cmd *Command, dir string) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user