From 42d8058ed96f78122beb3186ee1b16482a77a02e Mon Sep 17 00:00:00 2001 From: Naveen Gogineni Date: Wed, 17 Aug 2022 21:19:34 -0400 Subject: [PATCH] Fix:(issue_1094) Dont execute Before/After handlers during shell completion --- app.go | 8 ++++---- app_test.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/app.go b/app.go index 6b743bf..1d22bd1 100644 --- a/app.go +++ b/app.go @@ -302,7 +302,7 @@ func (a *App) RunContext(ctx context.Context, arguments []string) (err error) { return err } - if a.After != nil { + if a.After != nil && !cCtx.shellComplete { defer func() { if afterErr := a.After(cCtx); afterErr != nil { if err != nil { @@ -330,7 +330,7 @@ func (a *App) RunContext(ctx context.Context, arguments []string) (err error) { return cerr } - if a.Before != nil { + if a.Before != nil && !cCtx.shellComplete { beforeErr := a.Before(cCtx) if beforeErr != nil { a.handleExitCoder(cCtx, beforeErr) @@ -497,7 +497,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) { return cerr } - if a.After != nil { + if a.After != nil && !cCtx.shellComplete { defer func() { afterErr := a.After(cCtx) if afterErr != nil { @@ -511,7 +511,7 @@ func (a *App) RunAsSubcommand(ctx *Context) (err error) { }() } - if a.Before != nil { + if a.Before != nil && !cCtx.shellComplete { beforeErr := a.Before(cCtx) if beforeErr != nil { a.handleExitCoder(cCtx, beforeErr) diff --git a/app_test.go b/app_test.go index cbc1c8b..31e02c0 100644 --- a/app_test.go +++ b/app_test.go @@ -1245,6 +1245,58 @@ func TestApp_BeforeFunc(t *testing.T) { } } +func TestApp_BeforeFuncShellCompletion(t *testing.T) { + counts := &opCounts{} + var err error + + app := &App{ + EnableBashCompletion: true, + Before: func(c *Context) error { + counts.Total++ + counts.Before = counts.Total + return nil + }, + After: func(c *Context) error { + counts.Total++ + counts.After = counts.Total + return nil + }, + Commands: []*Command{ + { + Name: "sub", + Action: func(c *Context) error { + counts.Total++ + counts.SubCommand = counts.Total + return nil + }, + }, + }, + Flags: []Flag{ + &StringFlag{Name: "opt"}, + }, + Writer: ioutil.Discard, + } + + // run with the Before() func succeeding + err = app.Run([]string{"command", "--opt", "succeed", "sub", "--generate-bash-completion"}) + + if err != nil { + t.Fatalf("Run error: %s", err) + } + + if counts.Before != 0 { + t.Errorf("Before() executed when not expected") + } + + if counts.After != 0 { + t.Errorf("After() executed when not expected") + } + + if counts.SubCommand != 0 { + t.Errorf("Subcommand executed more than expected") + } +} + func TestApp_AfterFunc(t *testing.T) { counts := &opCounts{} afterError := fmt.Errorf("fail")