#!/usr/bin/env bash # gitea skill — ver detalle de un PR. # # Uso: # pr-view.sh / # pr-view.sh # usa GITEA_DEFAULT_OWNER set -euo pipefail SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" QUERY="$SKILL_DIR/scripts/query.sh" if [[ $# -lt 2 ]]; then cat >&2 </ pr-view.sh Ejemplos: pr-view.sh NucleOS/nucleo-infra 14 pr-view.sh nucleo-infra 14 EOF exit 2 fi repo_arg="$1" number="$2" if [[ "$repo_arg" == */* ]]; then owner="${repo_arg%%/*}" repo="${repo_arg##*/}" else set -a; source "$SKILL_DIR/.env"; set +a owner="${GITEA_DEFAULT_OWNER:?owner no especificado y GITEA_DEFAULT_OWNER vacío}" repo="$repo_arg" fi resp="$("$QUERY" "/repos/${owner}/${repo}/pulls/${number}")" # Si no es JSON-object o tiene error if [[ "${resp:0:1}" != "{" ]]; then echo "ERROR: respuesta inesperada:" >&2 echo "$resp" >&2 exit 1 fi echo "$resp" | PYTHONIOENCODING=utf-8 python -c " import json, sys pr = json.load(sys.stdin) if pr.get('message') and not pr.get('number'): print('ERROR:', pr.get('message'), file=sys.stderr); sys.exit(1) n = pr.get('number') title = pr.get('title','') state = 'merged' if pr.get('merged') else pr.get('state','?') head = (pr.get('head') or {}).get('ref','?') base = (pr.get('base') or {}).get('ref','?') user = (pr.get('user') or {}).get('login','?') created = (pr.get('created_at') or '')[:19].replace('T',' ') updated = (pr.get('updated_at') or '')[:19].replace('T',' ') merged_at = (pr.get('merged_at') or '')[:19].replace('T',' ') mergeable = pr.get('mergeable') url = pr.get('html_url') print(f'#{n} {title}') print(f' state: {state} (mergeable={mergeable})') print(f' branch: {head} → {base}') print(f' author: {user}') print(f' created: {created}') print(f' updated: {updated}') if merged_at: print(f' merged: {merged_at}') print(f' url: {url}') print() body = (pr.get('body') or '').strip() if body: print('--- body ---') # Truncar si es muy largo if len(body) > 4000: body = body[:4000] + '\n[...truncado, total {} chars]'.format(len(pr.get('body',''))) print(body) "