From 87868441ebd1411ab3f257861c35b115830d71b3 Mon Sep 17 00:00:00 2001 From: Samantha McVey Date: Thu, 29 Jun 2017 23:26:53 -0700 Subject: [PATCH] [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 --- README.md | 11 +++++++++-- init.zsh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fee70a49..f90888c6 100644 --- a/README.md +++ b/README.md @@ -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 ----- diff --git a/init.zsh b/init.zsh index 74d9edde..b2a79c83 100644 --- a/init.zsh +++ b/init.zsh @@ -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 #