Merge pull request #8667 from toshimaru/add-cache-key-optoion-to-cache-list

feat: Add cache key option to `gh cache list`
This commit is contained in:
William Martin 2024-02-12 11:34:15 +01:00 committed by GitHub
commit 8948ee8c3b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 46 additions and 1 deletions

View file

@ -27,6 +27,7 @@ type ListOptions struct {
Limit int
Order string
Sort string
Key string
}
func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Command {
@ -47,6 +48,9 @@ func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Comman
# List caches sorted by least recently accessed
$ gh cache list --sort last_accessed_at --order asc
# List caches that have keys matching a prefix (or that match exactly)
$ gh cache list --key key-prefix
`),
Aliases: []string{"ls"},
Args: cobra.NoArgs,
@ -69,6 +73,7 @@ func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Comman
cmd.Flags().IntVarP(&opts.Limit, "limit", "L", 30, "Maximum number of caches to fetch")
cmdutil.StringEnumFlag(cmd, &opts.Order, "order", "O", "desc", []string{"asc", "desc"}, "Order of caches returned")
cmdutil.StringEnumFlag(cmd, &opts.Sort, "sort", "S", "last_accessed_at", []string{"created_at", "last_accessed_at", "size_in_bytes"}, "Sort fetched caches")
cmd.Flags().StringVarP(&opts.Key, "key", "k", "", "Filter by cache key prefix")
cmdutil.AddJSONFlags(cmd, &opts.Exporter, shared.CacheFields)
return cmd
@ -87,7 +92,7 @@ func listRun(opts *ListOptions) error {
client := api.NewClientFromHTTP(httpClient)
opts.IO.StartProgressIndicator()
result, err := shared.GetCaches(client, repo, shared.GetCachesOptions{Limit: opts.Limit, Sort: opts.Sort, Order: opts.Order})
result, err := shared.GetCaches(client, repo, shared.GetCachesOptions{Limit: opts.Limit, Sort: opts.Sort, Order: opts.Order, Key: opts.Key})
opts.IO.StopProgressIndicator()
if err != nil {
return fmt.Errorf("%s Failed to get caches: %w", opts.IO.ColorScheme().FailureIcon(), err)

View file

@ -30,6 +30,7 @@ func TestNewCmdList(t *testing.T) {
Limit: 30,
Order: "desc",
Sort: "last_accessed_at",
Key: "",
},
},
{
@ -39,6 +40,7 @@ func TestNewCmdList(t *testing.T) {
Limit: 100,
Order: "desc",
Sort: "last_accessed_at",
Key: "",
},
},
{
@ -53,6 +55,7 @@ func TestNewCmdList(t *testing.T) {
Limit: 30,
Order: "desc",
Sort: "created_at",
Key: "",
},
},
{
@ -62,6 +65,17 @@ func TestNewCmdList(t *testing.T) {
Limit: 30,
Order: "asc",
Sort: "last_accessed_at",
Key: "",
},
},
{
name: "with key",
input: "--key cache-key-prefix-",
wants: ListOptions{
Limit: 30,
Order: "desc",
Sort: "last_accessed_at",
Key: "cache-key-prefix-",
},
},
}
@ -90,6 +104,7 @@ func TestNewCmdList(t *testing.T) {
assert.Equal(t, tt.wants.Limit, gotOpts.Limit)
assert.Equal(t, tt.wants.Sort, gotOpts.Sort)
assert.Equal(t, tt.wants.Order, gotOpts.Order)
assert.Equal(t, tt.wants.Key, gotOpts.Key)
})
}
}
@ -171,6 +186,26 @@ ID KEY SIZE CREATED ACCESSED
},
wantStdout: "1\tfoo\t100 B\t2021-01-01T01:01:01Z\t2022-01-01T01:01:01Z\n2\tbar\t1.00 KiB\t2021-01-01T01:01:01Z\t2022-01-01T01:01:01Z\n",
},
{
name: "only requests caches with the provided key prefix",
opts: ListOptions{
Key: "test-key",
},
stubs: func(reg *httpmock.Registry) {
reg.Register(
func(req *http.Request) bool {
return req.URL.Query().Get("key") == "test-key"
},
httpmock.JSONResponse(shared.CachePayload{
ActionsCaches: []shared.Cache{},
TotalCount: 0,
}))
},
// We could put anything here, we're really asserting that the key is passed
// to the API.
wantErr: true,
wantErrMsg: "No caches found in OWNER/REPO",
},
{
name: "displays no results",
stubs: func(reg *httpmock.Registry) {

View file

@ -2,6 +2,7 @@ package shared
import (
"fmt"
"net/url"
"time"
"github.com/cli/cli/v2/api"
@ -38,6 +39,7 @@ type GetCachesOptions struct {
Limit int
Order string
Sort string
Key string
}
// Return a list of caches for a repository. Pass a negative limit to request
@ -57,6 +59,9 @@ func GetCaches(client *api.Client, repo ghrepo.Interface, opts GetCachesOptions)
if opts.Order != "" {
path += fmt.Sprintf("&direction=%s", opts.Order)
}
if opts.Key != "" {
path += fmt.Sprintf("&key=%s", url.QueryEscape(opts.Key))
}
var result *CachePayload
pagination: