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>
This commit is contained in:
@@ -2,12 +2,19 @@ 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
|
||||
@@ -70,3 +77,64 @@ func FormatCacheSize(size_in_bytes float64) string {
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user