github.com/jd-ly/cmd@v1.0.10/revel/revel.go (about) 1 // Copyright (c) 2012-2016 The Revel Framework Authors, All rights reserved. 2 // Revel Framework source code and usage is governed by a MIT style 3 // license that can be found in the LICENSE file. 4 5 // The command line tool for running Revel apps. 6 package main 7 8 import ( 9 "flag" 10 "fmt" 11 "math/rand" 12 "os" 13 "runtime" 14 "strings" 15 "time" 16 17 "github.com/jessevdk/go-flags" 18 19 "github.com/agtorre/gocolorize" 20 "github.com/jd-ly/cmd/logger" 21 "github.com/jd-ly/cmd/model" 22 "github.com/jd-ly/cmd/utils" 23 "bytes" 24 ) 25 26 const ( 27 // RevelCmdImportPath Revel framework cmd tool import path 28 RevelCmdImportPath = "github.com/jd-ly/cmd" 29 30 // RevelCmdImportPath Revel framework cmd tool import path 31 RevelSkeletonsImportPath = "github.com/revel/skeletons" 32 33 // DefaultRunMode for revel's application 34 DefaultRunMode = "dev" 35 ) 36 37 // Command structure cribbed from the genius organization of the "go" command. 38 type Command struct { 39 UpdateConfig func(c *model.CommandConfig, args []string) bool 40 RunWith func(c *model.CommandConfig) error 41 UsageLine, Short, Long string 42 } 43 44 // Name returns command name from usage line 45 func (cmd *Command) Name() string { 46 name := cmd.UsageLine 47 i := strings.Index(name, " ") 48 if i >= 0 { 49 name = name[:i] 50 } 51 return name 52 } 53 54 // The commands 55 var Commands = []*Command{ 56 nil, // Safety net, prevent missing index from running 57 cmdNew, 58 cmdRun, 59 cmdBuild, 60 cmdPackage, 61 cmdClean, 62 cmdTest, 63 cmdVersion, 64 } 65 66 func main() { 67 if runtime.GOOS == "windows" { 68 gocolorize.SetPlain(true) 69 } 70 c := &model.CommandConfig{} 71 wd, _ := os.Getwd() 72 73 utils.InitLogger(wd, logger.LvlError) 74 parser := flags.NewParser(c, flags.HelpFlag | flags.PassDoubleDash) 75 if len(os.Args) < 2 { 76 parser.WriteHelp(os.Stdout) 77 os.Exit(1) 78 } 79 80 if err := ParseArgs(c, parser, os.Args[1:]); err != nil { 81 fmt.Fprint(os.Stderr, err.Error() + "\n") 82 os.Exit(1) 83 } 84 85 // Switch based on the verbose flag 86 if len(c.Verbose) > 1 { 87 utils.InitLogger(wd, logger.LvlDebug) 88 } else if len(c.Verbose) > 0 { 89 utils.InitLogger(wd, logger.LvlInfo) 90 } else { 91 utils.InitLogger(wd, logger.LvlWarn) 92 } 93 94 // Setup package resolver 95 c.InitPackageResolver() 96 97 if err := c.UpdateImportPath(); err != nil { 98 utils.Logger.Error(err.Error()) 99 parser.WriteHelp(os.Stdout) 100 os.Exit(1) 101 } 102 103 command := Commands[c.Index] 104 println("Revel executing:", command.Short) 105 106 if err := command.RunWith(c); err != nil { 107 utils.Logger.Error("Unable to execute", "error", err) 108 os.Exit(1) 109 } 110 } 111 112 // Parse the arguments passed into the model.CommandConfig 113 func ParseArgs(c *model.CommandConfig, parser *flags.Parser, args []string) (err error) { 114 var extraArgs []string 115 if ini := flag.String("ini", "none", ""); *ini != "none" { 116 if err = flags.NewIniParser(parser).ParseFile(*ini); err != nil { 117 return 118 } 119 } else { 120 if extraArgs, err = parser.ParseArgs(args); err != nil { 121 return 122 } else { 123 switch parser.Active.Name { 124 case "new": 125 c.Index = model.NEW 126 case "run": 127 c.Index = model.RUN 128 case "build": 129 c.Index = model.BUILD 130 case "package": 131 c.Index = model.PACKAGE 132 case "clean": 133 c.Index = model.CLEAN 134 case "test": 135 c.Index = model.TEST 136 case "version": 137 c.Index = model.VERSION 138 } 139 } 140 } 141 142 if !Commands[c.Index].UpdateConfig(c, extraArgs) { 143 buffer := &bytes.Buffer{} 144 parser.WriteHelp(buffer) 145 err = fmt.Errorf("Invalid command line arguements %v\n%s", extraArgs, buffer.String()) 146 } 147 148 return 149 } 150 151 func init() { 152 rand.Seed(time.Now().UnixNano()) 153 }