]> Cypherpunks repositories - gostls13.git/commitdiff
flag: visit the flags in sorted order, for better messages.
authorRob Pike <r@golang.org>
Thu, 10 Mar 2011 20:42:31 +0000 (12:42 -0800)
committerRob Pike <r@golang.org>
Thu, 10 Mar 2011 20:42:31 +0000 (12:42 -0800)
Fixes #1601.

R=rsc
CC=golang-dev
https://golang.org/cl/4249070

src/pkg/flag/flag.go
src/pkg/flag/flag_test.go

index 0483425f0b0a2f339c700d826320760fa34a1ed1..6c9f3a8407e2fda9097c0638e0b0927fc960cf4c 100644 (file)
@@ -68,6 +68,7 @@ package flag
 import (
        "fmt"
        "os"
+       "sort"
        "strconv"
 )
 
@@ -205,16 +206,34 @@ type allFlags struct {
 
 var flags *allFlags
 
-// VisitAll visits the flags, calling fn for each. It visits all flags, even those not set.
+// sortFlags returns the flags as a slice in lexicographical sorted order.
+func sortFlags(flags map[string]*Flag) []*Flag {
+       list := make(sort.StringArray, len(flags))
+       i := 0
+       for _, f := range flags {
+               list[i] = f.Name
+               i++
+       }
+       list.Sort()
+       result := make([]*Flag, len(list))
+       for i, name := range list {
+               result[i] = flags[name]
+       }
+       return result
+}
+
+// VisitAll visits the flags in lexicographical order, calling fn for each.
+// It visits all flags, even those not set.
 func VisitAll(fn func(*Flag)) {
-       for _, f := range flags.formal {
+       for _, f := range sortFlags(flags.formal) {
                fn(f)
        }
 }
 
-// Visit visits the flags, calling fn for each. It visits only those flags that have been set.
+// Visit visits the flags in lexicographical order, calling fn for each.
+// It visits only those flags that have been set.
 func Visit(fn func(*Flag)) {
-       for _, f := range flags.actual {
+       for _, f := range sortFlags(flags.actual) {
                fn(f)
        }
 }
index 30a21e61ae2d46d91be9f5e887c0d633edd46505..1e47d12e48a76ac07c151da89426e267ae3911d5 100644 (file)
@@ -8,6 +8,7 @@ import (
        . "flag"
        "fmt"
        "os"
+       "sort"
        "testing"
 )
 
@@ -77,6 +78,12 @@ func TestEverything(t *testing.T) {
                        t.Log(k, *v)
                }
        }
+       // Now test they're visited in sort order.
+       var flagNames []string
+       Visit(func(f *Flag) { flagNames = append(flagNames, f.Name) })
+       if !sort.StringsAreSorted(flagNames) {
+               t.Errorf("flag names not sorted: %v", flagNames)
+       }
 }
 
 func TestUsage(t *testing.T) {