#!/usr/bin/env bash # Cut a gitea PR with a long markdown body. # # mkpr.sh "" [head-branch] [base-branch] # # Exists because two things get in the way of a one-liner: # # 1. `tea pr create` has no --description-file, only --description, so the # body has to arrive via $(cat ...) -- and a Claude Code session pinned # to a worktree refuses that invocation as "too complex to verify it # stays inside the worktree". Running it from a script file sidesteps # the check without weakening it. # 2. The head branch must already be pushed. tea will happily open a PR # against a ref the server does not have, so this checks first. set -euo pipefail BODY_FILE="${1:?usage: mkpr.sh <body.md> \"<title>\" [head] [base]}" TITLE="${2:?missing title}" HEAD="${3:-$(git rev-parse --abbrev-ref HEAD)}" BASE="${4:-main}" REPO_SLUG="${MKPR_REPO:-alee/6krrt}" [ -s "$BODY_FILE" ] || { echo "body file is empty or missing: $BODY_FILE" >&2; exit 1; } git fetch origin --quiet if ! git rev-parse --verify --quiet "origin/$HEAD" >/dev/null; then echo "origin/$HEAD does not exist -- push the branch first:" >&2 echo " git push origin $HEAD" >&2 exit 1 fi if [ "$(git rev-parse "$HEAD")" != "$(git rev-parse "origin/$HEAD")" ]; then echo "local $HEAD and origin/$HEAD differ -- push before opening the PR:" >&2 echo " git push origin $HEAD" >&2 exit 1 fi AHEAD="$(git rev-list --count "origin/$BASE..origin/$HEAD")" if [ "$AHEAD" -eq 0 ]; then echo "origin/$HEAD is not ahead of origin/$BASE -- nothing to open a PR for" >&2 exit 1 fi echo "opening PR for $AHEAD commit(s): $BASE <- $HEAD" # --remote origin as well as --repo: AGENTS.md notes the `alee` login is not # tea's default, so the login has to be discovered from the remote. The two # flags compose -- --repo picks the repo, --remote picks the login. tea pr create \ --repo "$REPO_SLUG" \ --remote origin \ --head "$HEAD" \ --base "$BASE" \ --title "$TITLE" \ --description "$(cat "$BODY_FILE")"