[zprezto-update] Add convenience function to update zprezto (#1344)

* [zprezto-update] Add convenience function to update zprezto

This function checks if there is any update to zprezto, and if so
will pull in the changes. It will not attempt a pull unless
it is fastforwardable. It also makes sure the user is on the master
branch before attempting.

* [zprezto-update] Improve resilience of the function

Better error checking of status of the git repository
and better error producing.

Fit columns into mostly 80 width and add a missing printf
argument.

Use ( ) around the function so changing directory does not affect
the outer scope.

* [README] Add instructions on using zprezto-update function
This commit is contained in:
Samantha McVey 2017-06-29 23:26:53 -07:00 committed by Kaleb Elwert
parent eb47b45a0d
commit 87868441eb
2 changed files with 55 additions and 2 deletions

View file

@ -50,9 +50,16 @@ window or tab.
Updating
--------
Pull the latest changes and update submodules.
Run `zprezto-update` to automatically check if there is an update to zprezto.
If there are no file conflicts, zprezto its submodules will be automatically
be updated. If there are conflicts you will instructed to go
into the `$ZPREZTODIR` directory and resolve them yourself.
git pull && git submodule update --init --recursive
To pull the latest changes and update submodules manually:
cd $ZPREZTODIR
git pull
git submodule update --init --recursive
Usage
-----

View file

@ -17,6 +17,52 @@ if ! autoload -Uz is-at-least || ! is-at-least "$min_zsh_version"; then
fi
unset min_zsh_version
# zprezto convenience updater
# The function is surrounded by ( ) instead of { } so it starts in a subshell
# and won't affect the environment of the calling shell
function zprezto-update () (
function cannot-fast-forward {
local STATUS="$1"
[[ "${STATUS}" ]] && printf "%s\n" "${STATUS}"
printf "Unable to fast-forward the changes. You can fix this by "
printf "running\ncd '%s' and then\n'git pull' " "${ZPREZTODIR}"
printf "to manually pull and possibly merge in changes\n"
}
cd -q -- "${ZPREZTODIR}" || return 7
local orig_branch="$(git symbolic-ref HEAD 2>/dev/null | cut -d '/' -f 3)"
if [[ "$orig_branch" == "master" ]]; then
git fetch || return "$?"
local UPSTREAM=$(git rev-parse '@{u}')
local LOCAL=$(git rev-parse @)
local REMOTE=$(git rev-parse "$UPSTREAM")
local BASE=$(git merge-base @ "$UPSTREAM")
if [[ $LOCAL == $REMOTE ]]; then
printf "There are no updates.\n"
return 0
elif [[ $LOCAL == $BASE ]]; then
printf "There is an update availible. Trying to pull.\n\n"
if git pull --ff-only; then
printf "Syncing submodules\n"
git submodule update --recursive
return $?
else
cannot-fast-forward
return 1
fi
elif [[ $REMOTE == $BASE ]]; then
cannot-fast-forward "Commits in master that aren't in upstream."
return 1
else
cannot-fast-forward "Upstream and local have diverged."
return 1
fi
else
printf "zprezto install at '%s' is not on the master branch " "${ZPREZTODIR}"
printf "(you're on '%s')\nUnable to automatically update.\n" "${orig_branch}"
return 1
fi
return 1
)
#
# Module Loader
#