diff --git a/pkg/cmd/extension/command.go b/pkg/cmd/extension/command.go index 0030b5078..7f2ec0ac1 100644 --- a/pkg/cmd/extension/command.go +++ b/pkg/cmd/extension/command.go @@ -338,7 +338,15 @@ func NewCmdExtension(f *cmdutil.Factory) *cobra.Command { if err != nil { return err } - return m.InstallLocal(wd) + + err = m.InstallLocal(wd) + if errors.Is(err, ErrExtensionExecutableNotFound) { + if io.IsStdoutTTY() { + fmt.Fprintln(io.ErrOut, err.Error()) + } + return nil + } + return err } repo, err := ghrepo.FromFullName(args[0]) diff --git a/pkg/cmd/extension/command_test.go b/pkg/cmd/extension/command_test.go index e26e70690..dccd487ea 100644 --- a/pkg/cmd/extension/command_test.go +++ b/pkg/cmd/extension/command_test.go @@ -286,6 +286,38 @@ func TestNewCmdExtension(t *testing.T) { } }, }, + { + name: "install local extension without executable TTY", + args: []string{"install", "."}, + managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { + em.InstallLocalFunc = func(dir string) error { + return ErrExtensionExecutableNotFound + } + em.ListFunc = func() []extensions.Extension { + return []extensions.Extension{} + } + return nil + }, + wantStderr: fmt.Sprintln(ErrExtensionExecutableNotFound.Error()), + wantErr: false, + isTTY: true, + }, + { + name: "install local extension without executable no TTY", + args: []string{"install", "."}, + managerStubs: func(em *extensions.ExtensionManagerMock) func(*testing.T) { + em.InstallLocalFunc = func(dir string) error { + return ErrExtensionExecutableNotFound + } + em.ListFunc = func() []extensions.Extension { + return []extensions.Extension{} + } + return nil + }, + wantStderr: "", + wantErr: false, + isTTY: false, + }, { name: "error extension not found", args: []string{"install", "owner/gh-some-ext"},