From a60c955d3dd33cc8a0520c05cfb6b65689e6da4b Mon Sep 17 00:00:00 2001 From: Julian Prein Date: Thu, 31 Mar 2022 16:57:46 +0200 Subject: [PATCH] git:checkout-worktree: Set err_return + no_unset If anything happens abnormally, return early and leave it to the user to fix things. --- .../zsh/autoload/git/git-checkout-worktree | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/.config/zsh/autoload/git/git-checkout-worktree b/.config/zsh/autoload/git/git-checkout-worktree index fc1c1cb..b4bfdd7 100755 --- a/.config/zsh/autoload/git/git-checkout-worktree +++ b/.config/zsh/autoload/git/git-checkout-worktree @@ -11,29 +11,38 @@ # TODO: If any conflicts arise, all further shells should be interactive instead # of looping forever. +emulate -L zsh -o err_return -o no_unset + local REPO_NAME WORKTREE_PATH -REPO_NAME="${$(git rev-parse --show-toplevel):t}" || return +REPO_NAME="${$(git rev-parse --show-toplevel):t}" WORKTREE_PATH="$(mktemp -d -p "" "worktree.XXX.$REPO_NAME.$1")" +trap ' + errc=$? + <&2 printf "Exiting abnormally. Check and possibly remove '$WORKTREE_PATH' manually.\n" + return $errc +' INT QUIT TERM EXIT + git worktree add "$WORKTREE_PATH" "$1" -[[ -e "$WORKTREE_PATH" ]] || return 1 + pushd -q "$WORKTREE_PATH" # Start subshell -"$SHELL" -errc=$? +"$SHELL" && errc=$? || errc=$? # Cleanup when exiting -popd -q +popd -q || true # Restart the subshell until every issue is resolved and the worktree is # removed until [[ ! -e "$WORKTREE_PATH" ]] || git worktree remove "$WORKTREE_PATH"; do pushd -q "$WORKTREE_PATH" - "$SHELL" - errc=$? - popd -q + "$SHELL" && errc=$? || errc=$? + popd -q || true done +# Reset traps +trap '-' INT QUIT TERM EXIT + git worktree prune return $errc