From 4741b3e16fd27f10ab99f36e2b77e119a2780dd2 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Mon, 25 May 2026 14:19:52 -0500 Subject: [PATCH] fix(git): pass explicit repo to Gitea wrappers --- .../mosaic/framework/tools/git/issue-list.sh | 45 ++++++++++++------- .../mosaic/framework/tools/git/pr-ci-wait.sh | 35 ++++++++++----- .../mosaic/framework/tools/git/pr-diff.sh | 43 ++++++++++-------- .../mosaic/framework/tools/git/pr-list.sh | 37 +++++++++++---- .../mosaic/framework/tools/git/pr-view.sh | 27 ++++++++--- 5 files changed, 129 insertions(+), 58 deletions(-) diff --git a/packages/mosaic/framework/tools/git/issue-list.sh b/packages/mosaic/framework/tools/git/issue-list.sh index 37e00c5..5c94350 100755 --- a/packages/mosaic/framework/tools/git/issue-list.sh +++ b/packages/mosaic/framework/tools/git/issue-list.sh @@ -1,6 +1,6 @@ #!/bin/bash # issue-list.sh - List issues on Gitea or GitHub -# Usage: issue-list.sh [-s state] [-l label] [-m milestone] [-a assignee] +# Usage: issue-list.sh [-r owner/repo] [-s state] [-l label] [-m milestone] [-a assignee] set -e @@ -13,6 +13,7 @@ LABEL="" MILESTONE="" ASSIGNEE="" LIMIT=100 +REPO_OVERRIDE="" usage() { cat </dev/null || echo gitea) +else + PLATFORM=$(detect_platform) + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi case "$PLATFORM" in github) - CMD="gh issue list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --label \"$LABEL\"" - [[ -n "$MILESTONE" ]] && CMD="$CMD --milestone \"$MILESTONE\"" - [[ -n "$ASSIGNEE" ]] && CMD="$CMD --assignee \"$ASSIGNEE\"" - eval "$CMD" + CMD=(gh issue list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--label "$LABEL") + [[ -n "$MILESTONE" ]] && CMD+=(--milestone "$MILESTONE") + [[ -n "$ASSIGNEE" ]] && CMD+=(--assignee "$ASSIGNEE") + "${CMD[@]}" ;; gitea) - CMD="tea issues list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --labels \"$LABEL\"" - [[ -n "$MILESTONE" ]] && CMD="$CMD --milestones \"$MILESTONE\"" - # Note: tea may not support assignee filter directly - eval "$CMD" - if [[ -n "$ASSIGNEE" ]]; then - echo "Note: Assignee filtering may require manual review for Gitea" >&2 - fi + CMD=(tea issues list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--labels "$LABEL") + [[ -n "$MILESTONE" ]] && CMD+=(--milestones "$MILESTONE") + [[ -n "$ASSIGNEE" ]] && CMD+=(--assignee "$ASSIGNEE") + "${CMD[@]}" ;; *) echo "Error: Could not detect git platform" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-ci-wait.sh b/packages/mosaic/framework/tools/git/pr-ci-wait.sh index 4844a21..bdddb58 100755 --- a/packages/mosaic/framework/tools/git/pr-ci-wait.sh +++ b/packages/mosaic/framework/tools/git/pr-ci-wait.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-ci-wait.sh - Wait for PR CI status to reach terminal state (GitHub/Gitea) -# Usage: pr-ci-wait.sh -n [-t timeout_sec] [-i interval_sec] +# Usage: pr-ci-wait.sh -n [-r owner/repo] [-t timeout_sec] [-i interval_sec] set -euo pipefail @@ -10,6 +10,7 @@ source "$SCRIPT_DIR/detect-platform.sh" PR_NUMBER="" TIMEOUT_SEC=1800 INTERVAL_SEC=15 +REPO_OVERRIDE="" usage() { cat < [-t timeout_sec] [-i interval_sec] Options: -n, --number NUMBER PR number (required) + -r, --repo OWNER/REPO Repository slug (default: infer from git origin) -t, --timeout SECONDS Max wait time in seconds (default: 1800) -i, --interval SECONDS Poll interval in seconds (default: 15) -h, --help Show this help Examples: $(basename "$0") -n 643 + $(basename "$0") -n 643 --repo ddk/ai-bma $(basename "$0") -n 643 -t 900 -i 10 EOF } @@ -95,7 +98,7 @@ PY } github_get_pr_head_sha() { - gh pr view "$PR_NUMBER" --json headRefOid --jq '.headRefOid' + gh pr view "$PR_NUMBER" --repo "$OWNER/$REPO" --json headRefOid --jq '.headRefOid' } github_get_commit_status_json() { @@ -132,6 +135,10 @@ while [[ $# -gt 0 ]]; do PR_NUMBER="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -t|--timeout) TIMEOUT_SEC="$2" shift 2 @@ -163,10 +170,21 @@ if ! [[ "$TIMEOUT_SEC" =~ ^[0-9]+$ ]] || ! [[ "$INTERVAL_SEC" =~ ^[0-9]+$ ]]; th exit 1 fi -detect_platform > /dev/null +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi -OWNER=$(get_repo_owner) -REPO=$(get_repo_name) +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* || "$REPO_INFO" != */* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo owner/repo." >&2 + exit 1 +fi + +OWNER=${REPO_INFO%%/*} +REPO=${REPO_INFO##*/} START_TS=$(date +%s) DEADLINE_TS=$((START_TS + TIMEOUT_SEC)) @@ -182,10 +200,7 @@ if [[ "$PLATFORM" == "github" ]]; then fi echo "[pr-ci-wait] Platform=github PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" elif [[ "$PLATFORM" == "gitea" ]]; then - HOST=$(get_remote_host) || { - echo "Error: Could not determine remote host." >&2 - exit 1 - } + HOST=$(get_remote_host 2>/dev/null || echo "git.mosaicstack.dev") TOKEN=$(get_gitea_token "$HOST") || { echo "Error: Gitea token not found. Set GITEA_TOKEN or configure ~/.git-credentials." >&2 exit 1 @@ -195,7 +210,7 @@ elif [[ "$PLATFORM" == "gitea" ]]; then echo "Error: Could not resolve head SHA for PR #$PR_NUMBER." >&2 exit 1 fi - echo "[pr-ci-wait] Platform=gitea host=${HOST} PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" + echo "[pr-ci-wait] Platform=gitea host=${HOST} repo=${OWNER}/${REPO} PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" else echo "Error: Unsupported platform '${PLATFORM}'." >&2 exit 1 diff --git a/packages/mosaic/framework/tools/git/pr-diff.sh b/packages/mosaic/framework/tools/git/pr-diff.sh index 0fdafd6..c905029 100755 --- a/packages/mosaic/framework/tools/git/pr-diff.sh +++ b/packages/mosaic/framework/tools/git/pr-diff.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-diff.sh - Get the diff for a pull request on GitHub or Gitea -# Usage: pr-diff.sh -n [-o ] +# Usage: pr-diff.sh -n [-r owner/repo] [-o ] set -e @@ -10,6 +10,7 @@ source "$SCRIPT_DIR/detect-platform.sh" # Parse arguments PR_NUMBER="" OUTPUT_FILE="" +REPO_OVERRIDE="" while [[ $# -gt 0 ]]; do case $1 in @@ -21,11 +22,16 @@ while [[ $# -gt 0 ]]; do OUTPUT_FILE="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -h|--help) - echo "Usage: pr-diff.sh -n [-o ]" + echo "Usage: pr-diff.sh -n [-r owner/repo] [-o ]" echo "" echo "Options:" echo " -n, --number PR number (required)" + echo " -r, --repo Repository slug (default: infer from git origin)" echo " -o, --output Output file (optional, prints to stdout if omitted)" echo " -h, --help Show this help" exit 0 @@ -42,31 +48,30 @@ if [[ -z "$PR_NUMBER" ]]; then exit 1 fi -detect_platform > /dev/null +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi if [[ "$PLATFORM" == "github" ]]; then if [[ -n "$OUTPUT_FILE" ]]; then - gh pr diff "$PR_NUMBER" > "$OUTPUT_FILE" + gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" --repo "$REPO_INFO" > "$OUTPUT_FILE" else - gh pr diff "$PR_NUMBER" + gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" fi elif [[ "$PLATFORM" == "gitea" ]]; then # tea doesn't have a direct diff command — use the API - OWNER=$(get_repo_owner) - REPO=$(get_repo_name) - REMOTE_URL=$(git remote get-url origin 2>/dev/null) + HOST=$(get_remote_host 2>/dev/null || echo "git.mosaicstack.dev") - # Extract host from remote URL - if [[ "$REMOTE_URL" == https://* ]]; then - HOST=$(echo "$REMOTE_URL" | sed -E 's|https://([^/]+)/.*|\1|') - elif [[ "$REMOTE_URL" == git@* ]]; then - HOST=$(echo "$REMOTE_URL" | sed -E 's|git@([^:]+):.*|\1|') - else - echo "Error: Cannot determine host from remote URL" >&2 - exit 1 - fi - - DIFF_URL="https://${HOST}/api/v1/repos/${OWNER}/${REPO}/pulls/${PR_NUMBER}.diff" + DIFF_URL="https://${HOST}/api/v1/repos/${REPO_INFO}/pulls/${PR_NUMBER}.diff" GITEA_API_TOKEN=$(get_gitea_token "$HOST" || true) diff --git a/packages/mosaic/framework/tools/git/pr-list.sh b/packages/mosaic/framework/tools/git/pr-list.sh index 27a03cd..cc25301 100755 --- a/packages/mosaic/framework/tools/git/pr-list.sh +++ b/packages/mosaic/framework/tools/git/pr-list.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-list.sh - List pull requests on Gitea or GitHub -# Usage: pr-list.sh [-s state] [-l label] [-a author] +# Usage: pr-list.sh [-r owner/repo] [-s state] [-l label] [-a author] set -e @@ -12,6 +12,7 @@ STATE="open" LABEL="" AUTHOR="" LIMIT=100 +REPO_OVERRIDE="" usage() { cat </dev/null || echo gitea) +else + PLATFORM=$(detect_platform) + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi case "$PLATFORM" in github) - CMD="gh pr list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --label \"$LABEL\"" - [[ -n "$AUTHOR" ]] && CMD="$CMD --author \"$AUTHOR\"" - eval "$CMD" + CMD=(gh pr list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--label "$LABEL") + [[ -n "$AUTHOR" ]] && CMD+=(--author "$AUTHOR") + "${CMD[@]}" ;; gitea) - # tea pr list - note: tea uses 'pulls' subcommand in some versions - CMD="tea pr list --state $STATE --limit $LIMIT" + CMD=(tea pr list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") # tea filtering may be limited if [[ -n "$LABEL" ]]; then @@ -84,7 +103,7 @@ case "$PLATFORM" in echo "Note: Author filtering may require manual review for Gitea" >&2 fi - eval "$CMD" + "${CMD[@]}" ;; *) echo "Error: Could not detect git platform" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-view.sh b/packages/mosaic/framework/tools/git/pr-view.sh index 7836e09..4f6c996 100755 --- a/packages/mosaic/framework/tools/git/pr-view.sh +++ b/packages/mosaic/framework/tools/git/pr-view.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-view.sh - View pull request details on GitHub or Gitea -# Usage: pr-view.sh -n +# Usage: pr-view.sh -n [-r owner/repo] set -e @@ -9,6 +9,7 @@ source "$SCRIPT_DIR/detect-platform.sh" # Parse arguments PR_NUMBER="" +REPO_OVERRIDE="" while [[ $# -gt 0 ]]; do case $1 in @@ -16,11 +17,16 @@ while [[ $# -gt 0 ]]; do PR_NUMBER="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -h|--help) - echo "Usage: pr-view.sh -n " + echo "Usage: pr-view.sh -n [-r owner/repo]" echo "" echo "Options:" echo " -n, --number PR number (required)" + echo " -r, --repo Repository slug (default: infer from git origin)" echo " -h, --help Show this help" exit 0 ;; @@ -36,12 +42,23 @@ if [[ -z "$PR_NUMBER" ]]; then exit 1 fi -detect_platform +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi if [[ "$PLATFORM" == "github" ]]; then - gh pr view "$PR_NUMBER" + gh pr view "$PR_NUMBER" --repo "$REPO_INFO" elif [[ "$PLATFORM" == "gitea" ]]; then - tea pr "$PR_NUMBER" + tea pr "$PR_NUMBER" --repo "$REPO_INFO" else echo "Error: Unknown platform" exit 1