]> Cypherpunks repositories - gostls13.git/commitdiff
flag: arrange for FlagSet.Usage to be non-nil by default
authorRuss Cox <rsc@golang.org>
Thu, 20 Oct 2016 19:05:51 +0000 (15:05 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 26 Oct 2016 16:13:40 +0000 (16:13 +0000)
This allows callers to invoke f.Usage() themselves and get the default
usage handler instead of a panic (from calling a nil function).

Fixes #16955.

Change-Id: Ie337fd9e1f85daf78c5eae7b5c41d5ad8c1f89bf
Reviewed-on: https://go-review.googlesource.com/31576
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/flag/export_test.go
src/flag/flag.go

index 12d3dc76dfec50819dae251d62db0013d726c8f3..edbe83c664804bef8df865bf762563112d91c7f4 100644 (file)
@@ -13,5 +13,6 @@ import "os"
 // exit the program.
 func ResetForTesting(usage func()) {
        CommandLine = NewFlagSet(os.Args[0], ContinueOnError)
+       CommandLine.Usage = commandLineUsage
        Usage = usage
 }
index cb9f2837bf15018d6543a28c09fca3875c124821..bbbc55a2799dc86bcc4338500c2c4e1732268f20 100644 (file)
@@ -502,7 +502,7 @@ func PrintDefaults() {
 }
 
 // defaultUsage is the default function to print a usage message.
-func defaultUsage(f *FlagSet) {
+func (f *FlagSet) defaultUsage() {
        if f.name == "" {
                fmt.Fprintf(f.out(), "Usage:\n")
        } else {
@@ -821,11 +821,7 @@ func (f *FlagSet) failf(format string, a ...interface{}) error {
 // or the appropriate default usage function otherwise.
 func (f *FlagSet) usage() {
        if f.Usage == nil {
-               if f == CommandLine {
-                       Usage()
-               } else {
-                       defaultUsage(f)
-               }
+               f.defaultUsage()
        } else {
                f.Usage()
        }
@@ -955,6 +951,18 @@ func Parsed() bool {
 // methods of CommandLine.
 var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
 
+func init() {
+       // Override generic FlagSet default Usage with call to global Usage.
+       // Note: This is not CommandLine.Usage = Usage,
+       // because we want any eventual call to use any updated value of Usage,
+       // not the value it has when this line is run.
+       CommandLine.Usage = commandLineUsage
+}
+
+func commandLineUsage() {
+       Usage()
+}
+
 // NewFlagSet returns a new, empty flag set with the specified name and
 // error handling property.
 func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
@@ -962,6 +970,7 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
                name:          name,
                errorHandling: errorHandling,
        }
+       f.Usage = f.defaultUsage
        return f
 }