From 7083f6dda4b7d0f14aa610020e2d69679f7ac7bf Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Wed, 29 Oct 2025 03:12:07 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=92=A1=20(gh=20repo=20delete)=20Add?= =?UTF-8?q?=20warning=20when=20`--yes`=20is=20ignored=20without=20a=20repo?= =?UTF-8?q?sitory,=20Closes:=20#12033?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cmd/repo/delete/delete.go | 1 + pkg/cmd/repo/delete/delete_test.go | 70 +++++++++++++++++------------- 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/pkg/cmd/repo/delete/delete.go b/pkg/cmd/repo/delete/delete.go index 01495387e..6724191da 100644 --- a/pkg/cmd/repo/delete/delete.go +++ b/pkg/cmd/repo/delete/delete.go @@ -62,6 +62,7 @@ func NewCmdDelete(f *cmdutil.Factory, runF func(*DeleteOptions) error) *cobra.Co if !opts.IO.CanPrompt() { return cmdutil.FlagErrorf("cannot non-interactively delete current repository. Please specify a repository or run interactively") } + _, _ = fmt.Fprintln(opts.IO.ErrOut, "Warning: `--yes` is ignored since no repository was specified") opts.Confirmed = false } diff --git a/pkg/cmd/repo/delete/delete_test.go b/pkg/cmd/repo/delete/delete_test.go index d5070d5aa..2ed2a56a5 100644 --- a/pkg/cmd/repo/delete/delete_test.go +++ b/pkg/cmd/repo/delete/delete_test.go @@ -16,12 +16,13 @@ import ( func TestNewCmdDelete(t *testing.T) { tests := []struct { - name string - input string - tty bool - output DeleteOptions - wantErr bool - errMsg string + name string + input string + tty bool + output DeleteOptions + wantErr bool + wantErrMsg string + wantStderr string }{ { name: "confirm flag", @@ -36,11 +37,12 @@ func TestNewCmdDelete(t *testing.T) { output: DeleteOptions{RepoArg: "OWNER/REPO", Confirmed: true}, }, { - name: "no confirmation notty", - input: "OWNER/REPO", - output: DeleteOptions{RepoArg: "OWNER/REPO"}, - wantErr: true, - errMsg: "--yes required when not running interactively", + name: "no confirmation notty", + input: "OWNER/REPO", + output: DeleteOptions{RepoArg: "OWNER/REPO"}, + wantErr: true, + wantErrMsg: "--yes required when not running interactively", + wantStderr: "Error: --yes required when not running interactively\n", }, { name: "base repo resolution", @@ -49,33 +51,39 @@ func TestNewCmdDelete(t *testing.T) { output: DeleteOptions{}, }, { - name: "yes flag ignored when no argument tty", - tty: true, - input: "--yes", - output: DeleteOptions{Confirmed: false}, // --yes should be ignored + name: "yes flag ignored when no argument tty", + tty: true, + input: "--yes", + output: DeleteOptions{Confirmed: false}, // --yes should be ignored + wantErr: false, + wantStderr: "Warning: `--yes` is ignored since no repository was specified\n", }, { - name: "yes flag error when no argument notty", - input: "--yes", - wantErr: true, - errMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", + name: "yes flag error when no argument notty", + input: "--yes", + wantErr: true, + wantErrMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", + wantStderr: "Error: cannot non-interactively delete current repository. Please specify a repository or run interactively\n", }, { - name: "confirm flag error when no argument notty", - input: "--confirm", - wantErr: true, - errMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", + name: "confirm flag error when no argument notty", + input: "--confirm", + wantErr: true, + wantErrMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", + wantStderr: "Error: cannot non-interactively delete current repository. Please specify a repository or run interactively\n", }, { - name: "confirm flag also ignored when no argument tty", - tty: true, - input: "--confirm", - output: DeleteOptions{Confirmed: false}, // --confirm should also be ignored + name: "confirm flag also ignored when no argument tty", + tty: true, + input: "--confirm", + output: DeleteOptions{Confirmed: false}, // --confirm should also be ignored + wantStderr: "Warning: `--yes` is ignored since no repository was specified\n", + // Note: This does not confuse the user, as deprecation warnings are shown: "Flag --confirm has been deprecated, use `--yes` instead" }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - ios, _, _, _ := iostreams.Test() + ios, _, _, stdErr := iostreams.Test() ios.SetStdinTTY(tt.tty) ios.SetStdoutTTY(tt.tty) f := &cmdutil.Factory{ @@ -91,12 +99,14 @@ func TestNewCmdDelete(t *testing.T) { cmd.SetArgs(argv) cmd.SetIn(&bytes.Buffer{}) cmd.SetOut(&bytes.Buffer{}) - cmd.SetErr(&bytes.Buffer{}) + cmd.SetErr(stdErr) _, err = cmd.ExecuteC() + + assert.Equal(t, tt.wantStderr, stdErr.String()) if tt.wantErr { assert.Error(t, err) - assert.Equal(t, tt.errMsg, err.Error()) + assert.Equal(t, tt.wantErrMsg, err.Error()) return } assert.NoError(t, err) From a7f14576aa541dfc1cc97a0fe890cb37f9521475 Mon Sep 17 00:00:00 2001 From: Shion Ichikawa Date: Wed, 29 Oct 2025 08:47:34 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=85=20(repo=20delete)=20remove=20comp?= =?UTF-8?q?rehensive=20assertions=20on=20check=20stderr=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cmd/repo/delete/delete_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pkg/cmd/repo/delete/delete_test.go b/pkg/cmd/repo/delete/delete_test.go index 2ed2a56a5..64a8ee301 100644 --- a/pkg/cmd/repo/delete/delete_test.go +++ b/pkg/cmd/repo/delete/delete_test.go @@ -42,7 +42,6 @@ func TestNewCmdDelete(t *testing.T) { output: DeleteOptions{RepoArg: "OWNER/REPO"}, wantErr: true, wantErrMsg: "--yes required when not running interactively", - wantStderr: "Error: --yes required when not running interactively\n", }, { name: "base repo resolution", @@ -63,14 +62,12 @@ func TestNewCmdDelete(t *testing.T) { input: "--yes", wantErr: true, wantErrMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", - wantStderr: "Error: cannot non-interactively delete current repository. Please specify a repository or run interactively\n", }, { name: "confirm flag error when no argument notty", input: "--confirm", wantErr: true, wantErrMsg: "cannot non-interactively delete current repository. Please specify a repository or run interactively", - wantStderr: "Error: cannot non-interactively delete current repository. Please specify a repository or run interactively\n", }, { name: "confirm flag also ignored when no argument tty", @@ -103,13 +100,13 @@ func TestNewCmdDelete(t *testing.T) { _, err = cmd.ExecuteC() - assert.Equal(t, tt.wantStderr, stdErr.String()) if tt.wantErr { assert.Error(t, err) assert.Equal(t, tt.wantErrMsg, err.Error()) return } assert.NoError(t, err) + assert.Equal(t, tt.wantStderr, stdErr.String()) assert.Equal(t, tt.output.RepoArg, gotOpts.RepoArg) }) }