#!/usr/bin/env bash # intialize a new worktree from a PR number: # # - creates a new remote using the fork's clone URL # - creates a local branch tracking the remote branch # - creates a new worktree in a parent folder, suffixed with "-pr-${PR}" # # sample usage: # ./scripts/pr2wt.sh 12345 # ./scripts/pr2wt.sh 12345 opencode function usage() { echo "usage: $0 [cmd]" exit 1 } # check we are in the right directory if [[ ! -f "scripts/pr2wt.sh" ]]; then echo "error: this script must be run from the root of the repository" exit 1 fi if [[ $# -lt 1 || $# -gt 2 ]]; then usage fi PR=$1 [[ "$PR" =~ ^[0-9]+$ ]] || { echo "error: PR number must be numeric"; exit 1; } url_origin=$(git config --get remote.origin.url) || { echo "error: no remote named 'origin' in this repository" exit 1 } org_repo=$(echo $url_origin | cut -d/ -f4-) org_repo=${org_repo%.git} echo "org/repo: $org_repo" meta=$(curl -sSf -H "Accept: application/vnd.github+json" "https://api.github.com/repos/${org_repo}/pulls/${PR}") url_remote=$(echo "$meta" | jq -r '.head.repo.clone_url') head_ref=$(echo "$meta" | jq -r '.head.ref') echo "url: $url_remote" echo "head_ref: $head_ref" git remote rm pr/${PR} git remote add pr/${PR} $url_remote git fetch pr/${PR} $head_ref dir=$(basename $(pwd)) git branch -D pr/$PR 2> /dev/null git worktree add -b pr/$PR ../$dir-pr-$PR pr/$PR/${head_ref} 2> /dev/null wt_path=$(cd ../$dir-pr-$PR && pwd) echo "git worktree created in $wt_path" # if a command was provided, execute it if [[ $# -eq 2 ]]; then cd ../$dir-pr-$PR exec $2 fi