fix(updater): address cooldown review feedback

Pass cooldown into upgrade.sh as -c, extract the update helpers, and only
prompt when a cooldown-eligible commit would actually move HEAD.
This commit is contained in:
Robby Russell
2026-09-08 16:11:32 -07:00
parent 84429a7229
commit e872c661ad
4 changed files with 78 additions and 23 deletions
+7
View File
@@ -475,6 +475,13 @@ just a little later:
zstyle ':omz:update' cooldown 10
```
`omz update` honors this setting. If you call `upgrade.sh` directly, pass the same
value with `-c`, because that script does not read your `.zshrc`:
```sh
$ZSH/tools/upgrade.sh -c 10
```
### Updates Verbosity
You can also limit the update verbosity with the following settings:
+4 -1
View File
@@ -903,8 +903,11 @@ function _omz::update {
}
# Run update script
local verbose_mode cooldown_days
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
[[ $cooldown_days == <-> ]] || cooldown_days=0
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode -c $cooldown_days || return $?
# Update last updated file
zmodload zsh/datetime
+25 -3
View File
@@ -47,6 +47,26 @@ function is_update_available() {
remote=${"$(builtin cd -q "$ZSH"; git config --local oh-my-zsh.remote)":-origin}
remote_url=$(builtin cd -q "$ZSH"; git config remote.$remote.url)
local cooldown_days
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
[[ $cooldown_days == <-> ]] || cooldown_days=0
if (( cooldown_days > 0 )); then
local local_head cutoff_epoch cooldown_ref
local_head=$(builtin cd -q "$ZSH"; git rev-parse $branch 2>/dev/null) || return 0
(builtin cd -q "$ZSH"; LANG= git fetch --quiet $remote $branch) || return 1
zmodload zsh/datetime
cutoff_epoch=$(( EPOCHSECONDS - cooldown_days * 86400 ))
cooldown_ref=$(builtin cd -q "$ZSH"; git log --format="%H %ct" FETCH_HEAD \
| awk -v c="$cutoff_epoch" '$2 <= c { print $1; exit }')
[[ -n "$cooldown_ref" ]] || return 1
[[ "$cooldown_ref" != "$local_head" ]] || return 1
if (builtin cd -q "$ZSH"; git merge-base --is-ancestor "$cooldown_ref" "$local_head" 2>/dev/null); then
return 1
fi
return 0
fi
local repo
case "$remote_url" in
https://github.com/*) repo=${${remote_url#https://github.com/}%.git} ;;
@@ -109,8 +129,10 @@ EOD
}
function update_ohmyzsh() {
local verbose_mode
local verbose_mode cooldown_days
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
[[ $cooldown_days == <-> ]] || cooldown_days=0
# Force verbose mode to silent if p10k instant prompt is enabled
if [[ ${POWERLEVEL9K_INSTANT_PROMPT:-off} != "off" ]]; then
@@ -118,13 +140,13 @@ function update_ohmyzsh() {
fi
if [[ "$update_mode" != background-alpha ]] \
&& LANG= ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode; then
&& LANG= ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode -c $cooldown_days; then
update_last_updated_file
return $?
fi
local exit_status error
if error=$(LANG= ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" -i -v silent 2>&1); then
if error=$(LANG= ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" -i -v silent -c $cooldown_days 2>&1); then
update_last_updated_file 0 "Update successful"
else
exit_status=$?
+42 -19
View File
@@ -13,6 +13,8 @@ case "$ZSH_EVAL_CONTEXT" in
*:file) echo "error: this file should not be sourced" && return 1 ;;
esac
zmodload zsh/datetime
# Define "$ZSH" if not defined -- in theory this should be `export`ed by the calling script
if [[ -z "$ZSH" ]]; then
ZSH="${0:a:h:h}"
@@ -22,8 +24,9 @@ cd "$ZSH"
verbose_mode="default"
interactive=false
cooldown_days=0
while getopts "v:i" opt; do
while getopts "v:ic:" opt; do
case $opt in
v)
if [[ $OPTARG == default || $OPTARG == minimal || $OPTARG == silent ]]; then
@@ -34,6 +37,14 @@ while getopts "v:i" opt; do
fi
;;
i) interactive=true ;;
c)
if [[ $OPTARG == <-> ]]; then
cooldown_days=$OPTARG
else
echo "[oh-my-zsh] update cooldown '$OPTARG' is not valid"
echo "[oh-my-zsh] valid options are a non-negative integer (days)"
fi
;;
esac
done
@@ -231,9 +242,27 @@ local ret=0
remote=${"$(git config --local oh-my-zsh.remote)":-origin}
branch=${"$(git config --local oh-my-zsh.branch)":-master}
# cooldown: minimum age (in days) of commits to apply
local cooldown_days
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
update_with_cooldown() {
local cutoff_epoch cooldown_ref
cutoff_epoch=$(( EPOCHSECONDS - cooldown_days * 86400 ))
LANG= git fetch --quiet $remote $branch || return $?
cooldown_ref=$(git log --format="%H %ct" FETCH_HEAD \
| awk -v c="$cutoff_epoch" '$2 <= c { print $1; exit }')
[[ -n "$cooldown_ref" ]] || return 0
LANG= git merge --ff-only --quiet "$cooldown_ref"
}
perform_update() {
if (( cooldown_days > 0 )); then
update_with_cooldown
else
LANG= git pull --quiet --rebase $remote $branch
fi
}
# repository state
last_head=$(git symbolic-ref --quiet --short HEAD || git rev-parse HEAD)
@@ -246,23 +275,17 @@ last_commit=$(git rev-parse "$branch")
if [[ $verbose_mode != silent ]]; then
printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh"
fi
if {
if (( cooldown_days > 0 )); then
zmodload zsh/datetime
local cutoff_epoch cooldown_ref
cutoff_epoch=$(( EPOCHSECONDS - cooldown_days * 86400 ))
LANG= git fetch --quiet $remote $branch && {
cooldown_ref=$(git log --format="%H %ct" "$remote/$branch" \
| awk -v c="$cutoff_epoch" '$2 <= c { print $1; exit }')
[[ -z "$cooldown_ref" ]] || LANG= git merge --ff-only --quiet "$cooldown_ref"
}
else
LANG= git pull --quiet --rebase $remote $branch
fi
}; then
if perform_update; then
# Check if it was really updated or not
if [[ "$(git rev-parse HEAD)" = "$last_commit" ]]; then
message="Oh My Zsh is already at the latest version."
if (( cooldown_days > 0 )); then
head_ct=$(git log -1 --format=%ct HEAD)
age_days=$(( (EPOCHSECONDS - head_ct) / 86400 ))
(( age_days < 0 )) && age_days=0
message="Oh My Zsh is already at a version ${age_days} days old."
else
message="Oh My Zsh is already at the latest version."
fi
else
message="Hooray! Oh My Zsh has been updated!"