Merge branch '21189-changeset-limit'
[arvados.git] / lib / cmd / parseflags.go
index 3e872fcd11986a2ba69786a7da3d3267128f2704..275e063f3118b17290ee64582b9bf976f1555166 100644 (file)
@@ -8,8 +8,13 @@ import (
        "flag"
        "fmt"
        "io"
+       "reflect"
 )
 
+// Hack to enable checking whether a given FlagSet's Usage method is
+// the (private) default one.
+var defaultFlagSet = flag.NewFlagSet("none", flag.ContinueOnError)
+
 // ParseFlags calls f.Parse(args) and prints appropriate error/help
 // messages to stderr.
 //
@@ -30,11 +35,16 @@ func ParseFlags(f FlagSet, prog string, args []string, positional string, stderr
        case nil:
                if f.NArg() > 0 && positional == "" {
                        fmt.Fprintf(stderr, "unrecognized command line arguments: %v (try -help)\n", f.Args())
-                       return false, 2
+                       return false, EXIT_INVALIDARGUMENT
                }
                return true, 0
        case flag.ErrHelp:
-               if f, ok := f.(*flag.FlagSet); ok && f.Usage != nil {
+               // Use our own default usage func, not the one
+               // provided by the flag pkg, if the caller hasn't set
+               // one. (We use reflect to determine whether f.Usage
+               // is the private defaultUsage func that
+               // flag.NewFlagSet uses.)
+               if f, ok := f.(*flag.FlagSet); ok && f.Usage != nil && reflect.ValueOf(f.Usage).String() != reflect.ValueOf(defaultFlagSet.Usage).String() {
                        f.SetOutput(stderr)
                        f.Usage()
                } else {
@@ -45,6 +55,6 @@ func ParseFlags(f FlagSet, prog string, args []string, positional string, stderr
                return false, 0
        default:
                fmt.Fprintf(stderr, "error parsing command line arguments: %s (try -help)\n", err)
-               return false, 2
+               return false, EXIT_INVALIDARGUMENT
        }
 }