Cache cygpath result

No need to repeatedly run cygpath process because $SHELL never changes.
This commit is contained in:
Junegunn Choi 2021-10-25 18:46:59 +09:00
parent 84a47f7102
commit edac9820b5
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627

View File

@ -7,19 +7,28 @@ import (
"os"
"os/exec"
"strings"
"sync/atomic"
"syscall"
)
var shellPath atomic.Value
// ExecCommand executes the given command with $SHELL
func ExecCommand(command string, setpgid bool) *exec.Cmd {
shell := os.Getenv("SHELL")
if len(shell) == 0 {
shell = "cmd"
} else if strings.Contains(shell, "/") {
out, err := exec.Command("cygpath", "-w", shell).Output()
if err == nil {
shell = strings.Trim(string(out), "\n")
var shell string
if cached := shellPath.Load(); cached != nil {
shell = cached.(string)
} else {
shell = os.Getenv("SHELL")
if len(shell) == 0 {
shell = "cmd"
} else if strings.Contains(shell, "/") {
out, err := exec.Command("cygpath", "-w", shell).Output()
if err == nil {
shell = strings.Trim(string(out), "\n")
}
}
shellPath.Store(shell)
}
return ExecCommandWith(shell, command, setpgid)
}