Vectrum
Sign In
54 lines · 1.7 KB · Shell
#!/usr/bin/env bash
#
# Codey writes this file once and then leaves it alone, so it is yours to edit.
# Anything a fresh worktree needs — copying a .env, installing dependencies,
# running a migration — belongs at the bottom, before the path is printed.
#
# The contract with Codey is two lines wide:
#
#   in   the worktree's name, on stdin
#   out  the absolute path of the tree, as the last line of stdout
#
# Everything else the script has to say should go to stderr. Codey reads the
# path back from stdout and moves the session there, so a stray echo would be
# mistaken for the destination.
#
# The environment carries the rest:
#
#   CODEY_REPO_ROOT       the checkout /worktree was run from
#   CODEY_WORKTREE_NAME   the same name that arrives on stdin
#   CODEY_WORKTREES_DIR   where trees are kept
#
# Exit non-zero to refuse: Codey reports the failure and stays put.

set -euo pipefail

name="$(cat)"
name="${name//[[:space:]]/}"
if [ -z "$name" ]; then
	echo "worktree: no name on stdin" >&2
	exit 1
fi

repo="${CODEY_REPO_ROOT:-$PWD}"
trees="${CODEY_WORKTREES_DIR:-$HOME/.config/codey/worktrees}"
path="$trees/$name"

mkdir -p "$trees"
cd "$repo"

# A branch of this name may already exist — from an earlier tree that has since
# been removed, or from a colleague's push. Reusing it is friendlier than
# failing, and checking first keeps git's own error out of the way.
if git show-ref --quiet --verify "refs/heads/$name"; then
	git worktree add "$path" "$name" >&2
else
	git worktree add -b "$name" "$path" >&2
fi

# Whatever else a new tree needs goes here. For example:
#
#   cp "$repo/.env" "$path/.env" 2>/dev/null || true
#   (cd "$path" && npm install >&2)

echo "$path"