102 lines
2.6 KiB
Go
102 lines
2.6 KiB
Go
package internal
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"unicode/utf8"
|
|
|
|
"github.com/TwiN/go-color"
|
|
"github.com/actions/gh-actions-cache/types"
|
|
gh "github.com/cli/go-gh"
|
|
"github.com/cli/go-gh/pkg/api"
|
|
ghRepo "github.com/cli/go-gh/pkg/repository"
|
|
ghTableprinter "github.com/cli/go-gh/pkg/tableprinter"
|
|
ghTerm "github.com/cli/go-gh/pkg/term"
|
|
"github.com/nleeper/goment"
|
|
)
|
|
|
|
const MB_IN_BYTES = 1024 * 1024
|
|
const GB_IN_BYTES = 1024 * 1024 * 1024
|
|
|
|
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) {
|
|
terminal := ghTerm.FromEnv()
|
|
w, _, _ := terminal.Size()
|
|
tp := ghTableprinter.New(terminal.Out(), terminal.IsTerminalOutput(), w)
|
|
|
|
for _, cache := range caches {
|
|
tp.AddField(cache.Key)
|
|
tp.AddField(FormatCacheSize(cache.SizeInBytes))
|
|
tp.AddField(cache.Ref)
|
|
tp.AddField(lastAccessedTime(cache.LastAccessedAt))
|
|
tp.EndRow()
|
|
}
|
|
|
|
_ = tp.Render()
|
|
}
|
|
|
|
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 lastAccessed.FromNow()
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
func HttpErrorHandler(err error, errMsg404 string) types.HandledError {
|
|
var httpError api.HTTPError
|
|
if errors.As(err, &httpError) && httpError.StatusCode == 404 {
|
|
return types.HandledError{Message: errMsg404, InnerError: err}
|
|
} else if errors.As(err, &httpError) && httpError.StatusCode >= 400 && httpError.StatusCode < 500 {
|
|
return types.HandledError{Message: httpError.Message, InnerError: err}
|
|
} else {
|
|
return types.HandledError{Message: "We could not process your request due to internal error.", InnerError: err}
|
|
}
|
|
}
|