* Implement first round of support for GitHub Actions This commit adds: gh actions gh run list gh run view gh job view as part of our first round of actions support. These commands are unlisted and considered in beta. * review feedback * tests for exit status on job view * spinner tracks io itself * review feedback * fix PR matching * enable pager for job log viewing * add more colorf functions * add AnnotationSymbol * hide job, run * do not add method to api.Client * remove useless cargo coded copypasta
204 lines
3.9 KiB
Go
204 lines
3.9 KiB
Go
package iostreams
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/mgutz/ansi"
|
|
)
|
|
|
|
var (
|
|
magenta = ansi.ColorFunc("magenta")
|
|
cyan = ansi.ColorFunc("cyan")
|
|
red = ansi.ColorFunc("red")
|
|
yellow = ansi.ColorFunc("yellow")
|
|
blue = ansi.ColorFunc("blue")
|
|
green = ansi.ColorFunc("green")
|
|
gray = ansi.ColorFunc("black+h")
|
|
bold = ansi.ColorFunc("default+b")
|
|
cyanBold = ansi.ColorFunc("cyan+b")
|
|
|
|
gray256 = func(t string) string {
|
|
return fmt.Sprintf("\x1b[%d;5;%dm%s\x1b[m", 38, 242, t)
|
|
}
|
|
)
|
|
|
|
func EnvColorDisabled() bool {
|
|
return os.Getenv("NO_COLOR") != "" || os.Getenv("CLICOLOR") == "0"
|
|
}
|
|
|
|
func EnvColorForced() bool {
|
|
return os.Getenv("CLICOLOR_FORCE") != "" && os.Getenv("CLICOLOR_FORCE") != "0"
|
|
}
|
|
|
|
func Is256ColorSupported() bool {
|
|
term := os.Getenv("TERM")
|
|
colorterm := os.Getenv("COLORTERM")
|
|
|
|
return strings.Contains(term, "256") ||
|
|
strings.Contains(term, "24bit") ||
|
|
strings.Contains(term, "truecolor") ||
|
|
strings.Contains(colorterm, "256") ||
|
|
strings.Contains(colorterm, "24bit") ||
|
|
strings.Contains(colorterm, "truecolor")
|
|
}
|
|
|
|
func NewColorScheme(enabled, is256enabled bool) *ColorScheme {
|
|
return &ColorScheme{
|
|
enabled: enabled,
|
|
is256enabled: is256enabled,
|
|
}
|
|
}
|
|
|
|
type ColorScheme struct {
|
|
enabled bool
|
|
is256enabled bool
|
|
}
|
|
|
|
func (c *ColorScheme) Bold(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return bold(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Boldf(t string, args ...interface{}) string {
|
|
return c.Bold(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Red(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return red(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Redf(t string, args ...interface{}) string {
|
|
return c.Red(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Yellow(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return yellow(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Yellowf(t string, args ...interface{}) string {
|
|
return c.Yellow(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Green(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return green(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Greenf(t string, args ...interface{}) string {
|
|
return c.Green(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Gray(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
if c.is256enabled {
|
|
return gray256(t)
|
|
}
|
|
return gray(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Grayf(t string, args ...interface{}) string {
|
|
return c.Gray(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Magenta(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return magenta(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Magentaf(t string, args ...interface{}) string {
|
|
return c.Magenta(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) Cyan(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return cyan(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Cyanf(t string, args ...interface{}) string {
|
|
return c.Cyan(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) CyanBold(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return cyanBold(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Blue(t string) string {
|
|
if !c.enabled {
|
|
return t
|
|
}
|
|
return blue(t)
|
|
}
|
|
|
|
func (c *ColorScheme) Bluef(t string, args ...interface{}) string {
|
|
return c.Blue(fmt.Sprintf(t, args...))
|
|
}
|
|
|
|
func (c *ColorScheme) SuccessIcon() string {
|
|
return c.SuccessIconWithColor(c.Green)
|
|
}
|
|
|
|
func (c *ColorScheme) SuccessIconWithColor(colo func(string) string) string {
|
|
return colo("✓")
|
|
}
|
|
|
|
func (c *ColorScheme) WarningIcon() string {
|
|
return c.Yellow("!")
|
|
}
|
|
|
|
func (c *ColorScheme) FailureIcon() string {
|
|
return c.FailureIconWithColor(c.Red)
|
|
}
|
|
|
|
func (c *ColorScheme) FailureIconWithColor(colo func(string) string) string {
|
|
return colo("X")
|
|
}
|
|
|
|
func (c *ColorScheme) ColorFromString(s string) func(string) string {
|
|
s = strings.ToLower(s)
|
|
var fn func(string) string
|
|
switch s {
|
|
case "bold":
|
|
fn = c.Bold
|
|
case "red":
|
|
fn = c.Red
|
|
case "yellow":
|
|
fn = c.Yellow
|
|
case "green":
|
|
fn = c.Green
|
|
case "gray":
|
|
fn = c.Gray
|
|
case "magenta":
|
|
fn = c.Magenta
|
|
case "cyan":
|
|
fn = c.Cyan
|
|
case "blue":
|
|
fn = c.Blue
|
|
default:
|
|
fn = func(s string) string {
|
|
return s
|
|
}
|
|
}
|
|
|
|
return fn
|
|
}
|