37 lines
943 B
Bash
Executable File
37 lines
943 B
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.
|
|
|
|
local GIT_ROOT TEMP_DIR REPO_DIR
|
|
GIT_ROOT="$(basename "$(git rev-parse --show-toplevel)")" || return
|
|
TEMP_DIR="$(mktemp -d)"
|
|
REPO_DIR="$TEMP_DIR/$GIT_ROOT"
|
|
|
|
git worktree add "$REPO_DIR" "$1"
|
|
[[ -e "$REPO_DIR" ]] || return 1
|
|
pushd -q "$REPO_DIR"
|
|
|
|
# Start subshell
|
|
"$SHELL"
|
|
errc=$?
|
|
|
|
# Cleanup when exiting
|
|
popd -q
|
|
|
|
# Restart the subshell until every issue is resolved and the worktree is
|
|
# removed
|
|
until [[ ! -e "$REPO_DIR" ]] || git worktree remove "$REPO_DIR"; do
|
|
pushd -q "$REPO_DIR"
|
|
"$SHELL"
|
|
errc=$?
|
|
popd -q
|
|
done
|
|
|
|
git worktree prune
|
|
command rm -rf "$TEMP_DIR"
|
|
return $errc
|