Use FindExe to find the tmux executable and return a nicer error message when running tmux fails

This commit is contained in:
Kovid Goyal
2023-04-28 20:11:15 +05:30
parent 09ebdcd809
commit 514888a274

View File

@@ -5,7 +5,6 @@ package tui
import ( import (
"errors" "errors"
"fmt" "fmt"
"kitty/tools/utils"
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
@@ -15,10 +14,16 @@ import (
"github.com/shirou/gopsutil/v3/process" "github.com/shirou/gopsutil/v3/process"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"kitty/tools/utils"
) )
var _ = fmt.Print var _ = fmt.Print
var TmuxExe = (&utils.Once[string]{Run: func() string {
return utils.FindExe("tmux")
}}).Get
func tmux_socket_address() (socket string) { func tmux_socket_address() (socket string) {
socket = os.Getenv("TMUX") socket = os.Getenv("TMUX")
if socket == "" { if socket == "" {
@@ -53,13 +58,14 @@ func tmux_socket_address() (socket string) {
var TmuxSocketAddress = (&utils.Once[string]{Run: tmux_socket_address}).Get var TmuxSocketAddress = (&utils.Once[string]{Run: tmux_socket_address}).Get
func tmux_allow_passthrough() error { func tmux_allow_passthrough() error {
c := exec.Command("tmux", "show", "-Ap", "allow-passthrough") cmd := []string{TmuxExe(), "show", "-Ap", "allow-passthrough"}
c := exec.Command(cmd[0], cmd[1:]...)
allowed, not_allowed := errors.New("allowed"), errors.New("not allowed") allowed, not_allowed := errors.New("allowed"), errors.New("not allowed")
get_result := make(chan error) get_result := make(chan error)
go func() { go func() {
output, err := c.Output() output, err := c.Output()
if err != nil { if err != nil {
get_result <- err get_result <- fmt.Errorf("Running %s failed with error: %w", strings.Join(cmd, " "), err)
} else { } else {
q := strings.TrimSpace(utils.UnsafeBytesToString(output)) q := strings.TrimSpace(utils.UnsafeBytesToString(output))
if strings.HasSuffix(q, " on") || strings.HasSuffix(q, " all") { if strings.HasSuffix(q, " on") || strings.HasSuffix(q, " all") {
@@ -77,7 +83,12 @@ func tmux_allow_passthrough() error {
if r != not_allowed { if r != not_allowed {
return r return r
} }
return exec.Command("tmux", "set", "-p", "allow-passthrough", "on").Run() cmd := []string{TmuxExe(), "set", "-p", "allow-passthrough", "on"}
err := exec.Command(cmd[0], cmd[1:]...).Run()
if err != nil {
err = fmt.Errorf("Running %s failed with error: %w", strings.Join(cmd, " "), err)
}
return err
case <-time.After(2 * time.Second): case <-time.After(2 * time.Second):
return fmt.Errorf("Tmux command timed out. This often happens when the version of tmux on your PATH is older than the version of the running tmux server") return fmt.Errorf("Tmux command timed out. This often happens when the version of tmux on your PATH is older than the version of the running tmux server")
} }