146 lines
4.7 KiB
Bash
Executable File
146 lines
4.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# pr-edit.sh - Edit a pull request on GitHub or Gitea
|
|
# Usage: pr-edit.sh -n <pr_number> [-t <title>] [-b <body>] [-B <base>] [--draft|--ready] [--login <name>]
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=detect-platform.sh
|
|
source "$SCRIPT_DIR/detect-platform.sh"
|
|
|
|
PR_NUMBER=""
|
|
TITLE=""
|
|
BODY=""
|
|
BASE_BRANCH=""
|
|
DRAFT_MODE=""
|
|
LOGIN_OVERRIDE=""
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $(basename "$0") [OPTIONS]
|
|
|
|
Edit a pull request on the current repository (Gitea or GitHub).
|
|
|
|
Options:
|
|
-n, --number NUMBER Pull request number (required)
|
|
-t, --title TITLE New title
|
|
-b, --body BODY New body/description
|
|
-B, --base BRANCH New base branch
|
|
--draft Mark the pull request as draft
|
|
--ready Mark the pull request ready for review
|
|
--login NAME Gitea tea login (must match the repository host)
|
|
-h, --help Show this help message
|
|
EOF
|
|
exit "${1:-1}"
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-n|--number)
|
|
PR_NUMBER="${2:-}"
|
|
shift 2
|
|
;;
|
|
-t|--title)
|
|
TITLE="${2:-}"
|
|
shift 2
|
|
;;
|
|
-b|--body)
|
|
BODY="${2:-}"
|
|
shift 2
|
|
;;
|
|
-B|--base)
|
|
BASE_BRANCH="${2:-}"
|
|
shift 2
|
|
;;
|
|
--draft)
|
|
[[ "$DRAFT_MODE" != "ready" ]] || { echo "Error: --draft and --ready are mutually exclusive" >&2; exit 1; }
|
|
DRAFT_MODE="draft"
|
|
shift
|
|
;;
|
|
--ready)
|
|
[[ "$DRAFT_MODE" != "draft" ]] || { echo "Error: --draft and --ready are mutually exclusive" >&2; exit 1; }
|
|
DRAFT_MODE="ready"
|
|
shift
|
|
;;
|
|
--login)
|
|
LOGIN_OVERRIDE="${2:-}"
|
|
shift 2
|
|
;;
|
|
-h|--help)
|
|
usage 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1" >&2
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[[ -n "$PR_NUMBER" ]] || { echo "Error: Pull request number is required (-n)" >&2; exit 1; }
|
|
[[ "$PR_NUMBER" =~ ^[1-9][0-9]*$ ]] || { echo "Error: Pull request number must be a positive integer" >&2; exit 1; }
|
|
if [[ -z "$TITLE" && -z "$BODY" && -z "$BASE_BRANCH" && -z "$DRAFT_MODE" ]]; then
|
|
echo "Error: At least one edit option is required" >&2
|
|
exit 1
|
|
fi
|
|
|
|
PLATFORM=$(detect_platform)
|
|
|
|
case "$PLATFORM" in
|
|
github)
|
|
[[ -z "$LOGIN_OVERRIDE" ]] || { echo "Error: --login is only valid for Gitea" >&2; exit 1; }
|
|
if [[ -n "$TITLE" || -n "$BODY" || -n "$BASE_BRANCH" ]]; then
|
|
CMD=(gh pr edit "$PR_NUMBER")
|
|
[[ -n "$TITLE" ]] && CMD+=(--title "$TITLE")
|
|
[[ -n "$BODY" ]] && CMD+=(--body "$BODY")
|
|
[[ -n "$BASE_BRANCH" ]] && CMD+=(--base "$BASE_BRANCH")
|
|
"${CMD[@]}"
|
|
fi
|
|
if [[ "$DRAFT_MODE" == "draft" ]]; then
|
|
gh pr ready "$PR_NUMBER" --undo
|
|
elif [[ "$DRAFT_MODE" == "ready" ]]; then
|
|
gh pr ready "$PR_NUMBER"
|
|
fi
|
|
;;
|
|
gitea)
|
|
HOST=$(get_remote_host) || { echo "Error: Could not resolve Gitea host from remote" >&2; exit 1; }
|
|
REPO_SLUG=$(get_repo_slug) || { echo "Error: Could not resolve Gitea repo slug from remote" >&2; exit 1; }
|
|
if [[ -n "$LOGIN_OVERRIDE" ]]; then
|
|
GITEA_LOGIN="$LOGIN_OVERRIDE"
|
|
else
|
|
GITEA_LOGIN=$(get_gitea_login) || { echo "Error: Could not resolve Gitea login for remote host" >&2; exit 1; }
|
|
fi
|
|
# Bind the credential to the explicitly selected login and repository host.
|
|
TOKEN=$(get_gitea_token_for_login "$GITEA_LOGIN" "$HOST") || {
|
|
echo "Error: Could not resolve token for Gitea login '$GITEA_LOGIN' on '$HOST'" >&2
|
|
exit 1
|
|
}
|
|
PAYLOAD=$(TITLE="$TITLE" BODY="$BODY" BASE_BRANCH="$BASE_BRANCH" DRAFT_MODE="$DRAFT_MODE" python3 - <<'PY'
|
|
import json
|
|
import os
|
|
|
|
payload = {}
|
|
if os.environ["TITLE"]:
|
|
payload["title"] = os.environ["TITLE"]
|
|
if os.environ["BODY"]:
|
|
payload["body"] = os.environ["BODY"]
|
|
if os.environ["BASE_BRANCH"]:
|
|
payload["base"] = os.environ["BASE_BRANCH"]
|
|
if os.environ["DRAFT_MODE"]:
|
|
payload["draft"] = os.environ["DRAFT_MODE"] == "draft"
|
|
print(json.dumps(payload))
|
|
PY
|
|
)
|
|
curl -fsS -X PATCH \
|
|
-H "User-Agent: mosaic-pr-edit" \
|
|
-H "Authorization: token ${TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$PAYLOAD" \
|
|
"https://${HOST}/api/v1/repos/${REPO_SLUG}/pulls/${PR_NUMBER}"
|
|
echo "Updated Gitea pull request #$PR_NUMBER using login '$GITEA_LOGIN'" >&2
|
|
;;
|
|
*)
|
|
echo "Error: Could not detect git platform" >&2
|
|
exit 1
|
|
;;
|
|
esac
|