From 034ca39e56d60e3eaa037fa976b8954939ce6d2f Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Thu, 10 Mar 2011 12:42:31 -0800 Subject: [PATCH] flag: visit the flags in sorted order, for better messages. Fixes #1601. R=rsc CC=golang-dev https://golang.org/cl/4249070 --- src/pkg/flag/flag.go | 27 +++++++++++++++++++++++---- src/pkg/flag/flag_test.go | 7 +++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/pkg/flag/flag.go b/src/pkg/flag/flag.go index 0483425f0b..6c9f3a8407 100644 --- a/src/pkg/flag/flag.go +++ b/src/pkg/flag/flag.go @@ -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) } } diff --git a/src/pkg/flag/flag_test.go b/src/pkg/flag/flag_test.go index 30a21e61ae..1e47d12e48 100644 --- a/src/pkg/flag/flag_test.go +++ b/src/pkg/flag/flag_test.go @@ -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) { -- 2.48.1