From 65d305ad061bda65f85b3545fcd18705326d174a Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Mon, 7 Sep 2026 08:25:24 -0700 Subject: [PATCH] fix(init): bound the LocalHostName cache and don't cache lookup failures Keying the cache on $HOST alone can't notice a LocalHostName rename while HostName stays fixed, which would pin a stale identity forever. Expire the entry after a day, like lib/grep.zsh does, so a rename is picked up without giving up the fork on almost every start. Only write the cache when scutil actually answered, so a transient failure falls back to ${HOST/.*/} for that shell instead of pinning the fallback name for the next day. Co-Authored-By: Claude Opus 5 (1M context) --- oh-my-zsh.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index a0d98c34d..4e45e9282 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -100,17 +100,23 @@ done # Figure out the SHORT hostname if [[ "$OSTYPE" = darwin* ]]; then # macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible. - # 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. + # scutil costs a fork on every start, so remember its answer for a day + # (like lib/grep.zsh) and re-check sooner if $HOST changes. __omz_host_cache="$ZSH_CACHE_DIR/localhostname" - if [[ -r "$__omz_host_cache" ]]; then + __omz_host_cached=("$__omz_host_cache"(Nm-1)) + if [[ -n "$__omz_host_cached" ]]; 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" + # only cache what scutil actually answered, so a transient failure + # doesn't pin the fallback name for a day + if SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) && [[ -n "$SHORT_HOST" ]]; then + [[ ! -w "$ZSH_CACHE_DIR" ]] || print -rl -- "$HOST" "$SHORT_HOST" >| "$__omz_host_cache" + else + SHORT_HOST="${HOST/.*/}" + fi fi - unset __omz_host_cache __omz_host_key + unset __omz_host_cache __omz_host_cached __omz_host_key else SHORT_HOST="${HOST/.*/}" fi