Compare commits

..
Author SHA1 Message Date
Robby RussellandClaude Opus 5 65d305ad06 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>
2026-09-07 08:25:24 -07:00
Robby RussellandClaude Opus 5 fe25122da0 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) <noreply@anthropic.com>
2026-09-07 08:07:51 -07:00
Robby RussellandClaude Fable 5.1 b37d4878ed perf(init): don't fork scutil when $HOST is already the Bonjour name
On macOS `scutil --get LocalHostName` was run on every startup to get a
stable short hostname for the zcompdump filename. When $HOST is the
Bonjour name (`<LocalHostName>.local`), which is the common case, the
LocalHostName is just $HOST without the suffix, so use that directly and
keep the scutil lookup for hosts that got a different name from DHCP.

Measured on macOS arm64, zsh 5.9: 6 ms -> 0.2 ms per interactive start.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:03:54 -07:00
2 changed files with 18 additions and 21 deletions
+17 -1
View File
@@ -100,7 +100,23 @@ done
# Figure out the SHORT hostname # Figure out the SHORT hostname
if [[ "$OSTYPE" = darwin* ]]; then if [[ "$OSTYPE" = darwin* ]]; then
# macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible. # macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible.
SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}" # 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"
__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
# 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_cached __omz_host_key
else else
SHORT_HOST="${HOST/.*/}" SHORT_HOST="${HOST/.*/}"
fi fi
-19
View File
@@ -1,25 +1,6 @@
# Git version checking # Git version checking
autoload -Uz is-at-least autoload -Uz is-at-least
# Running `git version` forks on every startup, so cache the result for a day
# in $ZSH_CACHE_DIR, keyed on the git command path, mtime, and exec path.
() {
local cache="$ZSH_CACHE_DIR/git-version" key exec_path
local -a stat lines
zmodload -F zsh/stat b:zstat
zstat -A stat +mtime -- "$commands[git]" 2>/dev/null
exec_path="$(git --exec-path 2>/dev/null)"
key="$commands[git] $stat[1] $exec_path"
lines=("$cache"(Nm-1))
(( $#lines )) && lines=("${(@f)$(<"$cache")}")
if [[ "$lines[1]" = "$key" ]]; then
git_version="$lines[2]"
return
fi
git_version="${${(As: :)$(git version 2>/dev/null)}[3]}" git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
[[ ! -w "$ZSH_CACHE_DIR" ]] || print -rl -- "$key" "$git_version" >| "$cache"
}
# #
# Functions Current # Functions Current