From fa77b054a5e3c1b4cc9170b69329e8620b89aa30 Mon Sep 17 00:00:00 2001 From: lyn Date: Wed, 1 Apr 2026 14:50:02 +0000 Subject: [PATCH] feat(git-hangman-lab): add create-pr command - Add create-pr script for creating pull requests via API - Auto-generate access token if not present - Integrate into git-ctrl dispatcher - Update SKILL.md with new command documentation --- git-hangman-lab/SKILL.md | 10 ++++ git-hangman-lab/scripts/create-pr | 95 +++++++++++++++++++++++++++++++ git-hangman-lab/scripts/git-ctrl | 4 ++ 3 files changed, 109 insertions(+) create mode 100755 git-hangman-lab/scripts/create-pr diff --git a/git-hangman-lab/SKILL.md b/git-hangman-lab/SKILL.md index 0868da9..ee29450 100644 --- a/git-hangman-lab/SKILL.md +++ b/git-hangman-lab/SKILL.md @@ -43,6 +43,16 @@ Create a new git repository on git.hangman-lab.top. > **Note**: The repository will be created at `${AGENT_WORKSPACE}/${repo-name}` (default: `/root/.openclaw/workspace/workspace-mentor`) +### Create Pull Request + +Create a pull request on git.hangman-lab.top. + +```bash +{baseDir}/scripts/git-ctrl create-pr [pr-title] [pr-body] +``` + +> **Note**: The access token will be automatically generated if not found. + ### Link Keycloak Account Link Keycloak account with Gitea (for OAuth binding). diff --git a/git-hangman-lab/scripts/create-pr b/git-hangman-lab/scripts/create-pr new file mode 100755 index 0000000..64c1b98 --- /dev/null +++ b/git-hangman-lab/scripts/create-pr @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +usage() { + echo "Usage: $0 [pr-title] [pr-body]" + echo "" + echo "Create a pull request on git.hangman-lab.top" + echo "" + echo "Arguments:" + echo " repo-local-path Local path to the git repository" + echo " head-branch Branch containing the changes" + echo " base-branch Branch to merge into (e.g., main)" + echo " pr-title Title of the pull request (optional, default: 'untitled pull request')" + echo " pr-body Body/description of the pull request (optional, default: '')" + exit 2 +} + +if [[ $# -lt 3 ]]; then + usage +fi + +REPO_LOCAL_PATH="$1" +HEAD_BRANCH="$2" +BASE_BRANCH="$3" +PR_TITLE="${4:-untitled pull request}" +PR_BODY="${5:-}" + +# Validate repo path +if [[ ! -d "$REPO_LOCAL_PATH/.git" ]]; then + echo "Error: Not a git repository: $REPO_LOCAL_PATH" + exit 1 +fi + +# Check if git-access-token exists, if not generate it +if ! secret-mgr list 2>/dev/null | grep -q "git-access-token"; then + echo "Access token not found, generating..." + "$SCRIPT_DIR/generate-access-token" +fi + +# Get the access token +GIT_TOKEN="$(secret-mgr get-secret --key git-access-token)" + +if [[ -z "$GIT_TOKEN" ]]; then + echo "Error: Failed to get git-access-token" + exit 1 +fi + +# Get remote URL from .git +REMOTE_URL="$(git -C "$REPO_LOCAL_PATH" remote get-url origin)" + +# Match pattern: https://git.hangman-lab.top/${owner}/${repo-name}.git +if [[ "$REMOTE_URL" =~ https://git\.hangman-lab\.top/([^/]+)/([^/]+)\.git ]]; then + OWNER="${BASH_REMATCH[1]}" + REPO_NAME="${BASH_REMATCH[2]}" +else + echo "Error: Invalid remote URL format: $REMOTE_URL" + echo "Expected: https://git.hangman-lab.top/\${owner}/\${repo-name}.git" + exit 1 +fi + +echo "Creating PR: $OWNER/$REPO_NAME ($HEAD_BRANCH -> $BASE_BRANCH)" + +# Create PR via API +RESPONSE=$(curl -s -X POST "https://git.hangman-lab.top/api/v1/repos/${OWNER}/${REPO_NAME}/pulls" \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -H "Authorization: token ${GIT_TOKEN}" \ + -d "$(jq -n \ + --arg head "$HEAD_BRANCH" \ + --arg base "$BASE_BRANCH" \ + --arg title "$PR_TITLE" \ + --arg body "$PR_BODY" \ + '{head: $head, base: $base, title: $title, body: $body}')") + +# Check if response contains an error +if echo "$RESPONSE" | jq -e '.message' >/dev/null 2>&1; then + ERROR_MSG=$(echo "$RESPONSE" | jq -r '.message') + echo "Error: $ERROR_MSG" + exit 1 +fi + +# Extract PR URL from response +PR_URL=$(echo "$RESPONSE" | jq -r '.html_url // empty') + +if [[ -n "$PR_URL" ]]; then + echo "Pull request created successfully!" + echo "URL: $PR_URL" +else + echo "Error: Failed to create pull request" + echo "Response: $RESPONSE" + exit 1 +fi diff --git a/git-hangman-lab/scripts/git-ctrl b/git-hangman-lab/scripts/git-ctrl index 21f3517..251015f 100755 --- a/git-hangman-lab/scripts/git-ctrl +++ b/git-hangman-lab/scripts/git-ctrl @@ -11,6 +11,7 @@ if [[ $# -eq 0 ]]; then echo " check-git-cred Verify git credentials" echo " create-git-account Create a new git account" echo " create-repo Create a new repository" + echo " create-pr Create a pull request" echo " generate-access-token Generate access token for current user" echo " link-keycloak Link Keycloak account with Gitea" echo " repo-add-collaborators Add collaborator to repository" @@ -35,6 +36,9 @@ case "$subcommand" in create-repo) "$SCRIPT_DIR/create-repo" "$@" ;; + create-pr) + "$SCRIPT_DIR/create-pr" "$@" + ;; generate-access-token) "$SCRIPT_DIR/generate-access-token" "$@" ;;