diff --git a/tools/cmd/tool/confirm_and_run_shebang.go b/tools/cmd/tool/confirm_and_run_shebang.go index 311e8fb7a..54d6f318d 100644 --- a/tools/cmd/tool/confirm_and_run_shebang.go +++ b/tools/cmd/tool/confirm_and_run_shebang.go @@ -5,35 +5,57 @@ package tool import ( "fmt" "os" + "os/exec" "golang.org/x/sys/unix" "kitty/kittens/ask" + "kitty/tools/cli" "kitty/tools/cli/markup" "kitty/tools/utils" ) var _ = fmt.Print -func ask_for_permission(script_path string) (allowed bool, err error) { - opts := &ask.Options{Type: "yesno", Default: "n"} +func ask_for_permission(script_path string) (response string, err error) { + opts := &ask.Options{Type: "choices", Default: "n", Choices: []string{"y;green:Yes", "n;red:No", "v;yellow:View", "e;magenta:Edit"}} ctx := markup.New(true) opts.Message = ctx.Prettify(fmt.Sprintf( "Attempting to execute the script: :yellow:`%s`\nExecuting untrusted scripts can be dangerous. Proceed anyway?", script_path)) - response, err := ask.GetChoices(opts) - return response == "y", err + response, err = ask.GetChoices(opts) + return response, err } func confirm_and_run_shebang(args []string) (rc int, err error) { script_path := args[len(args)-1] if unix.Access(script_path, unix.X_OK) != nil { - allowed, err := ask_for_permission(script_path) + response, err := ask_for_permission(script_path) if err != nil { return 1, err } - if !allowed { + switch response { + default: return 1, fmt.Errorf("Execution of %s was denied by user", script_path) + case "v": + raw, err := os.ReadFile(script_path) + if err != nil { + return 1, err + } + cli.ShowHelpInPager(utils.UnsafeBytesToString(raw)) + return confirm_and_run_shebang(args) + case "e": + exe, err := os.Executable() + if err != nil { + return 1, err + } + editor := exec.Command(exe, "edit-in-kitty", script_path) + editor.Stdin = os.Stdin + editor.Stdout = os.Stdout + editor.Stderr = os.Stderr + editor.Run() + return confirm_and_run_shebang(args) + case "y": } } exe := utils.FindExe(args[0])