From 4b79edf603044928c8bb5a2bef9070209de0ee52 Mon Sep 17 00:00:00 2001 From: Bruno Alla Date: Thu, 3 Jun 2021 08:51:39 +0100 Subject: [PATCH] Add support for removing environment secrets --- pkg/cmd/secret/remove/remove.go | 25 +++++++++++++----- pkg/cmd/secret/remove/remove_test.go | 39 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/pkg/cmd/secret/remove/remove.go b/pkg/cmd/secret/remove/remove.go index d52269d73..718e09050 100644 --- a/pkg/cmd/secret/remove/remove.go +++ b/pkg/cmd/secret/remove/remove.go @@ -20,6 +20,7 @@ type RemoveOptions struct { SecretName string OrgName string + EnvName string } func NewCmdRemove(f *cmdutil.Factory, runF func(*RemoveOptions) error) *cobra.Command { @@ -31,12 +32,16 @@ func NewCmdRemove(f *cmdutil.Factory, runF func(*RemoveOptions) error) *cobra.Co cmd := &cobra.Command{ Use: "remove ", - Short: "Remove an organization or repository secret", + Short: "Remove an organization, environment, or repository secret", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { // support `-R, --repo` override opts.BaseRepo = f.BaseRepo + if err := cmdutil.MutuallyExclusive("specify only one of `--org` or `--env`", opts.OrgName != "", opts.EnvName != ""); err != nil { + return err + } + opts.SecretName = args[0] if runF != nil { @@ -46,7 +51,8 @@ func NewCmdRemove(f *cmdutil.Factory, runF func(*RemoveOptions) error) *cobra.Co return removeRun(opts) }, } - cmd.Flags().StringVarP(&opts.OrgName, "org", "o", "", "List secrets for an organization") + cmd.Flags().StringVarP(&opts.OrgName, "org", "o", "", "Remove a secret for an organization") + cmd.Flags().StringVarP(&opts.EnvName, "env", "e", "", "Remove a secret for an environment") return cmd } @@ -59,6 +65,7 @@ func removeRun(opts *RemoveOptions) error { client := api.NewClientFromHTTP(c) orgName := opts.OrgName + envName := opts.EnvName var baseRepo ghrepo.Interface if orgName == "" { @@ -69,10 +76,12 @@ func removeRun(opts *RemoveOptions) error { } var path string - if orgName == "" { - path = fmt.Sprintf("repos/%s/actions/secrets/%s", ghrepo.FullName(baseRepo), opts.SecretName) - } else { + if orgName != "" { path = fmt.Sprintf("orgs/%s/actions/secrets/%s", orgName, opts.SecretName) + } else if envName != "" { + path = fmt.Sprintf("repos/%s/environments/%s/secrets/%s", ghrepo.FullName(baseRepo), envName, opts.SecretName) + } else { + path = fmt.Sprintf("repos/%s/actions/secrets/%s", ghrepo.FullName(baseRepo), opts.SecretName) } cfg, err := opts.Config() @@ -96,7 +105,11 @@ func removeRun(opts *RemoveOptions) error { target = ghrepo.FullName(baseRepo) } cs := opts.IO.ColorScheme() - fmt.Fprintf(opts.IO.Out, "%s Removed secret %s from %s\n", cs.SuccessIconWithColor(cs.Red), opts.SecretName, target) + if envName != "" { + fmt.Fprintf(opts.IO.Out, "%s Removed secret %s from %s environment on %s\n", cs.SuccessIconWithColor(cs.Red), opts.SecretName, envName, target) + } else { + fmt.Fprintf(opts.IO.Out, "%s Removed secret %s from %s\n", cs.SuccessIconWithColor(cs.Red), opts.SecretName, target) + } } return nil diff --git a/pkg/cmd/secret/remove/remove_test.go b/pkg/cmd/secret/remove/remove_test.go index 7cec1030c..b47703049 100644 --- a/pkg/cmd/secret/remove/remove_test.go +++ b/pkg/cmd/secret/remove/remove_test.go @@ -41,6 +41,14 @@ func TestNewCmdRemove(t *testing.T) { OrgName: "anOrg", }, }, + { + name: "env", + cli: "cool --env anEnv", + wants: RemoveOptions{ + SecretName: "cool", + EnvName: "anEnv", + }, + }, } for _, tt := range tests { @@ -72,6 +80,7 @@ func TestNewCmdRemove(t *testing.T) { assert.Equal(t, tt.wants.SecretName, gotOpts.SecretName) assert.Equal(t, tt.wants.OrgName, gotOpts.OrgName) + assert.Equal(t, tt.wants.EnvName, gotOpts.EnvName) }) } @@ -106,6 +115,36 @@ func Test_removeRun_repo(t *testing.T) { reg.Verify(t) } +func Test_removeRun_env(t *testing.T) { + reg := &httpmock.Registry{} + + reg.Register( + httpmock.REST("DELETE", "repos/owner/repo/environments/development/secrets/cool_secret"), + httpmock.StatusStringResponse(204, "No Content")) + + io, _, _, _ := iostreams.Test() + + opts := &RemoveOptions{ + IO: io, + HttpClient: func() (*http.Client, error) { + return &http.Client{Transport: reg}, nil + }, + Config: func() (config.Config, error) { + return config.NewBlankConfig(), nil + }, + BaseRepo: func() (ghrepo.Interface, error) { + return ghrepo.FromFullName("owner/repo") + }, + SecretName: "cool_secret", + EnvName: "development", + } + + err := removeRun(opts) + assert.NoError(t, err) + + reg.Verify(t) +} + func Test_removeRun_org(t *testing.T) { tests := []struct { name string