#!/usr/bin/env bash # Refresh the deployed PR-review watcher from the repo, in one command. # # ~/pr-review-watcher/update-pr-review-watcher.sh # from master (default) # ~/pr-review-watcher/update-pr-review-watcher.sh some/branch # from a branch (pre-merge testing) # # Pulls the latest script into a dedicated self-update checkout (~/pr-review-watcher/.src), # separate from any work clone so it never races the issue watcher, then copies the # watcher (and this updater) into place. NEVER touches the live config (real token). set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG="$HERE/pr-review-watcher.config.json" [ -f "$CONFIG" ] || { echo "Config not found: $CONFIG (deploy the watcher first)"; exit 1; } REF="${1:-master}" SRC="$HERE/.src" cfg() { jq -r "$1" "$CONFIG"; } URL=$(cfg .forgejoUrl); REPO=$(cfg .repo); TOKEN=$(cfg .token) host=${URL#*://}; scheme=${URL%%://*}; owner=${REPO%%/*} CLONE="${scheme}://${owner}:${TOKEN}@${host}/${REPO}.git" if [ ! -d "$SRC/.git" ]; then echo "First run: cloning $REPO into $SRC" git clone -q "$CLONE" "$SRC" fi git -C "$SRC" remote set-url origin "$CLONE" # keep the token fresh if it was rotated git -C "$SRC" fetch origin -q --prune # Prefer the remote-tracking ref; fall back to a literal ref (tag) if not a branch. git -C "$SRC" checkout -f -q "origin/$REF" 2>/dev/null || git -C "$SRC" checkout -f -q "$REF" git -C "$SRC" clean -fdq cp "$SRC/automation/claude-pr-review-watcher.sh" "$HERE/" cp "$SRC/automation/update-pr-review-watcher.sh" "$HERE/" 2>/dev/null || true # self-update # Seed the config from the example ONLY if missing -- never clobber the real token. [ -f "$CONFIG" ] || cp "$SRC/automation/pr-review-watcher.config.example.json" "$CONFIG" echo "Updated from '$REF' ($(git -C "$SRC" rev-parse --short HEAD)). Watcher script is current." echo "Dry-run: $HERE/claude-pr-review-watcher.sh $CONFIG"