aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Aschan <[email protected]>2025-08-29 22:33:29 +0200
committerTomas Aschan <[email protected]>2025-08-29 22:42:21 +0200
commitd25dd242b134a8ca037812921a93cac978b86fd5 (patch)
treeee9601364abb12488a2d415049509f18b1bb6426
parent7c651d1d398142c3056ff45df14f2019bad2146d (diff)
Reset args on re-parse even if emptyreset-args-even-if-empty
This ensures fs.Args() returns the expected thing after every parse. Fixes #439.
-rw-r--r--flag.go4
-rw-r--r--flag_test.go40
2 files changed, 42 insertions, 2 deletions
diff --git a/flag.go b/flag.go
index 2b21b6f..3f2a084 100644
--- a/flag.go
+++ b/flag.go
@@ -1157,12 +1157,12 @@ func (f *FlagSet) Parse(arguments []string) error {
}
f.parsed = true
+ f.args = make([]string, 0, len(arguments))
+
if len(arguments) == 0 {
return nil
}
- f.args = make([]string, 0, len(arguments))
-
set := func(flag *Flag, value string) error {
return f.Set(flag.Name, value)
}
diff --git a/flag_test.go b/flag_test.go
index 2df3ea2..31491c8 100644
--- a/flag_test.go
+++ b/flag_test.go
@@ -656,6 +656,46 @@ func TestFlagSetParse(t *testing.T) {
testParse(NewFlagSet("test", ContinueOnError), t)
}
+func TestParseRepeated(t *testing.T) {
+ fs := NewFlagSet("test repeated", ContinueOnError)
+
+ t.Run("first parse", func(t *testing.T) {
+ err := fs.Parse([]string{"foo", "bar"})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterFirst := fs.Args()
+ if !reflect.DeepEqual(argsAfterFirst, []string{"foo", "bar"}) {
+ t.Fatalf("expected args [foo bar], got %v", argsAfterFirst)
+ }
+ })
+
+ t.Run("re-parse with fewer args", func(t *testing.T) {
+ err := fs.Parse([]string{"baz"})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterSecond := fs.Args()
+ if !reflect.DeepEqual(argsAfterSecond, []string{"baz"}) {
+ t.Fatalf("expected args [baz], got %v", argsAfterSecond)
+ }
+ })
+
+ t.Run("re-parse with no args", func(t *testing.T) {
+ err := fs.Parse([]string{})
+ if err != nil {
+ t.Fatal("expected no error, got ", err)
+ }
+
+ argsAfterThird := fs.Args()
+ if !reflect.DeepEqual(argsAfterThird, []string{}) {
+ t.Fatalf("expected args [], got %v", argsAfterThird)
+ }
+ })
+}
+
func TestChangedHelper(t *testing.T) {
f := NewFlagSet("changedtest", ContinueOnError)
f.Bool("changed", false, "changed bool")