| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| "go/build" |
| "log" |
| "os" |
| "path/filepath" |
| "strings" |
| ) |
| |
| var fs = flag.NewFlagSet(os.Args[0], flag.ContinueOnError) |
| |
| func init() { |
| fs.Usage = func() {} |
| } |
| |
| 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, |
| cmdRestore, |
| 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 |
| case args[0] == "rebuild": |
| // rebuild was renamed restore, alias for backwards compatibility |
| args[0] = "restore" |
| } |
| |
| 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 { |
| if err == flag.ErrHelp { |
| help(args[:1]) |
| os.Exit(0) |
| } |
| fmt.Fprint(os.Stderr, "\n") |
| help(args[:1]) |
| os.Exit(3) |
| } |
| |
| if err := command.Run(fs.Args()); err != nil { |
| log.Fatalf("command %q failed: %v", command.Name, err) |
| } |
| if err := GlobalDownloader.Flush(); err != nil { |
| log.Fatalf("failed to delete tempdirs: %v", err) |
| } |
| return |
| } |
| } |
| fmt.Fprintf(os.Stderr, "unknown command: %q\n\n", args[0]) |
| printUsage(os.Stderr) |
| os.Exit(3) |
| } |
| |
| var ( |
| vendorDir, manifestFile string |
| importPath string |
| ) |
| |
| func init() { |
| wd, err := os.Getwd() |
| if err != nil { |
| log.Fatal(err) |
| } |
| vendorDir = filepath.Join(wd, "vendor") |
| manifestFile = filepath.Join(vendorDir, "manifest") |
| var srcTree []string |
| for _, p := range filepath.SplitList(build.Default.GOPATH) { |
| srcTree = append(srcTree, filepath.Join(p, "src")+string(filepath.Separator)) |
| } |
| |
| var pathMismatch int |
| for _, p := range srcTree { |
| if !strings.HasPrefix(wd, p) && wd != p[:len(p)-1] { |
| pathMismatch++ |
| continue |
| } |
| importPath = filepath.ToSlash(strings.TrimPrefix(wd, p)) |
| break |
| } |
| if build.Default.GOPATH == "" || len(srcTree) == pathMismatch { |
| log.Println("WARNING: for go vendoring to work your project needs to be somewhere under $GOPATH/src/") |
| } |
| } |