From d25dd242b134a8ca037812921a93cac978b86fd5 Mon Sep 17 00:00:00 2001 From: Tomas Aschan <1550920+tomasaschan@users.noreply.github.com> Date: Fri, 29 Aug 2025 22:33:29 +0200 Subject: Reset args on re-parse even if empty This ensures fs.Args() returns the expected thing after every parse. Fixes #439. --- flag.go | 4 ++-- flag_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 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") -- cgit v1.2.3