6d577d7f6a
We need to fetch all branches first to handle the scenario when the HEAD remote branch was renamed. Recently repositories started changing their HEAD branch names from master to main. Fixes #424
67 lines
2.6 KiB
Plaintext
67 lines
2.6 KiB
Plaintext
# This runs in a new shell
|
|
readonly MODULE=${1}
|
|
readonly DIR=${2}
|
|
readonly URL=${3}
|
|
readonly TYPE=${4:=branch}
|
|
REV=${5}
|
|
readonly -i PRINTLEVEL=${6}
|
|
readonly CLEAR_LINE=$'\E[2K\r'
|
|
if (( PRINTLEVEL > 0 )) print -Rn ${CLEAR_LINE}"Updating ${MODULE}<%= ellipsis %>"
|
|
if ! builtin cd -q ${DIR} 2>/dev/null; then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Not installed. Run %Bzimfw install%b to install.%f"
|
|
return 1
|
|
fi
|
|
if [[ ${PWD} != $(command git rev-parse --show-toplevel 2>/dev/null) ]]; then
|
|
# Not in repo root. Will not try to update.
|
|
return 0
|
|
fi
|
|
if [[ ${URL} != $(command git config --get remote.origin.url) ]]; then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b URL does not match. Expected ${URL}. Will not try to update.%f"
|
|
return 1
|
|
fi
|
|
if ! ERR=$(command git fetch -pq origin 2>&1); then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Error during git fetch%f"$'\n'${(F):- ${(f)^ERR}}
|
|
return 1
|
|
fi
|
|
if [[ ${TYPE} == tag ]]; then
|
|
if [[ ${REV} == $(command git describe --tags --exact-match 2>/dev/null) ]]; then
|
|
if (( PRINTLEVEL > 0 )) print -PR ${CLEAR_LINE}"<%= okay %>%B${MODULE}:%b Already up to date"
|
|
return 0
|
|
fi
|
|
elif [[ -z ${REV} ]]; then
|
|
# Get HEAD remote branch
|
|
if ! ERR=$(command git remote set-head origin -a 2>&1); then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Error during git remote set-head%f"$'\n'${(F):- ${(f)^ERR}}
|
|
return 1
|
|
fi
|
|
REV=${$(command git symbolic-ref --short refs/remotes/origin/HEAD)#origin/} || return 1
|
|
fi
|
|
if [[ ${TYPE} == branch ]]; then
|
|
LOG_REV=${REV}@{u}
|
|
else
|
|
LOG_REV=${REV}
|
|
fi
|
|
LOG=$(command git log --graph --color --format='%C(yellow)%h%C(reset) %s %C(cyan)(%cr)%C(reset)' ..${LOG_REV} -- 2>/dev/null)
|
|
if ! ERR=$(command git checkout -q ${REV} -- 2>&1); then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Error during git checkout%f"$'\n'${(F):- ${(f)^ERR}}
|
|
return 1
|
|
fi
|
|
if [[ ${TYPE} == branch ]]; then
|
|
if ! OUT=$(command git merge --ff-only --no-progress -n 2>&1); then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Error during git merge%f"$'\n'${(F):- ${(f)^OUT}}
|
|
return 1
|
|
fi
|
|
# keep just first line of OUT
|
|
OUT=${OUT%%($'\n'|$'\r')*}
|
|
else
|
|
OUT="Updating to ${TYPE} ${REV}"
|
|
fi
|
|
if ! ERR=$(command git submodule update --init --recursive -q 2>&1); then
|
|
print -u2 -PR ${CLEAR_LINE}"%F{red}<%= error %>%B${MODULE}:%b Error during git submodule update%f"$'\n'${(F):- ${(f)^ERR}}
|
|
return 1
|
|
fi
|
|
if (( PRINTLEVEL > 0 )); then
|
|
if [[ -n ${LOG} ]] OUT=${OUT}$'\n'${(F):- ${(f)^LOG}}
|
|
print -PR ${CLEAR_LINE}"<%= okay %>%B${MODULE}:%b ${OUT}"
|
|
fi
|