Added PreRun phase to Command struct

Now each command has a PreRun function that will execute before calling
the Run() function. This allows to show the banner and do some pre-check
work. Also moved parsePackagesFromDir() to the main function to avoid
getting called each time 'bee' is invoked.
This commit is contained in:
Faissal Elamraoui 2016-11-20 22:28:52 +01:00
parent 35384b463e
commit 03f2057eb0
13 changed files with 39 additions and 29 deletions

View File

@ -538,14 +538,13 @@ func TestGet(t *testing.T) {
func init() { func init() {
cmdApiapp.Run = createapi cmdApiapp.Run = createapi
cmdApiapp.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdApiapp.Flag.Var(&tables, "tables", "specify tables to generate model") cmdApiapp.Flag.Var(&tables, "tables", "specify tables to generate model")
cmdApiapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.") cmdApiapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
cmdApiapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance") cmdApiapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
} }
func createapi(cmd *Command, args []string) int { func createapi(cmd *Command, args []string) int {
ShowShortVersionBanner()
w := NewColorWriter(os.Stdout) w := NewColorWriter(os.Stdout)
if len(args) < 1 { if len(args) < 1 {
@ -656,7 +655,7 @@ func checkEnv(appname string) (apppath, packpath string, err error) {
// we use the first path // we use the first path
gopath := gps[0] gopath := gps[0]
logger.Warn("You current workdir is not inside $GOPATH/src") logger.Warn("You current workdir is not inside $GOPATH/src.")
logger.Debugf("GOPATH: %s", __FILE__(), __LINE__(), gopath) logger.Debugf("GOPATH: %s", __FILE__(), __LINE__(), gopath)
gosrcpath := path.Join(gopath, "src") gosrcpath := path.Join(gopath, "src")

View File

@ -32,7 +32,7 @@ var cmdBale = &Command{
Long: ` Long: `
Bale command compress all the static files in to a single binary file. Bale command compress all the static files in to a single binary file.
This is usefull to not have to carry static files including js, css, images This is useful to not have to carry static files including js, css, images
and views when publishing a project. and views when publishing a project.
auto-generate unpack function to main package then run it during the runtime. auto-generate unpack function to main package then run it during the runtime.
@ -43,11 +43,10 @@ This is mainly used for zealots who are requiring 100% Go code.
func init() { func init() {
cmdBale.Run = runBale cmdBale.Run = runBale
cmdBale.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
} }
func runBale(cmd *Command, args []string) int { func runBale(cmd *Command, args []string) int {
ShowShortVersionBanner()
err := loadConfig() err := loadConfig()
if err != nil { if err != nil {
logger.Fatalf("Failed to load configuration: %s", err) logger.Fatalf("Failed to load configuration: %s", err)

17
bee.go
View File

@ -33,6 +33,9 @@ type Command struct {
// The args are the arguments after the command name. // The args are the arguments after the command name.
Run func(cmd *Command, args []string) int Run func(cmd *Command, args []string) int
// PreRun performs an operation before running the command
PreRun func(cmd *Command, args []string)
// UsageLine is the one-line usage message. // UsageLine is the one-line usage message.
// The first word in the line is taken to be the command name. // The first word in the line is taken to be the command name.
UsageLine string UsageLine string
@ -93,6 +96,8 @@ var commands = []*Command{
var logger = GetBeeLogger(os.Stdout) var logger = GetBeeLogger(os.Stdout)
func main() { func main() {
currentpath, _ := os.Getwd()
flag.Usage = usage flag.Usage = usage
flag.Parse() flag.Parse()
log.SetFlags(0) log.SetFlags(0)
@ -116,6 +121,17 @@ func main() {
cmd.Flag.Parse(args[1:]) cmd.Flag.Parse(args[1:])
args = cmd.Flag.Args() args = cmd.Flag.Args()
} }
if cmd.PreRun != nil {
cmd.PreRun(cmd, args)
}
// Check if current directory is inside the GOPATH,
// if so parse the packages inside it.
if strings.Contains(currentpath, GetGOPATHs()[0]+"/src") {
parsePackagesFromDir(currentpath)
}
os.Exit(cmd.Run(cmd, args)) os.Exit(cmd.Run(cmd, args))
return return
} }
@ -142,7 +158,6 @@ Additional help topics:
{{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}} {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}}
Use "bee help [topic]" for more information about that topic. Use "bee help [topic]" for more information about that topic.
` `
var helpTemplate = `{{if .Runnable}}usage: bee {{.UsageLine}} var helpTemplate = `{{if .Runnable}}usage: bee {{.UsageLine}}

4
fix.go
View File

@ -23,12 +23,12 @@ bee fix help to upgrade the application to beego 1.6
func init() { func init() {
cmdFix.Run = runFix cmdFix.Run = runFix
cmdFix.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
} }
func runFix(cmd *Command, args []string) int { func runFix(cmd *Command, args []string) int {
ShowShortVersionBanner()
logger.Info("Upgrading the application...") logger.Info("Upgrading the application...")
dir, err := os.Getwd() dir, err := os.Getwd()
if err != nil { if err != nil {
logger.Fatalf("Error while getting the current working directory: %s", err) logger.Fatalf("Error while getting the current working directory: %s", err)

3
g.go
View File

@ -69,6 +69,7 @@ var fields docValue
func init() { func init() {
cmdGenerate.Run = generateCode cmdGenerate.Run = generateCode
cmdGenerate.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdGenerate.Flag.Var(&tables, "tables", "specify tables to generate model") cmdGenerate.Flag.Var(&tables, "tables", "specify tables to generate model")
cmdGenerate.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.") cmdGenerate.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
cmdGenerate.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance") cmdGenerate.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
@ -77,8 +78,6 @@ func init() {
} }
func generateCode(cmd *Command, args []string) int { func generateCode(cmd *Command, args []string) int {
ShowShortVersionBanner()
currpath, _ := os.Getwd() currpath, _ := os.Getwd()
if len(args) < 1 { if len(args) < 1 {
logger.Fatal("Command is missing") logger.Fatal("Command is missing")

View File

@ -80,9 +80,7 @@ func init() {
importlist = make(map[string]string) importlist = make(map[string]string)
controllerList = make(map[string]map[string]*swagger.Item) controllerList = make(map[string]map[string]*swagger.Item)
modelsList = make(map[string]map[string]swagger.Schema) modelsList = make(map[string]map[string]swagger.Schema)
curPath, _ := os.Getwd()
astPkgs = map[string]*ast.Package{} astPkgs = map[string]*ast.Package{}
parsePackagesFromDir(curPath)
} }
func parsePackagesFromDir(dirpath string) { func parsePackagesFromDir(dirpath string) {

View File

@ -298,14 +298,13 @@ var hproseAddFunctions = []string{}
func init() { func init() {
cmdHproseapp.Run = createhprose cmdHproseapp.Run = createhprose
cmdHproseapp.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdHproseapp.Flag.Var(&tables, "tables", "specify tables to generate model") cmdHproseapp.Flag.Var(&tables, "tables", "specify tables to generate model")
cmdHproseapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.") cmdHproseapp.Flag.Var(&driver, "driver", "database driver: mysql, postgresql, etc.")
cmdHproseapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance") cmdHproseapp.Flag.Var(&conn, "conn", "connection string used by the driver to connect to a database instance")
} }
func createhprose(cmd *Command, args []string) int { func createhprose(cmd *Command, args []string) int {
ShowShortVersionBanner()
w := NewColorWriter(os.Stdout) w := NewColorWriter(os.Stdout)
curpath, _ := os.Getwd() curpath, _ := os.Getwd()

View File

@ -56,14 +56,13 @@ var mConn docValue
func init() { func init() {
cmdMigrate.Run = runMigration cmdMigrate.Run = runMigration
cmdMigrate.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdMigrate.Flag.Var(&mDriver, "driver", "database driver: mysql, postgres, sqlite, etc.") cmdMigrate.Flag.Var(&mDriver, "driver", "database driver: mysql, postgres, sqlite, etc.")
cmdMigrate.Flag.Var(&mConn, "conn", "connection string used by the driver to connect to a database instance") cmdMigrate.Flag.Var(&mConn, "conn", "connection string used by the driver to connect to a database instance")
} }
// runMigration is the entry point for starting a migration // runMigration is the entry point for starting a migration
func runMigration(cmd *Command, args []string) int { func runMigration(cmd *Command, args []string) int {
ShowShortVersionBanner()
currpath, _ := os.Getwd() currpath, _ := os.Getwd()
gps := GetGOPATHs() gps := GetGOPATHs()

14
new.go
View File

@ -52,24 +52,24 @@ the following files/directories structure:
func init() { func init() {
cmdNew.Run = createApp cmdNew.Run = createApp
cmdNew.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
} }
func createApp(cmd *Command, args []string) int { func createApp(cmd *Command, args []string) int {
ShowShortVersionBanner()
w := NewColorWriter(os.Stdout) w := NewColorWriter(os.Stdout)
if len(args) != 1 { if len(args) != 1 {
logger.Error("Argument [appname] is missing") logger.Fatal("Argument [appname] is missing")
os.Exit(2)
} }
apppath, packpath, err := checkEnv(args[0]) apppath, packpath, err := checkEnv(args[0])
if err != nil { if err != nil {
fmt.Println(err) logger.Fatalf("%s", err)
os.Exit(2)
} }
if isExist(apppath) { if isExist(apppath) {
logger.Errorf("Path (%s) already exists", apppath) logger.Errorf(bold("Application '%s' already exists"), apppath)
logger.Warn("Do you want to overwrite it? [Yes|No] ") logger.Warn(bold("Do you want to overwrite it? [Yes|No] "))
if !askForConfirmation() { if !askForConfirmation() {
os.Exit(2) os.Exit(2)
} }

View File

@ -101,6 +101,7 @@ func init() {
fs.BoolVar(&verbose, "v", false, "verbose") fs.BoolVar(&verbose, "v", false, "verbose")
cmdPack.Flag = *fs cmdPack.Flag = *fs
cmdPack.Run = packApp cmdPack.Run = packApp
cmdPack.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
w = NewColorWriter(os.Stdout) w = NewColorWriter(os.Stdout)
} }
@ -449,8 +450,6 @@ func packDirectory(excludePrefix []string, excludeSuffix []string,
} }
func packApp(cmd *Command, args []string) int { func packApp(cmd *Command, args []string) int {
ShowShortVersionBanner()
curPath, _ := os.Getwd() curPath, _ := os.Getwd()
thePath := "" thePath := ""
@ -597,11 +596,13 @@ func packApp(cmd *Command, args []string) int {
} }
} }
logger.Infof("Writing to output: %s", outputP)
err = packDirectory(exp, exs, exr, tmpdir, thePath) err = packDirectory(exp, exs, exr, tmpdir, thePath)
if err != nil { if err != nil {
logger.Fatal(err.Error()) logger.Fatal(err.Error())
} }
logger.Infof("Writing to output: %s", outputP) logger.Success("Application packed!")
return 0 return 0
} }

3
run.go
View File

@ -56,6 +56,7 @@ var (
func init() { func init() {
cmdRun.Run = runApp cmdRun.Run = runApp
cmdRun.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdRun.Flag.Var(&mainFiles, "main", "specify main go files") cmdRun.Flag.Var(&mainFiles, "main", "specify main go files")
cmdRun.Flag.Var(&gendoc, "gendoc", "auto generate the docs") cmdRun.Flag.Var(&gendoc, "gendoc", "auto generate the docs")
cmdRun.Flag.Var(&downdoc, "downdoc", "auto download swagger file when not exist") cmdRun.Flag.Var(&downdoc, "downdoc", "auto download swagger file when not exist")
@ -67,8 +68,6 @@ func init() {
} }
func runApp(cmd *Command, args []string) int { func runApp(cmd *Command, args []string) int {
ShowShortVersionBanner()
if len(args) == 0 || args[0] == "watchall" { if len(args) == 0 || args[0] == "watchall" {
currpath, _ = os.Getwd() currpath, _ = os.Getwd()

View File

@ -53,6 +53,7 @@ var docport docValue
func init() { func init() {
cmdRundocs.Run = runDocs cmdRundocs.Run = runDocs
cmdRundocs.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
cmdRundocs.Flag.Var(&isDownload, "isDownload", "weather download the Swagger Docs") cmdRundocs.Flag.Var(&isDownload, "isDownload", "weather download the Swagger Docs")
cmdRundocs.Flag.Var(&docport, "docport", "doc server port") cmdRundocs.Flag.Var(&docport, "docport", "doc server port")
} }

View File

@ -31,6 +31,7 @@ var cmdTest = &Command{
func init() { func init() {
cmdTest.Run = testApp cmdTest.Run = testApp
cmdTest.PreRun = func(cmd *Command, args []string) { ShowShortVersionBanner() }
} }
func safePathAppend(arr []string, paths ...string) []string { func safePathAppend(arr []string, paths ...string) []string {