From 9be9dc22e9b0d24cd45ef9b27e582ee673ff51c7 Mon Sep 17 00:00:00 2001 From: Sam Coe Date: Tue, 20 Jun 2023 08:41:02 +0900 Subject: [PATCH] Fix error handling for extension and shell alias commands (#7567) --- cmd/gh/main.go | 7 ++++--- pkg/cmd/root/alias.go | 4 ++++ pkg/cmd/root/extension.go | 10 ++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/cmd/gh/main.go b/cmd/gh/main.go index c36a4e6e6..15af90721 100644 --- a/cmd/gh/main.go +++ b/cmd/gh/main.go @@ -109,7 +109,7 @@ func mainRun() exitCode { if cmd, err := rootCmd.ExecuteContextC(ctx); err != nil { var pagerPipeError *iostreams.ErrClosedPagerPipe var noResultsError cmdutil.NoResultsError - var execError *exec.ExitError + var extError *root.ExternalCommandExitError var authError *root.AuthError if err == cmdutil.SilentError { return exitError @@ -130,8 +130,9 @@ func mainRun() exitCode { } // no results is not a command failure return exitOK - } else if errors.As(err, &execError) { - return exitCode(execError.ExitCode()) + } else if errors.As(err, &extError) { + // pass on exit codes from extensions and shell aliases + return exitCode(extError.ExitCode()) } printError(stderr, err, cmd, hasDebug) diff --git a/pkg/cmd/root/alias.go b/pkg/cmd/root/alias.go index ba0bfe9e2..4f504f2b8 100644 --- a/pkg/cmd/root/alias.go +++ b/pkg/cmd/root/alias.go @@ -31,6 +31,10 @@ func NewCmdShellAlias(io *iostreams.IOStreams, aliasName, aliasValue string) *co externalCmd.Stdin = io.In preparedCmd := run.PrepareCmd(externalCmd) if err = preparedCmd.Run(); err != nil { + var execError *exec.ExitError + if errors.As(err, &execError) { + return &ExternalCommandExitError{execError} + } return fmt.Errorf("failed to run external command: %w\n", err) } return nil diff --git a/pkg/cmd/root/extension.go b/pkg/cmd/root/extension.go index dea637619..d6d495103 100644 --- a/pkg/cmd/root/extension.go +++ b/pkg/cmd/root/extension.go @@ -1,13 +1,19 @@ package root import ( + "errors" "fmt" + "os/exec" "github.com/cli/cli/v2/pkg/extensions" "github.com/cli/cli/v2/pkg/iostreams" "github.com/spf13/cobra" ) +type ExternalCommandExitError struct { + *exec.ExitError +} + func NewCmdExtension(io *iostreams.IOStreams, em extensions.ExtensionManager, ext extensions.Extension) *cobra.Command { return &cobra.Command{ Use: ext.Name(), @@ -15,6 +21,10 @@ func NewCmdExtension(io *iostreams.IOStreams, em extensions.ExtensionManager, ex RunE: func(c *cobra.Command, args []string) error { args = append([]string{ext.Name()}, args...) if _, err := em.Dispatch(args, io.In, io.Out, io.ErrOut); err != nil { + var execError *exec.ExitError + if errors.As(err, &execError) { + return &ExternalCommandExitError{execError} + } return fmt.Errorf("failed to run extension: %w\n", err) } return nil