From f7368d1ba667c20f970a8b324b63c05102ee0950 Mon Sep 17 00:00:00 2001 From: AdamMagued Date: Fri, 2 Oct 2026 05:15:08 +0300 Subject: [PATCH 1/2] fix: initialize default Usage function on NewFlagSet and Init --- flag.go | 2 ++ flag_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/flag.go b/flag.go index a4affd48..afe675d0 100644 --- a/flag.go +++ b/flag.go @@ -1397,6 +1397,7 @@ func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { interspersed: true, SortFlags: true, } + f.Usage = func() { defaultUsage(f) } return f } @@ -1412,4 +1413,5 @@ func (f *FlagSet) Init(name string, errorHandling ErrorHandling) { f.name = name f.errorHandling = errorHandling f.argsLenAtDash = -1 + f.Usage = func() { defaultUsage(f) } } diff --git a/flag_test.go b/flag_test.go index 1e26d190..fb0fdae8 100644 --- a/flag_test.go +++ b/flag_test.go @@ -1626,3 +1626,40 @@ func TestVisitFlagOrder(t *testing.T) { i++ }) } + +func TestNewFlagSetDefaultUsage(t *testing.T) { + var buf bytes.Buffer + flags := NewFlagSet("test", ContinueOnError) + flags.SetOutput(&buf) + if flags.Usage == nil { + t.Fatal("expected flags.Usage to be defined, got nil") + } + flags.Bool("testflag", false, "a test flag") + flags.Usage() + got := buf.String() + if !strings.Contains(got, "Usage of test:\n") { + t.Errorf("expected usage output to contain 'Usage of test:\n', got %q", got) + } + if !strings.Contains(got, "--testflag") { + t.Errorf("expected usage output to contain '--testflag', got %q", got) + } +} + +func TestFlagSetInitDefaultUsage(t *testing.T) { + var buf bytes.Buffer + var flags FlagSet + flags.Init("test-init", ContinueOnError) + flags.SetOutput(&buf) + if flags.Usage == nil { + t.Fatal("expected flags.Usage to be defined after Init, got nil") + } + flags.Bool("testflag", false, "a test flag") + flags.Usage() + got := buf.String() + if !strings.Contains(got, "Usage of test-init:\n") { + t.Errorf("expected usage output to contain 'Usage of test-init:\n', got %q", got) + } + if !strings.Contains(got, "--testflag") { + t.Errorf("expected usage output to contain '--testflag', got %q", got) + } +} From 9c50e03a60d7ee9c3c34506cc571eb04bcdbaaab Mon Sep 17 00:00:00 2001 From: AdamMagued Date: Sun, 4 Oct 2026 17:51:20 +0300 Subject: [PATCH 2/2] docs: document default Usage initialization in FlagSet, NewFlagSet, and Init Reflect default Usage behavior in docstrings as requested in review. --- flag.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/flag.go b/flag.go index afe675d0..5fdb793f 100644 --- a/flag.go +++ b/flag.go @@ -175,7 +175,7 @@ type NormalizedName string type FlagSet struct { // Usage is the function called when an error occurs while parsing flags. // The field is a function (not a method) that may be changed to point to - // a custom error handler. + // a custom error handler. By default, it prints the default usage message. Usage func() // SortFlags is used to indicate, if user wants to have sorted flags in @@ -1388,7 +1388,8 @@ func Parsed() bool { var CommandLine = NewFlagSet(os.Args[0], ExitOnError) // NewFlagSet returns a new, empty flag set with the specified name, -// error handling property and SortFlags set to true. +// error handling property, SortFlags set to true, and Usage set to +// print the default usage message. func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { f := &FlagSet{ name: name, @@ -1408,7 +1409,8 @@ func (f *FlagSet) SetInterspersed(interspersed bool) { // Init sets the name and error handling property for a flag set. // By default, the zero FlagSet uses an empty name and the -// ContinueOnError error handling policy. +// ContinueOnError error handling policy. It also sets Usage to +// print the default usage message. func (f *FlagSet) Init(name string, errorHandling ErrorHandling) { f.name = name f.errorHandling = errorHandling