Files
dotfiles/.config/zsh/autoload/git/git-checkout-worktree

40 lines
1.1 KiB
Bash
Executable File

#!/usr/bin/env zsh
# Checks out the first argument in a worktree at a temporary directory. Then
# spawns an interactive shell inside of it.
# When the shell closes the worktree is tried to be removed. Until that works
# without problems (e.g. dirty), a new shell is spawned to resolve all conflicts
# (e.g. stashing). Finally the temporary directory is deleted.
#
# Instead of dropping in an interactive shell, the commands to execute can be
# passed via stdin.
# TODO: If any conflicts arise, all further shells should be interactive instead
# of looping forever.
local REPO_NAME WORKTREE_PATH
REPO_NAME="${$(git rev-parse --show-toplevel):t}" || return
WORKTREE_PATH="$(mktemp -d -p "" "worktree.XXX.$REPO_NAME.$1")"
git worktree add "$WORKTREE_PATH" "$1"
[[ -e "$WORKTREE_PATH" ]] || return 1
pushd -q "$WORKTREE_PATH"
# Start subshell
"$SHELL"
errc=$?
# Cleanup when exiting
popd -q
# 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
done
git worktree prune
return $errc