You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.7 KiB
Go
170 lines
3.7 KiB
Go
1 year ago
|
package nenv
|
||
|
|
||
|
import (
|
||
|
"git.noahlan.cn/noahlan/ntool/nsys"
|
||
|
"golang.org/x/term"
|
||
|
"io"
|
||
|
"os"
|
||
|
"runtime"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// IsWin system. linux windows darwin
|
||
|
func IsWin() bool {
|
||
|
return runtime.GOOS == "windows"
|
||
|
}
|
||
|
|
||
|
// IsWindows system. alias of IsWin
|
||
|
func IsWindows() bool {
|
||
|
return runtime.GOOS == "windows"
|
||
|
}
|
||
|
|
||
|
// IsMac system
|
||
|
func IsMac() bool {
|
||
|
return runtime.GOOS == "darwin"
|
||
|
}
|
||
|
|
||
|
// IsLinux system
|
||
|
func IsLinux() bool {
|
||
|
return runtime.GOOS == "linux"
|
||
|
}
|
||
|
|
||
|
// IsMSys msys(MINGW64) env. alias of the nsys.IsMSys()
|
||
|
func IsMSys() bool {
|
||
|
return nsys.IsMSys()
|
||
|
}
|
||
|
|
||
|
var detectedWSL bool
|
||
|
var detectedWSLContents string
|
||
|
|
||
|
// IsWSL system env
|
||
|
// https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364
|
||
|
func IsWSL() bool {
|
||
|
if !detectedWSL {
|
||
|
b := make([]byte, 1024)
|
||
|
// `cat /proc/version`
|
||
|
// on mac:
|
||
|
// !not the file!
|
||
|
// on linux(debian,ubuntu,alpine):
|
||
|
// Linux version 4.19.121-linuxkit (root@18b3f92ade35) (gcc version 9.2.0 (Alpine 9.2.0)) #1 SMP Thu Jan 21 15:36:34 UTC 2021
|
||
|
// on win git bash, conEmu:
|
||
|
// MINGW64_NT-10.0-19042 version 3.1.7-340.x86_64 (@WIN-N0G619FD3UK) (gcc version 9.3.0 (GCC) ) 2020-10-23 13:08 UTC
|
||
|
// on WSL:
|
||
|
// Linux version 4.4.0-19041-Microsoft (Microsoft@Microsoft.com) (gcc version 5.4.0 (GCC) ) #488-Microsoft Mon Sep 01 13:43:00 PST 2020
|
||
|
f, err := os.Open("/proc/version")
|
||
|
if err == nil {
|
||
|
_, _ = f.Read(b) // ignore error
|
||
|
f.Close()
|
||
|
detectedWSLContents = string(b)
|
||
|
}
|
||
|
detectedWSL = true
|
||
|
}
|
||
|
return strings.Contains(detectedWSLContents, "Microsoft")
|
||
|
}
|
||
|
|
||
|
// IsTerminal isatty check
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// envutil.IsTerminal(os.Stdout.Fd())
|
||
|
func IsTerminal(fd uintptr) bool {
|
||
|
// return isatty.IsTerminal(fd) // "github.com/mattn/go-isatty"
|
||
|
return term.IsTerminal(int(fd))
|
||
|
}
|
||
|
|
||
|
// StdIsTerminal os.Stdout is terminal
|
||
|
func StdIsTerminal() bool {
|
||
|
return IsTerminal(os.Stdout.Fd())
|
||
|
}
|
||
|
|
||
|
// IsConsole check out is console env. alias of the nsys.IsConsole()
|
||
|
func IsConsole(out io.Writer) bool {
|
||
|
return nsys.IsConsole(out)
|
||
|
}
|
||
|
|
||
|
// HasShellEnv has shell env check.
|
||
|
//
|
||
|
// Usage:
|
||
|
//
|
||
|
// HasShellEnv("sh")
|
||
|
// HasShellEnv("bash")
|
||
|
func HasShellEnv(shell string) bool {
|
||
|
return nsys.HasShellEnv(shell)
|
||
|
}
|
||
|
|
||
|
// Support color:
|
||
|
//
|
||
|
// "TERM=xterm"
|
||
|
// "TERM=xterm-vt220"
|
||
|
// "TERM=xterm-256color"
|
||
|
// "TERM=screen-256color"
|
||
|
// "TERM=tmux-256color"
|
||
|
// "TERM=rxvt-unicode-256color"
|
||
|
//
|
||
|
// Don't support color:
|
||
|
//
|
||
|
// "TERM=cygwin"
|
||
|
var specialColorTerms = map[string]bool{
|
||
|
"alacritty": true,
|
||
|
}
|
||
|
|
||
|
// IsSupportColor check current console is support color.
|
||
|
//
|
||
|
// Supported:
|
||
|
//
|
||
|
// linux, mac, or windows's ConEmu, Cmder, putty, git-bash.exe
|
||
|
//
|
||
|
// Not support:
|
||
|
//
|
||
|
// windows cmd.exe, powerShell.exe
|
||
|
func IsSupportColor() bool {
|
||
|
envTerm := os.Getenv("TERM")
|
||
|
if strings.Contains(envTerm, "xterm") {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// it's special color term
|
||
|
if _, ok := specialColorTerms[envTerm]; ok {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// like on ConEmu software, e.g "ConEmuANSI=ON"
|
||
|
if os.Getenv("ConEmuANSI") == "ON" {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// like on ConEmu software, e.g "ANSICON=189x2000 (189x43)"
|
||
|
if os.Getenv("ANSICON") != "" {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// up: if support 256-color, can also support basic color.
|
||
|
return IsSupport256Color()
|
||
|
}
|
||
|
|
||
|
// IsSupport256Color render
|
||
|
func IsSupport256Color() bool {
|
||
|
// "TERM=xterm-256color"
|
||
|
// "TERM=screen-256color"
|
||
|
// "TERM=tmux-256color"
|
||
|
// "TERM=rxvt-unicode-256color"
|
||
|
supported := strings.Contains(os.Getenv("TERM"), "256color")
|
||
|
if !supported {
|
||
|
// up: if support true-color, can also support 256-color.
|
||
|
supported = IsSupportTrueColor()
|
||
|
}
|
||
|
|
||
|
return supported
|
||
|
}
|
||
|
|
||
|
// IsSupportTrueColor render. IsSupportRGBColor
|
||
|
func IsSupportTrueColor() bool {
|
||
|
// "COLORTERM=truecolor"
|
||
|
return strings.Contains(os.Getenv("COLORTERM"), "truecolor")
|
||
|
}
|
||
|
|
||
|
// IsGithubActions env
|
||
|
func IsGithubActions() bool {
|
||
|
return os.Getenv("GITHUB_ACTIONS") == "true"
|
||
|
}
|