Allow using defer in KittenMain

This commit is contained in:
Kovid Goyal
2025-09-30 11:20:37 +05:30
parent ca0ff68d8e
commit ba96fa06fe
3 changed files with 19 additions and 26 deletions

View File

@@ -16,25 +16,25 @@ import (
var _ = fmt.Print var _ = fmt.Print
func fatal(err error) { func fatal(err error) int {
cli.ShowError(err) cli.ShowError(err)
os.Exit(1) return 1
} }
func trigger_ask(name string) { func trigger_ask(name string) int {
term, err := tty.OpenControllingTerm() term, err := tty.OpenControllingTerm()
if err != nil { if err != nil {
fatal(err) return fatal(err)
} }
defer term.Close() defer term.Close()
_, err = term.WriteString("\x1bP@kitty-ask|" + name + "\x1b\\") _, err = term.WriteString("\x1bP@kitty-ask|" + name + "\x1b\\")
if err != nil { if err != nil {
fatal(err) return fatal(err)
} }
return 0
} }
func RunSSHAskpass() { func RunSSHAskpass() int {
msg := os.Args[len(os.Args)-1] msg := os.Args[len(os.Args)-1]
prompt := os.Getenv("SSH_ASKPASS_PROMPT") prompt := os.Getenv("SSH_ASKPASS_PROMPT")
is_confirm := prompt == "confirm" is_confirm := prompt == "confirm"
@@ -50,21 +50,21 @@ func RunSSHAskpass() {
} }
data, err := json.Marshal(q) data, err := json.Marshal(q)
if err != nil { if err != nil {
fatal(err) return fatal(err)
} }
data_shm, err := shm.CreateTemp("askpass-*", uint64(len(data)+32)) data_shm, err := shm.CreateTemp("askpass-*", uint64(len(data)+32))
if err != nil { if err != nil {
fatal(fmt.Errorf("Failed to create SHM file with error: %w", err)) return fatal(fmt.Errorf("Failed to create SHM file with error: %w", err))
} }
defer data_shm.Close() defer data_shm.Close()
defer func() { _ = data_shm.Unlink() }() defer func() { _ = data_shm.Unlink() }()
data_shm.Slice()[0] = 0 data_shm.Slice()[0] = 0
if err = shm.WriteWithSize(data_shm, data, 1); err != nil { if err = shm.WriteWithSize(data_shm, data, 1); err != nil {
fatal(fmt.Errorf("Failed to write to SHM file with error: %w", err)) return fatal(fmt.Errorf("Failed to write to SHM file with error: %w", err))
} }
if err = data_shm.Flush(); err != nil { if err = data_shm.Flush(); err != nil {
fatal(fmt.Errorf("Failed to flush SHM file with error: %w", err)) return fatal(fmt.Errorf("Failed to flush SHM file with error: %w", err))
} }
trigger_ask(data_shm.Name()) trigger_ask(data_shm.Name())
for { for {
@@ -75,14 +75,14 @@ func RunSSHAskpass() {
} }
data, err = shm.ReadWithSize(data_shm, 1) data, err = shm.ReadWithSize(data_shm, 1)
if err != nil { if err != nil {
fatal(fmt.Errorf("Failed to read from SHM file with error: %w", err)) return fatal(fmt.Errorf("Failed to read from SHM file with error: %w", err))
} }
response := "" response := ""
if is_confirm { if is_confirm {
var ok bool var ok bool
err = json.Unmarshal(data, &ok) err = json.Unmarshal(data, &ok)
if err != nil { if err != nil {
fatal(fmt.Errorf("Failed to parse response data: %#v with error: %w", string(data), err)) return fatal(fmt.Errorf("Failed to parse response data: %#v with error: %w", string(data), err))
} }
response = "no" response = "no"
if ok { if ok {
@@ -91,7 +91,7 @@ func RunSSHAskpass() {
} else { } else {
err = json.Unmarshal(data, &response) err = json.Unmarshal(data, &response)
if err != nil { if err != nil {
fatal(fmt.Errorf("Failed to parse response data: %#v with error: %w", string(data), err)) return fatal(fmt.Errorf("Failed to parse response data: %#v with error: %w", string(data), err))
} }
if is_fingerprint_check { if is_fingerprint_check {
response = strings.ToLower(response) response = strings.ToLower(response)
@@ -106,4 +106,5 @@ func RunSSHAskpass() {
if response != "" { if response != "" {
fmt.Println(response) fmt.Println(response)
} }
return 0
} }

View File

@@ -565,13 +565,6 @@ func (self *Command) ExecArgs(args []string) (exit_code int) {
return return
} }
func (self *Command) Exec(args ...string) {
if len(args) == 0 {
args = os.Args
}
os.Exit(self.ExecArgs(args))
}
func (self *Command) GetCompletions(argv []string, init_completions func(*Completions)) *Completions { func (self *Command) GetCompletions(argv []string, init_completions func(*Completions)) *Completions {
ans := NewCompletions() ans := NewCompletions()
if init_completions != nil { if init_completions != nil {

View File

@@ -16,13 +16,12 @@ import (
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
func KittenMain(args ...string) { func KittenMain(args ...string) int {
krm := os.Getenv("KITTY_KITTEN_RUN_MODULE") krm := os.Getenv("KITTY_KITTEN_RUN_MODULE")
os.Unsetenv("KITTY_KITTEN_RUN_MODULE") os.Unsetenv("KITTY_KITTEN_RUN_MODULE")
switch krm { switch krm {
case "ssh_askpass": case "ssh_askpass":
ssh.RunSSHAskpass() return ssh.RunSSHAskpass()
return
} }
root := cli.NewRootCommand() root := cli.NewRootCommand()
root.ShortDescription = "Fast, statically compiled implementations of various kittens (command line tools for use with kitty)" root.ShortDescription = "Fast, statically compiled implementations of various kittens (command line tools for use with kitty)"
@@ -49,9 +48,9 @@ func KittenMain(args ...string) {
completion.EntryPoint(root) completion.EntryPoint(root)
root.SubCommandIsOptional = true root.SubCommandIsOptional = true
root.Exec(args...) return root.ExecArgs(args)
} }
func main() { func main() {
KittenMain() os.Exit(KittenMain())
} }