From 928c1df67eb21555f3e68582142e8831d260b626 Mon Sep 17 00:00:00 2001 From: Shantanu Date: Mon, 9 Sep 2024 17:43:03 -0700 Subject: [PATCH] shell/fish: impl SpawnRunner --- shell/fish.go | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/shell/fish.go b/shell/fish.go index e88eb98..d97a46e 100644 --- a/shell/fish.go +++ b/shell/fish.go @@ -74,6 +74,7 @@ var fishTemplate, fishHistoryTemplate, fishRunTemplate *template.Template func init() { fishTemplate = template.Must(template.New("fish").Parse(fishBaseScript + fishRecordSetup)) + fishRunTemplate = template.Must(template.New("fishRun").Parse(fishBaseScript + fishRunRunbookScript)) } // Spawn starts a fish shell. @@ -114,8 +115,51 @@ func (f *fish) SpawnHistoryExpander(ctx context.Context) (*exec.Cmd, error) { return nil, nil } +const fishRunRunbookScript = ` +if not functions -q __savvy_run_pre_exec__ + set_color red + echo " Your shell is not configured to use Savvy. Please run the following commands: " + set_color normal + echo + set_color red + echo "> echo 'savvy init fish | source' >> ~/.config/fish/config.fish" + echo "> source ~/.config/fish/config.fish" + set_color normal + exit 1 +end + +echo +echo "Type 'exit' or press 'ctrl+d' to stop running." +echo +` + func (f *fish) SpawnRunbookRunner(ctx context.Context, runbook *client.Runbook) (*exec.Cmd, error) { - return nil, nil + tmpDir := os.TempDir() + fishVendorConfDir := filepath.Join(tmpDir, "fish", "vendor_conf.d") + if err := os.MkdirAll(fishVendorConfDir, 0755); err != nil { + return nil, err + } + fishrc, err := os.CreateTemp(fishVendorConfDir, "savvy-fishrc-*.fish") + if err != nil { + return nil, err + } + defer fishrc.Close() + + if err := fishRunTemplate.Execute(fishrc, f); err != nil { + return nil, err + } + + dataDirs := os.Getenv("XDG_DATA_DIRS") + if dataDirs == "" { + dataDirs = fishVendorConfDir + } else { + dataDirs = strings.Join([]string{dataDirs, fishVendorConfDir}, ":") + } + cmd := exec.CommandContext(ctx, f.shellCmd) + cmd.Env = append(os.Environ(), "SAVVY_CONTEXT=run", fmt.Sprintf("XDG_DATA_DIRS=%s", dataDirs)) + cmd.Env = append(cmd.Env, runbookRunMetadata(runbook, f)...) + cmd.WaitDelay = 500 * time.Millisecond + return cmd, nil } func (f *fish) DefaultStartingArrayIndex() int {