From 001b1a36e7e32b16e8a604de6e6229d39ffcbb69 Mon Sep 17 00:00:00 2001 From: meiji163 Date: Sun, 31 Oct 2021 14:46:57 -0700 Subject: [PATCH 1/4] add base resolution to delete --- pkg/cmd/repo/delete/delete.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/cmd/repo/delete/delete.go b/pkg/cmd/repo/delete/delete.go index 3036f7697..16604cb65 100644 --- a/pkg/cmd/repo/delete/delete.go +++ b/pkg/cmd/repo/delete/delete.go @@ -18,6 +18,7 @@ import ( type DeleteOptions struct { HttpClient func() (*http.Client, error) + BaseRepo func() (ghrepo.Interface, error) IO *iostreams.IOStreams RepoArg string Confirmed bool @@ -30,15 +31,17 @@ func NewCmdDelete(f *cmdutil.Factory, runF func(*DeleteOptions) error) *cobra.Co } cmd := &cobra.Command{ - Use: "delete ", + Use: "delete []", Short: "Delete a repository", Long: `Delete a GitHub repository. Deletion requires authorization with the "delete_repo" scope. To authorize, run "gh auth refresh -s delete_repo"`, - Args: cmdutil.ExactArgs(1, "cannot delete: repository argument required"), + Args: cobra.MaximumNArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - opts.RepoArg = args[0] + if len(args) > 0 { + opts.RepoArg = args[0] + } if !opts.IO.CanPrompt() && !opts.Confirmed { return cmdutil.FlagErrorf("could not prompt: confirmation with prompt or --confirm flag required") } @@ -60,8 +63,15 @@ func deleteRun(opts *DeleteOptions) error { } apiClient := api.NewClientFromHTTP(httpClient) - repoSelector := opts.RepoArg var toDelete ghrepo.Interface + repoSelector := opts.RepoArg + if repoSelector == "" { + currRepo, err := opts.BaseRepo() + if err != nil { + return err + } + repoSelector = ghrepo.FullName(currRepo) + } if !strings.Contains(repoSelector, "/") { currentUser, err := api.CurrentLoginName(apiClient, ghinstance.Default()) From 09064a5f551fa1553d957f17313fd76ad7b8f50d Mon Sep 17 00:00:00 2001 From: meiji163 Date: Tue, 2 Nov 2021 10:51:42 -0700 Subject: [PATCH 2/4] fix tests --- pkg/cmd/repo/delete/delete.go | 6 ++++++ pkg/cmd/repo/delete/delete_test.go | 32 +++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/pkg/cmd/repo/delete/delete.go b/pkg/cmd/repo/delete/delete.go index 16604cb65..c617c7468 100644 --- a/pkg/cmd/repo/delete/delete.go +++ b/pkg/cmd/repo/delete/delete.go @@ -35,6 +35,8 @@ func NewCmdDelete(f *cmdutil.Factory, runF func(*DeleteOptions) error) *cobra.Co Short: "Delete a repository", Long: `Delete a GitHub repository. +With no argument, deletes the current repository. Otherwise, deletes the specified repository. + Deletion requires authorization with the "delete_repo" scope. To authorize, run "gh auth refresh -s delete_repo"`, Args: cobra.MaximumNArgs(1), @@ -45,6 +47,10 @@ To authorize, run "gh auth refresh -s delete_repo"`, if !opts.IO.CanPrompt() && !opts.Confirmed { return cmdutil.FlagErrorf("could not prompt: confirmation with prompt or --confirm flag required") } + if !opts.IO.CanPrompt() && opts.RepoArg == "" { + return cmdutil.FlagErrorf("confirmation prompt required with no arguments") + } + if runF != nil { return runF(opts) } diff --git a/pkg/cmd/repo/delete/delete_test.go b/pkg/cmd/repo/delete/delete_test.go index d561a3269..03055f65c 100644 --- a/pkg/cmd/repo/delete/delete_test.go +++ b/pkg/cmd/repo/delete/delete_test.go @@ -5,6 +5,7 @@ import ( "net/http" "testing" + "github.com/cli/cli/v2/internal/ghrepo" "github.com/cli/cli/v2/pkg/cmdutil" "github.com/cli/cli/v2/pkg/httpmock" "github.com/cli/cli/v2/pkg/iostreams" @@ -24,21 +25,16 @@ func TestNewCmdDelete(t *testing.T) { }{ { name: "confirm flag", + tty: true, input: "OWNER/REPO --confirm", output: DeleteOptions{RepoArg: "OWNER/REPO", Confirmed: true}, }, { - name: "no confirmation no tty", + name: "no confirmation notty", input: "OWNER/REPO", output: DeleteOptions{RepoArg: "OWNER/REPO"}, wantErr: true, - errMsg: "could not prompt: confirmation with prompt or --confirm flag required"}, - { - name: "no argument", - input: "", - wantErr: true, - errMsg: "cannot delete: repository argument required", - tty: true, + errMsg: "could not prompt: confirmation with prompt or --confirm flag required", }, } for _, tt := range tests { @@ -101,7 +97,21 @@ func Test_deleteRun(t *testing.T) { }, }, { - name: "confimation no tty", + name: "infer base repo", + tty: true, + opts: &DeleteOptions{}, + wantStdout: "✓ Deleted repository OWNER/REPO\n", + askStubs: func(q *prompt.AskStubber) { + q.StubOne("OWNER/REPO") + }, + httpStubs: func(reg *httpmock.Registry) { + reg.Register( + httpmock.REST("DELETE", "repos/OWNER/REPO"), + httpmock.StatusStringResponse(204, "{}")) + }, + }, + { + name: "confirmation no tty", opts: &DeleteOptions{ RepoArg: "OWNER/REPO", Confirmed: true, @@ -137,6 +147,10 @@ func Test_deleteRun(t *testing.T) { tt.askStubs(q) } + tt.opts.BaseRepo = func() (ghrepo.Interface, error) { + return ghrepo.New("OWNER", "REPO"), nil + } + reg := &httpmock.Registry{} if tt.httpStubs != nil { tt.httpStubs(reg) From 26748dc2f3da4ba6b7fb9e39a392af4b1097e438 Mon Sep 17 00:00:00 2001 From: meiji163 Date: Tue, 2 Nov 2021 10:59:30 -0700 Subject: [PATCH 3/4] allow base repo notty --- pkg/cmd/repo/delete/delete.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/cmd/repo/delete/delete.go b/pkg/cmd/repo/delete/delete.go index c617c7468..5cc5b25b6 100644 --- a/pkg/cmd/repo/delete/delete.go +++ b/pkg/cmd/repo/delete/delete.go @@ -47,9 +47,6 @@ To authorize, run "gh auth refresh -s delete_repo"`, if !opts.IO.CanPrompt() && !opts.Confirmed { return cmdutil.FlagErrorf("could not prompt: confirmation with prompt or --confirm flag required") } - if !opts.IO.CanPrompt() && opts.RepoArg == "" { - return cmdutil.FlagErrorf("confirmation prompt required with no arguments") - } if runF != nil { return runF(opts) From a1426ac19baaf5c8279604f7e0071428b4aee943 Mon Sep 17 00:00:00 2001 From: meiji163 Date: Wed, 10 Nov 2021 17:10:37 -0800 Subject: [PATCH 4/4] implement samcoe's suggestions --- pkg/cmd/repo/delete/delete.go | 34 +++++++++++++++--------------- pkg/cmd/repo/delete/delete_test.go | 8 ++++++- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/pkg/cmd/repo/delete/delete.go b/pkg/cmd/repo/delete/delete.go index 5cc5b25b6..5fd5a5340 100644 --- a/pkg/cmd/repo/delete/delete.go +++ b/pkg/cmd/repo/delete/delete.go @@ -28,6 +28,7 @@ func NewCmdDelete(f *cmdutil.Factory, runF func(*DeleteOptions) error) *cobra.Co opts := &DeleteOptions{ IO: f.IOStreams, HttpClient: f.HttpClient, + BaseRepo: f.BaseRepo, } cmd := &cobra.Command{ @@ -45,7 +46,7 @@ To authorize, run "gh auth refresh -s delete_repo"`, opts.RepoArg = args[0] } if !opts.IO.CanPrompt() && !opts.Confirmed { - return cmdutil.FlagErrorf("could not prompt: confirmation with prompt or --confirm flag required") + return cmdutil.FlagErrorf("--confirm required when not running interactively") } if runF != nil { @@ -67,27 +68,26 @@ func deleteRun(opts *DeleteOptions) error { apiClient := api.NewClientFromHTTP(httpClient) var toDelete ghrepo.Interface - repoSelector := opts.RepoArg - if repoSelector == "" { - currRepo, err := opts.BaseRepo() + + if opts.RepoArg == "" { + toDelete, err = opts.BaseRepo() if err != nil { return err } - repoSelector = ghrepo.FullName(currRepo) - } - - if !strings.Contains(repoSelector, "/") { - currentUser, err := api.CurrentLoginName(apiClient, ghinstance.Default()) - if err != nil { - return err + } else { + repoSelector := opts.RepoArg + if !strings.Contains(repoSelector, "/") { + currentUser, err := api.CurrentLoginName(apiClient, ghinstance.Default()) + if err != nil { + return err + } + repoSelector = currentUser + "/" + repoSelector + } + toDelete, err = ghrepo.FromFullName(repoSelector) + if err != nil { + return fmt.Errorf("argument error: %w", err) } - repoSelector = currentUser + "/" + repoSelector } - toDelete, err = ghrepo.FromFullName(repoSelector) - if err != nil { - return fmt.Errorf("argument error: %w", err) - } - fullName := ghrepo.FullName(toDelete) if !opts.Confirmed { diff --git a/pkg/cmd/repo/delete/delete_test.go b/pkg/cmd/repo/delete/delete_test.go index 03055f65c..da9c04223 100644 --- a/pkg/cmd/repo/delete/delete_test.go +++ b/pkg/cmd/repo/delete/delete_test.go @@ -34,7 +34,13 @@ func TestNewCmdDelete(t *testing.T) { input: "OWNER/REPO", output: DeleteOptions{RepoArg: "OWNER/REPO"}, wantErr: true, - errMsg: "could not prompt: confirmation with prompt or --confirm flag required", + errMsg: "--confirm required when not running interactively", + }, + { + name: "base repo resolution", + input: "", + tty: true, + output: DeleteOptions{}, }, } for _, tt := range tests {