From fe25122da02181f49c3cb2d640f93a3981e56060 Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Mon, 7 Sep 2026 08:07:51 -0700 Subject: [PATCH] perf(init): cache the LocalHostName lookup instead of inferring it Deriving SHORT_HOST from a .local suffix assumed $HOST came from LocalHostName, but macOS lets HostName be set independently, so a HostName ending in .local would change SHORT_HOST and with it the zcompdump name and the ssh-agent and keychain cache identities. Ask scutil as before, but remember its answer against the $HOST it was looked up for, so the fork only happens when $HOST changes. An unreadable, empty or unwritable cache falls back to forking every time, which is today's behaviour. Co-Authored-By: Claude Opus 5 (1M context) --- oh-my-zsh.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index f6bc1891e..a0d98c34d 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -100,13 +100,17 @@ done # Figure out the SHORT hostname if [[ "$OSTYPE" = darwin* ]]; then # macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible. - # When $HOST is the Bonjour name (.local) it already is the - # LocalHostName, so don't fork scutil to look it up. - if [[ "$HOST" = *.local ]]; then - SHORT_HOST="${HOST%.local}" - else - SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}" + # scutil costs a fork on every start, so remember its answer against the + # $HOST it was looked up for and only ask again when $HOST changes. + __omz_host_cache="$ZSH_CACHE_DIR/localhostname" + if [[ -r "$__omz_host_cache" ]]; then + { read -r __omz_host_key && read -r SHORT_HOST } < "$__omz_host_cache" fi + if [[ "$__omz_host_key" != "$HOST" || -z "$SHORT_HOST" ]]; then + SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}" + [[ ! -w "$ZSH_CACHE_DIR" ]] || print -rl -- "$HOST" "$SHORT_HOST" >| "$__omz_host_cache" + fi + unset __omz_host_cache __omz_host_key else SHORT_HOST="${HOST/.*/}" fi