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  }