X Tutup
Skip to content

Commit e5bdaaa

Browse files
tylerxwrightmislav
andcommitted
Add ability to list environment secrets
Co-authored-by: Mislav Marohnić <mislav@github.com>
1 parent 157bab1 commit e5bdaaa

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

pkg/cmd/secret/list/list.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type ListOptions struct {
2626
BaseRepo func() (ghrepo.Interface, error)
2727

2828
OrgName string
29+
EnvName string
2930
}
3031

3132
func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Command {
@@ -38,12 +39,16 @@ func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Comman
3839
cmd := &cobra.Command{
3940
Use: "list",
4041
Short: "List secrets",
41-
Long: "List secrets for a repository or organization",
42+
Long: "List secrets for a repository, environment, or organization",
4243
Args: cobra.NoArgs,
4344
RunE: func(cmd *cobra.Command, args []string) error {
4445
// support `-R, --repo` override
4546
opts.BaseRepo = f.BaseRepo
4647

48+
if err := cmdutil.MutuallyExclusive("specify only one of `--org` or `--env`", opts.OrgName != "", opts.EnvName != ""); err != nil {
49+
return err
50+
}
51+
4752
if runF != nil {
4853
return runF(opts)
4954
}
@@ -53,6 +58,7 @@ func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Comman
5358
}
5459

5560
cmd.Flags().StringVarP(&opts.OrgName, "org", "o", "", "List secrets for an organization")
61+
cmd.Flags().StringVarP(&opts.EnvName, "env", "e", "", "List secrets for an environment")
5662

5763
return cmd
5864
}
@@ -64,6 +70,7 @@ func listRun(opts *ListOptions) error {
6470
}
6571

6672
orgName := opts.OrgName
73+
envName := opts.EnvName
6774

6875
var baseRepo ghrepo.Interface
6976
if orgName == "" {
@@ -75,7 +82,11 @@ func listRun(opts *ListOptions) error {
7582

7683
var secrets []*Secret
7784
if orgName == "" {
78-
secrets, err = getRepoSecrets(client, baseRepo)
85+
if envName == "" {
86+
secrets, err = getRepoSecrets(client, baseRepo)
87+
} else {
88+
secrets, err = getEnvSecrets(client, baseRepo, envName)
89+
}
7990
} else {
8091
var cfg config.Config
8192
var host string
@@ -171,6 +182,11 @@ func getOrgSecrets(client httpClient, host, orgName string) ([]*Secret, error) {
171182
return secrets, nil
172183
}
173184

185+
func getEnvSecrets(client httpClient, repo ghrepo.Interface, envName string) ([]*Secret, error) {
186+
path := fmt.Sprintf("repos/%s/environments/%s/secrets", ghrepo.FullName(repo), envName)
187+
return getSecrets(client, repo.RepoHost(), path)
188+
}
189+
174190
func getRepoSecrets(client httpClient, repo ghrepo.Interface) ([]*Secret, error) {
175191
return getSecrets(client, repo.RepoHost(), fmt.Sprintf("repos/%s/actions/secrets",
176192
ghrepo.FullName(repo)))

pkg/cmd/secret/list/list_test.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ func Test_NewCmdList(t *testing.T) {
4040
OrgName: "UmbrellaCorporation",
4141
},
4242
},
43+
{
44+
name: "env",
45+
cli: "-eDevelopment",
46+
wants: ListOptions{
47+
EnvName: "Development",
48+
},
49+
},
4350
}
4451

4552
for _, tt := range tests {
@@ -66,7 +73,7 @@ func Test_NewCmdList(t *testing.T) {
6673
assert.NoError(t, err)
6774

6875
assert.Equal(t, tt.wants.OrgName, gotOpts.OrgName)
69-
76+
assert.Equal(t, tt.wants.EnvName, gotOpts.EnvName)
7077
})
7178
}
7279
}
@@ -122,16 +129,44 @@ func Test_listRun(t *testing.T) {
122129
"SECRET_THREE\t1975-11-30\tSELECTED",
123130
},
124131
},
132+
{
133+
name: "env tty",
134+
tty: true,
135+
opts: &ListOptions{
136+
EnvName: "Development",
137+
},
138+
wantOut: []string{
139+
"SECRET_ONE.*Updated 1988-10-11",
140+
"SECRET_TWO.*Updated 2020-12-04",
141+
"SECRET_THREE.*Updated 1975-11-30",
142+
},
143+
},
144+
{
145+
name: "env not tty",
146+
tty: false,
147+
opts: &ListOptions{
148+
EnvName: "Development",
149+
},
150+
wantOut: []string{
151+
"SECRET_ONE\t1988-10-11",
152+
"SECRET_TWO\t2020-12-04",
153+
"SECRET_THREE\t1975-11-30",
154+
},
155+
},
125156
}
126157

127158
for _, tt := range tests {
128159
t.Run(tt.name, func(t *testing.T) {
129160
reg := &httpmock.Registry{}
130161

162+
path := "repos/owner/repo/actions/secrets"
163+
if tt.opts.EnvName != "" {
164+
path = fmt.Sprintf("repos/owner/repo/environments/%s/secrets", tt.opts.EnvName)
165+
}
166+
131167
t0, _ := time.Parse("2006-01-02", "1988-10-11")
132168
t1, _ := time.Parse("2006-01-02", "2020-12-04")
133169
t2, _ := time.Parse("2006-01-02", "1975-11-30")
134-
path := "repos/owner/repo/actions/secrets"
135170
payload := secretsPayload{}
136171
payload.Secrets = []*Secret{
137172
{

pkg/cmd/secret/secret.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ func NewCmdSecret(f *cmdutil.Factory) *cobra.Command {
1515
Use: "secret <command>",
1616
Short: "Manage GitHub secrets",
1717
Long: heredoc.Doc(`
18-
Secrets can be set at the repository or organization level for use in GitHub Actions.
19-
Run "gh help secret set" to learn how to get started.
18+
Secrets can be set at the repository, environment, or organization level for use in
19+
GitHub Actions. Run "gh help secret set" to learn how to get started.
2020
`),
2121
}
2222

0 commit comments

Comments
 (0)
X Tutup