Files
gh-actions-cache/internal/utils.go
Sankalp Kotewar c98ebfe90b E2E delete command using list API (#4)
* Completed List cmd and added API calls

* Minor comments and add delete code to pass linting

* Typo in descriptions

* Added delete functionality using existing list API

* Updated limit param for list api to default 30

* Minor refactoring

* Linting fixes for survey output

* Implemented review comments

* Handling 404 response when confirm flag is passed

* Added COMMAND back to delete CLI

* Minor comments

* Check http err statuscode for 404

* Validations

* Validations-1

* improved branch flag validation

* removed build

* String match made case insensitive

* Added TODO for error handling

* Updated error message when args are not provided

* Worked on review comments

* Argument length check updated

* Separated direct and indirect dependencies

* Used SPrintF for formatting strings

* Updated lastAccessed time logic

* Removed extra variable userConfirmation

* Removed unnecessary computations

* Printing and formatting changes

* Passed key from input in queryparams

* Scan List API iteratively to get exact matches

* Added pretty print for trimmed list

* Update page number instead of re-generating params

* Added listAllCaches method and moved it to utils

* Moved redTick to utils

* Update internal/utils.go

Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>

* Limited scope of `sb` to `if` block

* Fixed pretty print issue

* Error type checked for httpError

* Added PrintOneOrMore fn, moved listAll to service

* Implemented `Goment` for last accessed time

* Used percentage based on window size for printing

* Removed stringbuilder and updated fn name

* Made `ListAllCaches` member of `actions_cache.go`

* Updated prettyPrint logic cover better content

* Using PrettyPrint for List command as well.

* Separated direct and indirect modules

Co-authored-by: t-dedah <t-dedah@github.com>
Co-authored-by: Deepak Dahiya <59823596+t-dedah@users.noreply.github.com>
Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>
2022-06-28 14:40:11 +05:30

141 lines
3.5 KiB
Go

package internal
import (
"fmt"
"math"
"net/url"
"os"
"strconv"
"strings"
"unicode/utf8"
"github.com/TwiN/go-color"
"github.com/actions/gh-actions-cache/types"
gh "github.com/cli/go-gh"
ghRepo "github.com/cli/go-gh/pkg/repository"
"github.com/moby/term"
"github.com/nleeper/goment"
)
const MB_IN_BYTES = 1024 * 1024
const GB_IN_BYTES = 1024 * 1024 * 1024
var SORT_INPUT_TO_QUERY_MAP = map[string]string{
"created-at": "created_at",
"last-used": "last_accessed_at",
"size": "size_in_bytes",
}
func GenerateQueryParams(branch string, limit int, key string, order string, sort string, page int) url.Values {
query := url.Values{}
if branch != "" {
if strings.HasPrefix(branch, "refs/") {
query.Add("ref", branch)
} else {
query.Add("ref", fmt.Sprintf("refs/heads/%s", branch))
}
}
if limit != 30 {
query.Add("per_page", strconv.Itoa(limit))
}
if key != "" {
query.Add("key", key)
}
if order != "" {
query.Add("direction", order)
}
if sort != "" {
query.Add("sort", SORT_INPUT_TO_QUERY_MAP[sort])
}
if page > 1 {
query.Add("page", strconv.Itoa(page))
}
return query
}
func GetRepo(r string) (ghRepo.Repository, error) {
if r != "" {
return ghRepo.Parse(r)
}
return gh.CurrentRepository()
}
func FormatCacheSize(size_in_bytes float64) string {
if size_in_bytes < 1024 {
return fmt.Sprintf("%.2f B", size_in_bytes)
}
if size_in_bytes < MB_IN_BYTES {
return fmt.Sprintf("%.2f KB", size_in_bytes/1024)
}
if size_in_bytes < GB_IN_BYTES {
return fmt.Sprintf("%.2f MB", size_in_bytes/MB_IN_BYTES)
}
return fmt.Sprintf("%.2f GB", size_in_bytes/GB_IN_BYTES)
}
func PrettyPrintCacheList(caches []types.ActionsCache) {
fd := os.Stdin.Fd()
ws, _ := term.GetWinsize(fd)
width := math.Min(float64(ws.Width), 180)
keyWidth := int(math.Floor(0.30 * width))
sizeWidth := int(math.Floor(0.12 * width))
refWidth := int(math.Floor(0.20 * width))
timeWidth := int(math.Floor(0.20 * width))
for _, cache := range caches {
var formattedRow string = getFormattedCacheInfo(cache, keyWidth, sizeWidth, refWidth, timeWidth)
fmt.Println(formattedRow)
}
}
func PrettyPrintTrimmedCacheList(caches []types.ActionsCache) {
length := len(caches)
limit := 30
if length > limit {
PrettyPrintCacheList(caches[:limit])
fmt.Printf("... and %d more\n\n", length-limit)
} else {
PrettyPrintCacheList(caches[:length])
}
fmt.Print("\n")
}
func lastAccessedTime(lastAccessedAt string) string {
lastAccessed, _ := goment.New(lastAccessedAt)
return fmt.Sprintf("Used %s", lastAccessed.FromNow())
}
func trimOrPad(value string, maxSize int) string {
if len(value) > maxSize {
value = value[:maxSize-3] + "..."
} else {
value = value + strings.Repeat(" ", maxSize-len(value))
}
return value
}
func getFormattedCacheInfo(cache types.ActionsCache, keyWidth int, sizeWidth int, refWidth int, timeWidth int) string {
key := trimOrPad(cache.Key, keyWidth)
size := trimOrPad(fmt.Sprintf("[%s]", FormatCacheSize(cache.SizeInBytes)), sizeWidth)
ref := trimOrPad(cache.Ref, refWidth)
time := trimOrPad(lastAccessedTime(cache.LastAccessedAt), timeWidth)
return fmt.Sprintf(" %s %s %s %s", key, size, ref, time)
}
func RedTick() string {
src := "\u2713"
tick, _ := utf8.DecodeRuneInString(src)
redTick := color.Colorize(color.Red, string(tick))
return redTick
}
func PrintSingularOrPlural(count int, singularStr string, pluralStr string) string {
if count == 1 {
return fmt.Sprintf("%d %s", count, singularStr)
}
return fmt.Sprintf("%d %s", count, pluralStr)
}