Home | History | Annotate | Download | only in dist
      1 // Copyright 2012 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package main
      6 
      7 import (
      8 	"flag"
      9 	"fmt"
     10 	"os"
     11 	"strconv"
     12 )
     13 
     14 // cmdtab records the available commands.
     15 var cmdtab = []struct {
     16 	name string
     17 	f    func()
     18 }{
     19 	{"banner", cmdbanner},
     20 	{"bootstrap", cmdbootstrap},
     21 	{"clean", cmdclean},
     22 	{"env", cmdenv},
     23 	{"install", cmdinstall},
     24 	{"test", cmdtest},
     25 	{"version", cmdversion},
     26 }
     27 
     28 // The OS-specific main calls into the portable code here.
     29 func xmain() {
     30 	if len(os.Args) < 2 {
     31 		usage()
     32 	}
     33 	cmd := os.Args[1]
     34 	os.Args = os.Args[1:] // for flag parsing during cmd
     35 	for _, ct := range cmdtab {
     36 		if ct.name == cmd {
     37 			flag.Usage = func() {
     38 				fmt.Fprintf(os.Stderr, "usage: go tool dist %s [options]\n", cmd)
     39 				flag.PrintDefaults()
     40 				os.Exit(2)
     41 			}
     42 			ct.f()
     43 			return
     44 		}
     45 	}
     46 
     47 	xprintf("unknown command %s\n", cmd)
     48 	usage()
     49 }
     50 
     51 func xflagparse(maxargs int) {
     52 	flag.Var((*count)(&vflag), "v", "verbosity")
     53 	flag.Parse()
     54 	if maxargs >= 0 && flag.NArg() > maxargs {
     55 		flag.Usage()
     56 	}
     57 }
     58 
     59 // count is a flag.Value that is like a flag.Bool and a flag.Int.
     60 // If used as -name, it increments the count, but -name=x sets the count.
     61 // Used for verbose flag -v.
     62 type count int
     63 
     64 func (c *count) String() string {
     65 	return fmt.Sprint(int(*c))
     66 }
     67 
     68 func (c *count) Set(s string) error {
     69 	switch s {
     70 	case "true":
     71 		*c++
     72 	case "false":
     73 		*c = 0
     74 	default:
     75 		n, err := strconv.Atoi(s)
     76 		if err != nil {
     77 			return fmt.Errorf("invalid count %q", s)
     78 		}
     79 		*c = count(n)
     80 	}
     81 	return nil
     82 }
     83 
     84 func (c *count) IsBoolFlag() bool {
     85 	return true
     86 }
     87