|  | package main | 
|  |  | 
|  | import ( | 
|  | "flag" | 
|  | "log" | 
|  | "os" | 
|  | "path/filepath" | 
|  | ) | 
|  |  | 
|  | var fs = flag.NewFlagSet(os.Args[0], flag.ExitOnError) | 
|  |  | 
|  | func init() { | 
|  | fs.Usage = usage | 
|  | } | 
|  |  | 
|  | type Command struct { | 
|  | Name      string | 
|  | UsageLine string | 
|  | Short     string | 
|  | Long      string | 
|  | Run       func(args []string) error | 
|  | AddFlags  func(fs *flag.FlagSet) | 
|  | } | 
|  |  | 
|  | var commands = []*Command{ | 
|  | cmdFetch, | 
|  | cmdRebuild, | 
|  | cmdUpdate, | 
|  | cmdList, | 
|  | cmdDelete, | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | args := os.Args[1:] | 
|  |  | 
|  | switch { | 
|  | case len(args) < 1, args[0] == "-h", args[0] == "-help": | 
|  | printUsage(os.Stdout) | 
|  | os.Exit(0) | 
|  | case args[0] == "help": | 
|  | help(args[1:]) | 
|  | return | 
|  | } | 
|  |  | 
|  | for _, command := range commands { | 
|  | if command.Name == args[0] { | 
|  |  | 
|  | // add extra flags if necessary | 
|  | if command.AddFlags != nil { | 
|  | command.AddFlags(fs) | 
|  | } | 
|  |  | 
|  | if err := fs.Parse(args[1:]); err != nil { | 
|  | log.Fatalf("could not parse flags: %v", err) | 
|  | } | 
|  | args = fs.Args() // reset args to the leftovers from fs.Parse | 
|  |  | 
|  | if err := command.Run(args); err != nil { | 
|  | log.Fatalf("command %q failed: %v", command.Name, err) | 
|  | } | 
|  | return | 
|  | } | 
|  | } | 
|  | log.Fatalf("unknown command %q ", args[0]) | 
|  | } | 
|  |  | 
|  | const manifestfile = "manifest" | 
|  |  | 
|  | func vendorDir() string { | 
|  | wd, err := os.Getwd() | 
|  | if err != nil { | 
|  | log.Fatal(err) | 
|  | } | 
|  | return filepath.Join(wd, "vendor") | 
|  | } | 
|  |  | 
|  | func manifestFile() string { | 
|  | return filepath.Join(vendorDir(), manifestfile) | 
|  | } |