From fab9cf799f8a373684c09ad55d9ebfde1340e6f3 Mon Sep 17 00:00:00 2001 From: Benny Zlotnik Date: Tue, 24 Jun 2025 23:02:23 +0300 Subject: [PATCH 1/2] add fish prompt support Signed-off-by: Benny Zlotnik --- .../jumpstarter/jumpstarter/common/utils.py | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/jumpstarter/jumpstarter/common/utils.py b/packages/jumpstarter/jumpstarter/common/utils.py index 236aa04ef..4a5614836 100644 --- a/packages/jumpstarter/jumpstarter/common/utils.py +++ b/packages/jumpstarter/jumpstarter/common/utils.py @@ -49,7 +49,7 @@ def serve(root_device: Driver): def launch_shell( host: str, context: str, - allow: [str], + allow: list[str], unsafe: bool, *, command: tuple[str, ...] | None = None, @@ -63,20 +63,44 @@ def launch_shell( unsafe: Whether to allow drivers outside of the allow list """ - env = os.environ | { + shell = os.environ.get("SHELL", "bash") + shell_name = os.path.basename(shell) + + common_env = os.environ | { JUMPSTARTER_HOST: host, JMP_DRIVERS_ALLOW: "UNSAFE" if unsafe else ",".join(allow), - "PS1": f"{ANSI_GRAY}{PROMPT_CWD} {ANSI_YELLOW}⚡{ANSI_WHITE}{context} {ANSI_YELLOW}➤{ANSI_RESET} ", } if command: - process = Popen(command, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env) - else: - cmd = [os.environ.get("SHELL", "bash")] - if cmd[0].endswith("bash"): - cmd.append("--norc") - cmd.append("--noprofile") - + process = Popen(command, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=common_env) + return process.wait() + + if shell_name.endswith("bash"): + env = common_env | { + "PS1": f"{ANSI_GRAY}{PROMPT_CWD} {ANSI_YELLOW}⚡{ANSI_WHITE}{context} {ANSI_YELLOW}➤{ANSI_RESET} ", + } + cmd = [shell, "--norc", "--noprofile"] process = Popen(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env) + return process.wait() + + elif shell_name == "fish": + fish_fn = ( + "function fish_prompt; " + "set_color grey; " + 'printf "%s" (basename $PWD); ' + "set_color yellow; " + 'printf "⚡"; ' + "set_color white; " + f'printf "{context}"; ' + "set_color yellow; " + 'printf "➤ "; ' + "set_color normal; " + "end" + ) + cmd = [shell, "--init-command", fish_fn] + process = Popen(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=common_env) + return process.wait() - return process.wait() + else: + process = Popen([shell], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=common_env) + return process.wait() From 7d6bcbe76672cb3b9c3675c42fd1347ab8a824f1 Mon Sep 17 00:00:00 2001 From: Benny Zlotnik Date: Wed, 25 Jun 2025 16:30:21 +0300 Subject: [PATCH 2/2] add separate PS1 for zsh Signed-off-by: Benny Zlotnik --- packages/jumpstarter/jumpstarter/common/utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/jumpstarter/jumpstarter/common/utils.py b/packages/jumpstarter/jumpstarter/common/utils.py index 4a5614836..f732c942a 100644 --- a/packages/jumpstarter/jumpstarter/common/utils.py +++ b/packages/jumpstarter/jumpstarter/common/utils.py @@ -101,6 +101,14 @@ def launch_shell( process = Popen(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=common_env) return process.wait() + elif shell_name == "zsh": + env = common_env | { + "PS1": f"%F{{8}}%1~ %F{{yellow}}⚡%F{{white}}{context} %F{{yellow}}➤%f ", + } + cmd = [shell, "--no-rcs"] + process = Popen(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env) + return process.wait() + else: process = Popen([shell], stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=common_env) return process.wait()