2026-06-30 15:59:18 +05:30
|
|
|
#!/usr/bin/env bash
|
2026-06-30 16:15:10 +05:30
|
|
|
# Environment setup for a git worktree: pipecat submodule, isolated venv,
|
|
|
|
|
# Python --dev deps, and ui/node_modules. A fresh worktree is just a source
|
|
|
|
|
# checkout, so it has none of these; this provisions an ISOLATED environment
|
|
|
|
|
# (its own editable pipecat install points at THIS worktree's pipecat, so
|
|
|
|
|
# pipecat edits here take effect).
|
2026-06-30 15:59:18 +05:30
|
|
|
#
|
2026-06-30 16:15:10 +05:30
|
|
|
# Runs automatically once per worktree via the "folderOpen" task in
|
|
|
|
|
# .vscode/tasks.json. A success sentinel (venv/.worktree-setup-complete) makes
|
|
|
|
|
# it run-once:
|
|
|
|
|
# --if-needed : exit immediately if already provisioned (used by folderOpen)
|
|
|
|
|
# (no flag) : always run / re-provision (the manual "force" task)
|
2026-06-30 15:59:18 +05:30
|
|
|
#
|
2026-06-30 16:15:10 +05:30
|
|
|
# Heavy (minutes) the first time; instant skip afterwards. uv hardlinks wheels
|
|
|
|
|
# from its global cache and npm uses its cache, so even a forced re-run is fast.
|
2026-06-30 15:59:18 +05:30
|
|
|
set -euo pipefail
|
|
|
|
|
|
2026-06-30 16:15:10 +05:30
|
|
|
IF_NEEDED=0
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
|
case "$arg" in
|
|
|
|
|
--if-needed) IF_NEEDED=1 ;;
|
|
|
|
|
*) echo "Unknown argument: $arg" >&2; echo "Usage: $0 [--if-needed]" >&2; exit 1 ;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
2026-06-30 15:59:18 +05:30
|
|
|
ROOT="$(git rev-parse --show-toplevel)"
|
|
|
|
|
cd "$ROOT"
|
|
|
|
|
PYVER="${PYVER:-3.13}"
|
2026-06-30 16:15:10 +05:30
|
|
|
SENTINEL="$ROOT/venv/.worktree-setup-complete"
|
|
|
|
|
|
|
|
|
|
# Run-once guard: skip instantly when already provisioned. Checked BEFORE the log
|
|
|
|
|
# is (re)written so a skip never clobbers the previous run's log. The sentinel
|
|
|
|
|
# lives inside venv/, so deleting venv/ (or the worktree) forces a redo; an
|
|
|
|
|
# interrupted run never writes it, so the next open self-heals.
|
|
|
|
|
if [ "$IF_NEEDED" -eq 1 ] && [ -f "$SENTINEL" ]; then
|
|
|
|
|
echo "[setup-worktree] already provisioned ($SENTINEL) — skipping."
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
2026-06-30 15:59:18 +05:30
|
|
|
|
|
|
|
|
# Mirror all output to a gitignored, worktree-local log so you can follow
|
2026-06-30 16:15:10 +05:30
|
|
|
# progress any time this runs (folderOpen task, manual, or background):
|
2026-06-30 15:59:18 +05:30
|
|
|
# tail -f logs/setup-worktree.log
|
|
|
|
|
# (/logs/ is already in .gitignore, and each worktree has its own logs/.)
|
|
|
|
|
LOG="$ROOT/logs/setup-worktree.log"
|
|
|
|
|
mkdir -p "$ROOT/logs"
|
|
|
|
|
exec > >(tee "$LOG") 2>&1
|
|
|
|
|
echo "=== setup-worktree $(date '+%Y-%m-%d %H:%M:%S') [$(basename "$ROOT")] ==="
|
|
|
|
|
|
|
|
|
|
echo "==> [1/4] pipecat submodule (init/update for this worktree)..."
|
|
|
|
|
git submodule update --init --recursive
|
|
|
|
|
|
|
|
|
|
echo "==> [2/4] isolated venv (python $PYVER)..."
|
|
|
|
|
if [ -x venv/bin/python ]; then
|
|
|
|
|
echo " venv already exists — reusing."
|
|
|
|
|
else
|
|
|
|
|
uv venv venv --python "$PYVER"
|
|
|
|
|
fi
|
|
|
|
|
# Activate so setup_requirements.sh / uv install into THIS worktree's venv.
|
|
|
|
|
set +u # activate scripts can reference unset vars
|
|
|
|
|
# shellcheck disable=SC1091
|
|
|
|
|
source venv/bin/activate
|
|
|
|
|
set -u
|
|
|
|
|
|
|
|
|
|
echo "==> [3/4] Python deps (--dev; submodule already inited)..."
|
|
|
|
|
./scripts/setup_requirements.sh --dev
|
|
|
|
|
|
|
|
|
|
echo "==> [4/4] UI node_modules..."
|
|
|
|
|
( cd ui && npm install )
|
|
|
|
|
|
2026-06-30 16:15:10 +05:30
|
|
|
# Mark success LAST, so an interrupted run re-provisions on the next open.
|
|
|
|
|
touch "$SENTINEL"
|
2026-06-30 15:59:18 +05:30
|
|
|
echo "✅ Worktree env ready: $(basename "$ROOT") ($(python -V 2>&1))"
|