From 5b3b61e0e0a1fc6fa40df0f4bb55eb6ea4c2d06b Mon Sep 17 00:00:00 2001 From: Fabian Ising Date: Mon, 27 Jul 2026 10:37:12 +0200 Subject: [PATCH] [ZSH] Hook improvements --- zsh/.zshrc | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/zsh/.zshrc b/zsh/.zshrc index 7895f47..41dcff3 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -12,6 +12,9 @@ # Per-branch, so `server` on each device fast-forwards to origin/server. update_dotfiles() { local repo="$HOME/dotfiles" + local cache_dir="${ZDOTDIR:-$HOME}/.cache/zsh" + local notice_file="$cache_dir/dotfiles-update-notice" + local notice_tmp="$notice_file.$$.tmp" # Bound the network call so a stalled fetch can't wedge this backgrounded # (&!) job into a days-long orphan holding unreaped children. `timeout` is # absent on macOS, so only use it when present. Disable ssh multiplexing so @@ -21,8 +24,11 @@ update_dotfiles() { $TO git -C "$repo" fetch --quiet /dev/null || return git -C "$repo" rev-parse --abbrev-ref '@{u}' >/dev/null 2>&1 || return # no upstream git -C "$repo" merge-base --is-ancestor '@{u}' HEAD 2>/dev/null && return # already current - git -C "$repo" merge --ff-only --quiet '@{u}' 2>/dev/null \ - || print -u2 "⚠ dotfiles: $(git -C "$repo" symbolic-ref --short HEAD) can't fast-forward to @{u} — run: git -C ~/dotfiles pull" + git -C "$repo" merge --ff-only --quiet '@{u}' 2>/dev/null && return + local notice="⚠ dotfiles: $(git -C "$repo" symbolic-ref --short HEAD) can't fast-forward to @{u} — run: git -C ~/dotfiles pull" + mkdir -p "$cache_dir" || return + print -r -- "$notice" >| "$notice_tmp" || return + mv -f "$notice_tmp" "$notice_file" } update_dotfiles &! @@ -67,17 +73,19 @@ check_tools_repo() { } check_tools_repo &! -show_tools_repo_notice() { +show_update_notices() { local cache_dir="${ZDOTDIR:-$HOME}/.cache/zsh" - local notice_file="$cache_dir/tools-update-notice" - local claimed_notice="$notice_file.$$.show" - [[ -s "$notice_file" ]] || return - mv "$notice_file" "$claimed_notice" 2>/dev/null || return - command cat "$claimed_notice" - command rm -f "$claimed_notice" + local notice_file claimed_notice + for notice_file in "$cache_dir"/{dotfiles,tools}-update-notice; do + [[ -s "$notice_file" ]] || continue + claimed_notice="$notice_file.$$.show" + mv "$notice_file" "$claimed_notice" 2>/dev/null || continue + command cat "$claimed_notice" + command rm -f "$claimed_notice" + done } autoload -Uz add-zsh-hook -add-zsh-hook precmd show_tools_repo_notice +add-zsh-hook precmd show_update_notices export LC_OSC52=1 @@ -198,7 +206,19 @@ zstyle :bracketed-paste-magic paste-finish pastefinish # https://github.com/zsh-users/zsh-autosuggestions/issues/351 ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(bracketed-paste) export PATH=$PATH:/Users/ising/.runai/bin -source <(/Users/ising/.runai/bin/runai --quiet completion zsh) +runai_bin=/Users/ising/.runai/bin/runai +runai_completion=${ZDOTDIR:-$HOME}/.cache/zsh/runai-completion.zsh +if [[ -x "$runai_bin" ]]; then + if [[ ! -s "$runai_completion" || "$runai_bin" -nt "$runai_completion" ]]; then + runai_completion_tmp="$runai_completion.$$.tmp" + if "$runai_bin" --quiet completion zsh >| "$runai_completion_tmp"; then + command mv -f "$runai_completion_tmp" "$runai_completion" + else + command rm -f "$runai_completion_tmp" + fi + fi + [[ -s "$runai_completion" ]] && source "$runai_completion" +fi # Re-activate an inherited virtualenv — MUST be the last PATH-affecting line. #