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) <noreply@anthropic.com>
This commit is contained in:
Robby Russell
2026-09-07 08:25:24 -07:00
co-authored by Claude Opus 5
parent fe25122da0
commit 65d305ad06
+12 -6
View File
@@ -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