2022-10-27 16:48:26 +02:00
|
|
|
package termext
|
|
|
|
|
|
|
|
import (
|
|
|
|
"golang.org/x/term"
|
|
|
|
"os"
|
|
|
|
"regexp"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// -> partly copied from [ https://github.com/jwalton/go-supportscolor/tree/master ]
|
|
|
|
|
|
|
|
func SupportsColors() bool {
|
|
|
|
|
|
|
|
if isatty := term.IsTerminal(int(os.Stdout.Fd())); !isatty {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
termenv := os.Getenv("TERM")
|
|
|
|
|
|
|
|
if termenv == "dumb" {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if osColorEnabled := enableColor(); !osColorEnabled {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ci := os.LookupEnv("CI"); ci {
|
|
|
|
var ciEnvNames = []string{"TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE", "DRONE"}
|
|
|
|
for _, ciEnvName := range ciEnvNames {
|
|
|
|
_, exists := os.LookupEnv(ciEnvName)
|
|
|
|
if exists {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if os.Getenv("CI_NAME") == "codeship" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if teamCityVersion, isTeamCity := os.LookupEnv("TEAMCITY_VERSION"); isTeamCity {
|
|
|
|
versionRegex := regexp.MustCompile(`^(9\.(0*[1-9]\d*)\.|\d{2,}\.)`)
|
|
|
|
if versionRegex.MatchString(teamCityVersion) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
if os.Getenv("COLORTERM") == "truecolor" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if termProgram, termProgramPreset := os.LookupEnv("TERM_PROGRAM"); termProgramPreset {
|
|
|
|
switch termProgram {
|
|
|
|
case "iTerm.app":
|
|
|
|
termProgramVersion := strings.Split(os.Getenv("TERM_PROGRAM_VERSION"), ".")
|
|
|
|
version, err := strconv.ParseInt(termProgramVersion[0], 10, 64)
|
|
|
|
if err == nil && version >= 3 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
case "Apple_Terminal":
|
|
|
|
return true
|
|
|
|
|
|
|
|
default:
|
|
|
|
// No default
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-26 10:44:26 +02:00
|
|
|
var term256Regex = regexp.MustCompile(`(?i)-256(color)?$`)
|
2022-10-27 16:48:26 +02:00
|
|
|
if term256Regex.MatchString(termenv) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2023-07-26 10:44:26 +02:00
|
|
|
var termBasicRegex = regexp.MustCompile(`(?i)^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux`)
|
2022-10-27 16:48:26 +02:00
|
|
|
|
|
|
|
if termBasicRegex.MatchString(termenv) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, colorTerm := os.LookupEnv("COLORTERM"); colorTerm {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|