Add cobra generator application
This commit is contained in:
		
							
								
								
									
										347
									
								
								cobra/cmd/helpers.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										347
									
								
								cobra/cmd/helpers.go
									
									
									
									
									
										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 strings.TrimPrefix(projectPath, getSrcPath())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getSrcPath() string {
 | 
				
			||||||
 | 
						return os.Getenv("GOPATH") + string(os.PathSeparator) + "src" + string(os.PathSeparator)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func projectName() string {
 | 
				
			||||||
 | 
						pp := ProjectPath()
 | 
				
			||||||
 | 
						return filepath.Dir(pp)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 {
 | 
				
			||||||
 | 
								fmt.Print(c)
 | 
				
			||||||
 | 
								if base == c {
 | 
				
			||||||
 | 
									projectPath = filepath.Dir(x)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if projectPath == "" {
 | 
				
			||||||
 | 
								projectPath = 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 = 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 = srcPath + "github.com" + string(os.PathSeparator) + inputPath
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							case 2:
 | 
				
			||||||
 | 
								projectPath = srcPath + inputPath
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								er("Unknown directory")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// hardest case.. just a word.
 | 
				
			||||||
 | 
							if projectBase == "" {
 | 
				
			||||||
 | 
								x, err := getWd()
 | 
				
			||||||
 | 
								if err == nil {
 | 
				
			||||||
 | 
									projectPath = x + string(os.PathSeparator) + inputPath
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								er(err)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								projectPath = srcPath + projectBase + string(os.PathSeparator) + 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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Println(filename)
 | 
				
			||||||
 | 
						r, err := templateToReader(template, data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Println("err:", err)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = safeWriteToDisk(filename, r)
 | 
				
			||||||
 | 
						fmt.Println("err:", err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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:Inpect 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, "//") {
 | 
				
			||||||
 | 
								newlines = append(newlines, "// "+x)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								newlines = append(newlines, x)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return strings.Join(newlines, "\n")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										38
									
								
								cobra/cmd/helpers_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								cobra/cmd/helpers_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					package cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ = fmt.Println
 | 
				
			||||||
 | 
					var _ = os.Stderr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func checkGuess(t *testing.T, wd, input, expected string) {
 | 
				
			||||||
 | 
						testWd = wd
 | 
				
			||||||
 | 
						inputPath = input
 | 
				
			||||||
 | 
						guessProjectPath()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if projectPath != expected {
 | 
				
			||||||
 | 
							t.Errorf("Unexpected Project Path. \n Got: %q\nExpected: %q\n", projectPath, expected)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reset()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func reset() {
 | 
				
			||||||
 | 
						testWd = ""
 | 
				
			||||||
 | 
						inputPath = ""
 | 
				
			||||||
 | 
						projectPath = ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestProjectPath(t *testing.T) {
 | 
				
			||||||
 | 
						checkGuess(t, "", "github.com/spf13/hugo", getSrcPath()+"github.com/spf13/hugo")
 | 
				
			||||||
 | 
						checkGuess(t, "", "spf13/hugo", getSrcPath()+"github.com/spf13/hugo")
 | 
				
			||||||
 | 
						checkGuess(t, "", "/bar/foo", "/bar/foo")
 | 
				
			||||||
 | 
						checkGuess(t, "/bar/foo", "baz", "/bar/foo/baz")
 | 
				
			||||||
 | 
						checkGuess(t, "/bar/foo/cmd", "", "/bar/foo")
 | 
				
			||||||
 | 
						checkGuess(t, "/bar/foo/command", "", "/bar/foo")
 | 
				
			||||||
 | 
						checkGuess(t, "/bar/foo/commands", "", "/bar/foo")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										213
									
								
								cobra/cmd/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								cobra/cmd/init.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,213 @@
 | 
				
			|||||||
 | 
					// 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 (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"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: `Initalize 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 create it in the current directory.
 | 
				
			||||||
 | 
						If no name is provided it will assume the current directory.
 | 
				
			||||||
 | 
						If a relative path is provided it will create it inside of $GOPATH (eg github.com/spf13/hugo).
 | 
				
			||||||
 | 
						If an absolute path is provided it will create it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						If the directory already exists but is empty it will use it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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()
 | 
				
			||||||
 | 
						err := writeStringToFile(ProjectPath(), "LICENSE", lic.Text)
 | 
				
			||||||
 | 
						_ = 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 }}
 | 
				
			||||||
 | 
					// 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(".{{ .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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										435
									
								
								cobra/cmd/licenses.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										435
									
								
								cobra/cmd/licenses.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,435 @@
 | 
				
			|||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Parts inspired by https://github.com/ryanuber/go-license
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var Licenses map[string]License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type License struct {
 | 
				
			||||||
 | 
						Name            string   // The type of license in use
 | 
				
			||||||
 | 
						PossibleMatches []string // Similar names to guess
 | 
				
			||||||
 | 
						Text            string   // License text data
 | 
				
			||||||
 | 
						Header          string   // License header for source files
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// given a license name (in), try to match the license indicated
 | 
				
			||||||
 | 
					func matchLicense(in string) string {
 | 
				
			||||||
 | 
						for key, lic := range Licenses {
 | 
				
			||||||
 | 
							for _, match := range lic.PossibleMatches {
 | 
				
			||||||
 | 
								if strings.EqualFold(in, match) {
 | 
				
			||||||
 | 
									return key
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						Licenses = make(map[string]License)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Licenses["apache"] = License{
 | 
				
			||||||
 | 
							Name:            "Apache 2.0",
 | 
				
			||||||
 | 
							PossibleMatches: []string{"apache", "apache20", "apache 2.0", "apache2.0", "apache-2.0"},
 | 
				
			||||||
 | 
							Header: `
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
							Text: `
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                 Apache License
 | 
				
			||||||
 | 
					                           Version 2.0, January 2004
 | 
				
			||||||
 | 
					                        http://www.apache.org/licenses/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   1. Definitions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "License" shall mean the terms and conditions for use, reproduction,
 | 
				
			||||||
 | 
					      and distribution as defined by Sections 1 through 9 of this document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Licensor" shall mean the copyright owner or entity authorized by
 | 
				
			||||||
 | 
					      the copyright owner that is granting the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Legal Entity" shall mean the union of the acting entity and all
 | 
				
			||||||
 | 
					      other entities that control, are controlled by, or are under common
 | 
				
			||||||
 | 
					      control with that entity. For the purposes of this definition,
 | 
				
			||||||
 | 
					      "control" means (i) the power, direct or indirect, to cause the
 | 
				
			||||||
 | 
					      direction or management of such entity, whether by contract or
 | 
				
			||||||
 | 
					      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
				
			||||||
 | 
					      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "You" (or "Your") shall mean an individual or Legal Entity
 | 
				
			||||||
 | 
					      exercising permissions granted by this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Source" form shall mean the preferred form for making modifications,
 | 
				
			||||||
 | 
					      including but not limited to software source code, documentation
 | 
				
			||||||
 | 
					      source, and configuration files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Object" form shall mean any form resulting from mechanical
 | 
				
			||||||
 | 
					      transformation or translation of a Source form, including but
 | 
				
			||||||
 | 
					      not limited to compiled object code, generated documentation,
 | 
				
			||||||
 | 
					      and conversions to other media types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Work" shall mean the work of authorship, whether in Source or
 | 
				
			||||||
 | 
					      Object form, made available under the License, as indicated by a
 | 
				
			||||||
 | 
					      copyright notice that is included in or attached to the work
 | 
				
			||||||
 | 
					      (an example is provided in the Appendix below).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Derivative Works" shall mean any work, whether in Source or Object
 | 
				
			||||||
 | 
					      form, that is based on (or derived from) the Work and for which the
 | 
				
			||||||
 | 
					      editorial revisions, annotations, elaborations, or other modifications
 | 
				
			||||||
 | 
					      represent, as a whole, an original work of authorship. For the purposes
 | 
				
			||||||
 | 
					      of this License, Derivative Works shall not include works that remain
 | 
				
			||||||
 | 
					      separable from, or merely link (or bind by name) to the interfaces of,
 | 
				
			||||||
 | 
					      the Work and Derivative Works thereof.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Contribution" shall mean any work of authorship, including
 | 
				
			||||||
 | 
					      the original version of the Work and any modifications or additions
 | 
				
			||||||
 | 
					      to that Work or Derivative Works thereof, that is intentionally
 | 
				
			||||||
 | 
					      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
				
			||||||
 | 
					      or by an individual or Legal Entity authorized to submit on behalf of
 | 
				
			||||||
 | 
					      the copyright owner. For the purposes of this definition, "submitted"
 | 
				
			||||||
 | 
					      means any form of electronic, verbal, or written communication sent
 | 
				
			||||||
 | 
					      to the Licensor or its representatives, including but not limited to
 | 
				
			||||||
 | 
					      communication on electronic mailing lists, source code control systems,
 | 
				
			||||||
 | 
					      and issue tracking systems that are managed by, or on behalf of, the
 | 
				
			||||||
 | 
					      Licensor for the purpose of discussing and improving the Work, but
 | 
				
			||||||
 | 
					      excluding communication that is conspicuously marked or otherwise
 | 
				
			||||||
 | 
					      designated in writing by the copyright owner as "Not a Contribution."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
				
			||||||
 | 
					      on behalf of whom a Contribution has been received by Licensor and
 | 
				
			||||||
 | 
					      subsequently incorporated within the Work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
				
			||||||
 | 
					      this License, each Contributor hereby grants to You a perpetual,
 | 
				
			||||||
 | 
					      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
				
			||||||
 | 
					      copyright license to reproduce, prepare Derivative Works of,
 | 
				
			||||||
 | 
					      publicly display, publicly perform, sublicense, and distribute the
 | 
				
			||||||
 | 
					      Work and such Derivative Works in Source or Object form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   3. Grant of Patent License. Subject to the terms and conditions of
 | 
				
			||||||
 | 
					      this License, each Contributor hereby grants to You a perpetual,
 | 
				
			||||||
 | 
					      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
				
			||||||
 | 
					      (except as stated in this section) patent license to make, have made,
 | 
				
			||||||
 | 
					      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
				
			||||||
 | 
					      where such license applies only to those patent claims licensable
 | 
				
			||||||
 | 
					      by such Contributor that are necessarily infringed by their
 | 
				
			||||||
 | 
					      Contribution(s) alone or by combination of their Contribution(s)
 | 
				
			||||||
 | 
					      with the Work to which such Contribution(s) was submitted. If You
 | 
				
			||||||
 | 
					      institute patent litigation against any entity (including a
 | 
				
			||||||
 | 
					      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
				
			||||||
 | 
					      or a Contribution incorporated within the Work constitutes direct
 | 
				
			||||||
 | 
					      or contributory patent infringement, then any patent licenses
 | 
				
			||||||
 | 
					      granted to You under this License for that Work shall terminate
 | 
				
			||||||
 | 
					      as of the date such litigation is filed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   4. Redistribution. You may reproduce and distribute copies of the
 | 
				
			||||||
 | 
					      Work or Derivative Works thereof in any medium, with or without
 | 
				
			||||||
 | 
					      modifications, and in Source or Object form, provided that You
 | 
				
			||||||
 | 
					      meet the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (a) You must give any other recipients of the Work or
 | 
				
			||||||
 | 
					          Derivative Works a copy of this License; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (b) You must cause any modified files to carry prominent notices
 | 
				
			||||||
 | 
					          stating that You changed the files; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (c) You must retain, in the Source form of any Derivative Works
 | 
				
			||||||
 | 
					          that You distribute, all copyright, patent, trademark, and
 | 
				
			||||||
 | 
					          attribution notices from the Source form of the Work,
 | 
				
			||||||
 | 
					          excluding those notices that do not pertain to any part of
 | 
				
			||||||
 | 
					          the Derivative Works; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (d) If the Work includes a "NOTICE" text file as part of its
 | 
				
			||||||
 | 
					          distribution, then any Derivative Works that You distribute must
 | 
				
			||||||
 | 
					          include a readable copy of the attribution notices contained
 | 
				
			||||||
 | 
					          within such NOTICE file, excluding those notices that do not
 | 
				
			||||||
 | 
					          pertain to any part of the Derivative Works, in at least one
 | 
				
			||||||
 | 
					          of the following places: within a NOTICE text file distributed
 | 
				
			||||||
 | 
					          as part of the Derivative Works; within the Source form or
 | 
				
			||||||
 | 
					          documentation, if provided along with the Derivative Works; or,
 | 
				
			||||||
 | 
					          within a display generated by the Derivative Works, if and
 | 
				
			||||||
 | 
					          wherever such third-party notices normally appear. The contents
 | 
				
			||||||
 | 
					          of the NOTICE file are for informational purposes only and
 | 
				
			||||||
 | 
					          do not modify the License. You may add Your own attribution
 | 
				
			||||||
 | 
					          notices within Derivative Works that You distribute, alongside
 | 
				
			||||||
 | 
					          or as an addendum to the NOTICE text from the Work, provided
 | 
				
			||||||
 | 
					          that such additional attribution notices cannot be construed
 | 
				
			||||||
 | 
					          as modifying the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      You may add Your own copyright statement to Your modifications and
 | 
				
			||||||
 | 
					      may provide additional or different license terms and conditions
 | 
				
			||||||
 | 
					      for use, reproduction, or distribution of Your modifications, or
 | 
				
			||||||
 | 
					      for any such Derivative Works as a whole, provided Your use,
 | 
				
			||||||
 | 
					      reproduction, and distribution of the Work otherwise complies with
 | 
				
			||||||
 | 
					      the conditions stated in this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
				
			||||||
 | 
					      any Contribution intentionally submitted for inclusion in the Work
 | 
				
			||||||
 | 
					      by You to the Licensor shall be under the terms and conditions of
 | 
				
			||||||
 | 
					      this License, without any additional terms or conditions.
 | 
				
			||||||
 | 
					      Notwithstanding the above, nothing herein shall supersede or modify
 | 
				
			||||||
 | 
					      the terms of any separate license agreement you may have executed
 | 
				
			||||||
 | 
					      with Licensor regarding such Contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   6. Trademarks. This License does not grant permission to use the trade
 | 
				
			||||||
 | 
					      names, trademarks, service marks, or product names of the Licensor,
 | 
				
			||||||
 | 
					      except as required for reasonable and customary use in describing the
 | 
				
			||||||
 | 
					      origin of the Work and reproducing the content of the NOTICE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
				
			||||||
 | 
					      agreed to in writing, Licensor provides the Work (and each
 | 
				
			||||||
 | 
					      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
				
			||||||
 | 
					      implied, including, without limitation, any warranties or conditions
 | 
				
			||||||
 | 
					      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
				
			||||||
 | 
					      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
				
			||||||
 | 
					      appropriateness of using or redistributing the Work and assume any
 | 
				
			||||||
 | 
					      risks associated with Your exercise of permissions under this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   8. Limitation of Liability. In no event and under no legal theory,
 | 
				
			||||||
 | 
					      whether in tort (including negligence), contract, or otherwise,
 | 
				
			||||||
 | 
					      unless required by applicable law (such as deliberate and grossly
 | 
				
			||||||
 | 
					      negligent acts) or agreed to in writing, shall any Contributor be
 | 
				
			||||||
 | 
					      liable to You for damages, including any direct, indirect, special,
 | 
				
			||||||
 | 
					      incidental, or consequential damages of any character arising as a
 | 
				
			||||||
 | 
					      result of this License or out of the use or inability to use the
 | 
				
			||||||
 | 
					      Work (including but not limited to damages for loss of goodwill,
 | 
				
			||||||
 | 
					      work stoppage, computer failure or malfunction, or any and all
 | 
				
			||||||
 | 
					      other commercial damages or losses), even if such Contributor
 | 
				
			||||||
 | 
					      has been advised of the possibility of such damages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   9. Accepting Warranty or Additional Liability. While redistributing
 | 
				
			||||||
 | 
					      the Work or Derivative Works thereof, You may choose to offer,
 | 
				
			||||||
 | 
					      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
				
			||||||
 | 
					      or other liability obligations and/or rights consistent with this
 | 
				
			||||||
 | 
					      License. However, in accepting such obligations, You may act only
 | 
				
			||||||
 | 
					      on Your own behalf and on Your sole responsibility, not on behalf
 | 
				
			||||||
 | 
					      of any other Contributor, and only if You agree to indemnify,
 | 
				
			||||||
 | 
					      defend, and hold each Contributor harmless for any liability
 | 
				
			||||||
 | 
					      incurred by, or claims asserted against, such Contributor by reason
 | 
				
			||||||
 | 
					      of your accepting any such warranty or additional liability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   END OF TERMS AND CONDITIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   APPENDIX: How to apply the Apache License to your work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      To apply the Apache License to your work, attach the following
 | 
				
			||||||
 | 
					      boilerplate notice, with the fields enclosed by brackets "[]"
 | 
				
			||||||
 | 
					      replaced with your own identifying information. (Don't include
 | 
				
			||||||
 | 
					      the brackets!)  The text should be enclosed in the appropriate
 | 
				
			||||||
 | 
					      comment syntax for the file format. We also recommend that a
 | 
				
			||||||
 | 
					      file or class name and description of purpose be included on the
 | 
				
			||||||
 | 
					      same "printed page" as the copyright notice for easier
 | 
				
			||||||
 | 
					      identification within third-party archives.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Copyright [yyyy] [name of copyright owner]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   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.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Licenses["mit"] = License{
 | 
				
			||||||
 | 
							Name:            "Mit",
 | 
				
			||||||
 | 
							PossibleMatches: []string{"mit"},
 | 
				
			||||||
 | 
							Header: `
 | 
				
			||||||
 | 
					    The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					  of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					  in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					  copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					  furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					  copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					  SOFTWARE.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
							Text: `
 | 
				
			||||||
 | 
					    The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					  of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					  in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					  copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					  furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					  copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					  SOFTWARE.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Licenses["bsd"] = License{
 | 
				
			||||||
 | 
							Name:            "NewBSD",
 | 
				
			||||||
 | 
							PossibleMatches: []string{"bsd", "newbsd", "3 clause bsd"},
 | 
				
			||||||
 | 
							Header: `
 | 
				
			||||||
 | 
					    All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					    modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					        * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					          notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					        * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					          notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					          documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					        * Neither the name of the <organization> nor the
 | 
				
			||||||
 | 
					          names of its contributors may be used to endorse or promote products
 | 
				
			||||||
 | 
					          derived from this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					    DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
							Text: `
 | 
				
			||||||
 | 
					    All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					    modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					        * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					          notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					        * Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					          notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					          documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					        * Neither the name of the <organization> nor the
 | 
				
			||||||
 | 
					          names of its contributors may be used to endorse or promote products
 | 
				
			||||||
 | 
					          derived from this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					    DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 | 
				
			||||||
 | 
					    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Licenses["freebsd"] = License{
 | 
				
			||||||
 | 
							Name:            "Simplified BSD License",
 | 
				
			||||||
 | 
							PossibleMatches: []string{"freebsd", "simpbsd", "simple bsd", "2 clause bsd"},
 | 
				
			||||||
 | 
							Header: `
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					   list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					2. Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					   this list of conditions and the following disclaimer in the documentation
 | 
				
			||||||
 | 
					   and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
				
			||||||
 | 
					ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The views and conclusions contained in the software and documentation are those
 | 
				
			||||||
 | 
					of the authors and should not be interpreted as representing official policies,
 | 
				
			||||||
 | 
					either expressed or implied, of the FreeBSD Project.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
							Text: `
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					   list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					2. Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					   this list of conditions and the following disclaimer in the documentation
 | 
				
			||||||
 | 
					   and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 | 
				
			||||||
 | 
					ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | 
				
			||||||
 | 
					ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The views and conclusions contained in the software and documentation are those
 | 
				
			||||||
 | 
					of the authors and should not be interpreted as representing official policies,
 | 
				
			||||||
 | 
					either expressed or implied, of the FreeBSD Project.
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Licenses["apache20"] = License{
 | 
				
			||||||
 | 
						// 	Name:            "Apache 2.0",
 | 
				
			||||||
 | 
						// 	PossibleMatches: []string{"apache", "apache20", ""},
 | 
				
			||||||
 | 
						//   Header: `
 | 
				
			||||||
 | 
						//   `,
 | 
				
			||||||
 | 
						// 	Text: `
 | 
				
			||||||
 | 
						//   `,
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										84
									
								
								cobra/cmd/root.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								cobra/cmd/root.go
									
									
									
									
									
										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 eg. 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
									
								
								cobra/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								cobra/main.go
									
									
									
									
									
										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()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user