mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2024-12-28 12:29:40 -08:00
8978038a3c
On Windows, when in the registry, os.Getwd() returns the previous path rather than the registry location. Settings PWD as an environment variable might seem hacky but it's the only way to resolve this. Resolves #40
172 lines
3.6 KiB
Go
Executable file
172 lines
3.6 KiB
Go
Executable file
package main
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"os/user"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
|
|
"github.com/distatus/battery"
|
|
ps "github.com/mitchellh/go-ps"
|
|
)
|
|
|
|
type environmentInfo interface {
|
|
getenv(key string) string
|
|
getcwd() string
|
|
homeDir() string
|
|
hasFiles(pattern string) bool
|
|
hasFolder(folder string) bool
|
|
getFileContent(file string) string
|
|
getPathSeperator() string
|
|
getCurrentUser() (*user.User, error)
|
|
isRunningAsRoot() bool
|
|
getHostName() (string, error)
|
|
getRuntimeGOOS() string
|
|
hasCommand(command string) bool
|
|
runCommand(command string, args ...string) string
|
|
runShellCommand(shell string, command string) string
|
|
lastErrorCode() int
|
|
getArgs() *args
|
|
getBatteryInfo() (*battery.Battery, error)
|
|
getShellName() string
|
|
}
|
|
|
|
type environment struct {
|
|
args *args
|
|
}
|
|
|
|
func (env *environment) getenv(key string) string {
|
|
return os.Getenv(key)
|
|
}
|
|
|
|
func (env *environment) getcwd() string {
|
|
correctPath := func(pwd string) string {
|
|
// on Windows, and being case sentisitive and not consistent and all, this gives silly issues
|
|
return strings.Replace(pwd, "c:", "C:", 1)
|
|
}
|
|
if *env.args.PWD != "" {
|
|
return correctPath(*env.args.PWD)
|
|
}
|
|
dir, err := os.Getwd()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return correctPath(dir)
|
|
}
|
|
|
|
func (env *environment) homeDir() string {
|
|
usr, err := user.Current()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
homeDir := usr.HomeDir
|
|
// on Windows, and being case sentisitive and not consistent and all, this gives silly issues
|
|
return strings.Replace(homeDir, "c:", "C:", 1)
|
|
}
|
|
|
|
func (env *environment) hasFiles(pattern string) bool {
|
|
cwd := env.getcwd()
|
|
pattern = cwd + env.getPathSeperator() + pattern
|
|
matches, err := filepath.Glob(pattern)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
return len(matches) > 0
|
|
}
|
|
|
|
func (env *environment) hasFolder(folder string) bool {
|
|
_, err := os.Stat(folder)
|
|
return !os.IsNotExist(err)
|
|
}
|
|
|
|
func (env *environment) getFileContent(file string) string {
|
|
content, err := ioutil.ReadFile(file)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return string(content)
|
|
}
|
|
|
|
func (env *environment) getPathSeperator() string {
|
|
return string(os.PathSeparator)
|
|
}
|
|
|
|
func (env *environment) getCurrentUser() (*user.User, error) {
|
|
return user.Current()
|
|
}
|
|
|
|
func (env *environment) getHostName() (string, error) {
|
|
hostName, err := os.Hostname()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return cleanHostName(hostName), nil
|
|
}
|
|
|
|
func (env *environment) getRuntimeGOOS() string {
|
|
return runtime.GOOS
|
|
}
|
|
|
|
func (env *environment) runCommand(command string, args ...string) string {
|
|
out, err := exec.Command(command, args...).Output()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(out))
|
|
}
|
|
|
|
func (env *environment) runShellCommand(shell string, command string) string {
|
|
out, err := exec.Command(shell, "-c", command).Output()
|
|
if err != nil {
|
|
log.Println(err)
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(out))
|
|
}
|
|
|
|
func (env *environment) hasCommand(command string) bool {
|
|
_, err := exec.LookPath(command)
|
|
return err == nil
|
|
}
|
|
|
|
func (env *environment) lastErrorCode() int {
|
|
return *env.args.ErrorCode
|
|
}
|
|
|
|
func (env *environment) getArgs() *args {
|
|
return env.args
|
|
}
|
|
|
|
func (env *environment) getBatteryInfo() (*battery.Battery, error) {
|
|
return battery.Get(0)
|
|
}
|
|
|
|
func (env *environment) getShellName() string {
|
|
pid := os.Getppid()
|
|
p, err := ps.FindProcess(pid)
|
|
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
shell := strings.Replace(p.Executable(), ".exe", "", 1)
|
|
return strings.Trim(shell, " ")
|
|
}
|
|
|
|
func cleanHostName(hostName string) string {
|
|
garbage := []string{
|
|
".lan",
|
|
".local",
|
|
".localdomain",
|
|
}
|
|
for _, g := range garbage {
|
|
if strings.HasSuffix(hostName, g) {
|
|
hostName = strings.Replace(hostName, g, "", 1)
|
|
}
|
|
}
|
|
return hostName
|
|
}
|