80 lines
2.2 KiB
Bash
80 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
# gitea skill — ver detalle de un PR.
|
|
#
|
|
# Uso:
|
|
# pr-view.sh <owner>/<repo> <number>
|
|
# pr-view.sh <repo> <number> # 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 <<EOF
|
|
Uso: pr-view.sh <owner>/<repo> <number>
|
|
pr-view.sh <repo> <number>
|
|
|
|
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)
|
|
"
|