github.com/mattn/gom@v0.0.0-20190726063113-0ebf2b5d812d/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/hashicorp/go-version"
    11  	"github.com/mattn/gover"
    12  )
    13  
    14  func usage() {
    15  	fmt.Printf(`Usage of %s:
    16   Tasks:
    17     gom build   [options]   : Build with _vendor packages
    18     gom install [options]   : Install bundled packages into _vendor directory, by default.
    19                                GOM_VENDOR_NAME=. gom install [options], for regular src folder.
    20     gom test    [options]   : Run tests with bundles
    21     gom run     [options]   : Run go file with bundles
    22     gom doc     [options]   : Run godoc for bundles
    23     gom exec    [arguments] : Execute command with bundle environment
    24     gom tool    [options]   : Run go tool with bundles
    25     gom env     [arguments] : Run go env
    26     gom fmt     [arguments] : Run go fmt
    27     gom list    [arguments] : Run go list
    28     gom vet     [arguments] : Run go vet
    29     gom update              : Update all dependencies (Experiment)
    30     gom gen travis-yml      : Generate .travis.yml which uses "gom test"
    31     gom gen gomfile         : Scan packages from current directory as root
    32                                recursively, and generate Gomfile
    33     gom lock                : Generate Gomfile.lock
    34  `, os.Args[0])
    35  	os.Exit(1)
    36  }
    37  
    38  var productionEnv = flag.Bool("production", false, "production environment")
    39  var developmentEnv = flag.Bool("development", false, "development environment")
    40  var testEnv = flag.Bool("test", false, "test environment")
    41  var customGroups = flag.String("groups", "", "comma-separated list of Gomfile groups")
    42  var customGroupList []string
    43  var vendorFolder string
    44  var isVendoringSupported bool
    45  
    46  func init() {
    47  	isVendoringSupported = checkVendoringSupport()
    48  	if isVendoringSupported {
    49  		vendorFolder = "vendor"
    50  	} else {
    51  		if len(os.Getenv("GOM_VENDOR_NAME")) > 0 {
    52  			vendorFolder = os.Getenv("GOM_VENDOR_NAME")
    53  		} else {
    54  			vendorFolder = "_vendor"
    55  		}
    56  	}
    57  }
    58  
    59  func goversion() string {
    60  	defer recover()
    61  	return gover.Version()
    62  }
    63  
    64  // checkVendoringSupport return whether go have native vendor support.
    65  // If return false, gom behave vendor directory as GOPATH.
    66  // If return true, gom doesn't move anything.
    67  func checkVendoringSupport() bool {
    68  	go150, _ := version.NewVersion("1.5.0")
    69  	go160, _ := version.NewVersion("1.6.0")
    70  	go173, _ := version.NewVersion("1.7.3")
    71  	ver := goversion()
    72  
    73  	// TODO: maybe gccgo?
    74  	if ver == "" {
    75  		return true
    76  	}
    77  
    78  	goVer, err := version.NewVersion(strings.TrimPrefix(ver, "go"))
    79  	if err != nil {
    80  		panic(fmt.Sprintf("gover.Version() returned invalid semantic version: %s", ver))
    81  	}
    82  
    83  	// See: https://golang.org/doc/go1.6#go_command
    84  	if goVer.LessThan(go150) {
    85  		return false
    86  	} else if (goVer.Equal(go150) || goVer.GreaterThan(go150)) && goVer.LessThan(go160) {
    87  		return os.Getenv("GO15VENDOREXPERIMENT") == "1"
    88  	} else if (goVer.Equal(go160) || goVer.GreaterThan(go160)) && goVer.LessThan(go173) {
    89  		return os.Getenv("GO15VENDOREXPERIMENT") != "0"
    90  	} else {
    91  		return true
    92  	}
    93  }
    94  
    95  func vendorSrc(vendor string) string {
    96  	if isVendoringSupported {
    97  		return vendor
    98  	} else {
    99  		return filepath.Join(vendor, "src")
   100  	}
   101  }
   102  
   103  func main() {
   104  	flag.Usage = usage
   105  	flag.Parse()
   106  	if flag.NArg() == 0 {
   107  		usage()
   108  	}
   109  	handleSignal()
   110  
   111  	if !*productionEnv && !*developmentEnv && !*testEnv {
   112  		*developmentEnv = true
   113  	}
   114  
   115  	customGroupList = strings.Split(*customGroups, ",")
   116  
   117  	var err error
   118  	subArgs := flag.Args()[1:]
   119  	switch flag.Arg(0) {
   120  	case "install", "i":
   121  		err = install(subArgs)
   122  	case "build", "b":
   123  		err = run(append([]string{"go", "build"}, subArgs...), None)
   124  	case "test", "t":
   125  		err = run(append([]string{"go", "test"}, subArgs...), None)
   126  	case "run", "r":
   127  		err = run(append([]string{"go", "run"}, subArgs...), None)
   128  	case "doc", "d":
   129  		err = run(append([]string{"godoc"}, subArgs...), None)
   130  	case "exec", "e":
   131  		err = run(subArgs, None)
   132  	case "env", "tool", "fmt", "list", "vet":
   133  		err = run(append([]string{"go", flag.Arg(0)}, subArgs...), None)
   134  	case "update", "u":
   135  		err = update()
   136  	case "gen", "g":
   137  		switch flag.Arg(1) {
   138  		case "travis-yml":
   139  			err = genTravisYml()
   140  		case "gomfile":
   141  			err = genGomfile()
   142  		default:
   143  			usage()
   144  		}
   145  	case "lock", "l":
   146  		err = genGomfileLock()
   147  	default:
   148  		usage()
   149  	}
   150  	if err != nil {
   151  		fmt.Fprintln(os.Stderr, "gom: ", err)
   152  		os.Exit(1)
   153  	}
   154  }