feat: agregar repo-list.sh + docs

This commit is contained in:
2026-04-26 14:40:02 -06:00
parent 768b48003d
commit d23e2a3f64
3 changed files with 134 additions and 2 deletions

123
scripts/repo-list.sh Normal file
View File

@@ -0,0 +1,123 @@
#!/usr/bin/env bash
# gitea skill — listar repos de un owner (user o org).
#
# Uso:
# repo-list.sh [--owner <user|org>] [--limit N] [--sort newest|oldest|alpha|size]
#
# Default owner: el bot user ($GITEA_BOT_USER del .env).
# Default limit: 30. Default sort: newest.
#
# El endpoint cambia según el tipo de owner:
# - bot user: GET /users/{user}/repos (devuelve todos los del bot,
# incluyendo privados, porque está autenticado como ese user)
# - cualquier otro: GET /orgs/{org}/repos (devuelve los visibles según
# permisos del PAT en el org)
set -euo pipefail
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
QUERY="$SKILL_DIR/scripts/query.sh"
ENV_FILE="$SKILL_DIR/.env"
if [[ ! -f "$ENV_FILE" ]]; then
echo "ERROR: $ENV_FILE no existe. Corré setup.sh primero." >&2
exit 1
fi
set -a
# shellcheck disable=SC1090
source "$ENV_FILE"
set +a
: "${GITEA_BOT_USER:?GITEA_BOT_USER no definido en .env. Re-correr setup.sh.}"
owner=""
limit=30
sort="newest"
while [[ $# -gt 0 ]]; do
case "$1" in
--owner) owner="$2"; shift 2 ;;
--limit) limit="$2"; shift 2 ;;
--sort) sort="$2"; shift 2 ;;
-h|--help)
cat <<EOF
Uso: repo-list.sh [opciones]
Opciones:
--owner <user|org> Default: bot user (\$GITEA_BOT_USER, "$GITEA_BOT_USER")
--limit N Default: 30
--sort <s> newest | oldest | alpha | size (default: newest)
Ejemplos:
repo-list.sh # repos del bot
repo-list.sh --owner NucleOS # repos del org
repo-list.sh --limit 10 --sort alpha
EOF
exit 0
;;
-*) echo "ERROR: flag desconocida: $1" >&2; exit 2 ;;
*) echo "ERROR: argumento extra: $1" >&2; exit 2 ;;
esac
done
[[ -z "$owner" ]] && owner="$GITEA_BOT_USER"
# Detectar user vs. org (case-insensitive contra bot user; cualquier otro = org)
shopt -s nocasematch
if [[ "$owner" == "$GITEA_BOT_USER" ]]; then
endpoint="/users/${owner}/repos"
owner_kind="user (bot)"
else
endpoint="/orgs/${owner}/repos"
owner_kind="org"
fi
shopt -u nocasematch
# Map sort → param de Gitea
case "$sort" in
newest) sort_param="updated" ;;
oldest) sort_param="oldest" ;;
alpha) sort_param="alphabetically" ;;
size) sort_param="size" ;;
*) echo "ERROR: --sort debe ser newest|oldest|alpha|size" >&2; exit 2 ;;
esac
resp="$("$QUERY" "${endpoint}?limit=${limit}&sort=${sort_param}")"
# Detectar error (objeto en vez de array)
if [[ "${resp:0:1}" == "{" ]]; then
echo "$resp" | PYTHONIOENCODING=utf-8 python -c "
import json, sys
d = json.load(sys.stdin)
print('ERROR:', d.get('message') or d, file=sys.stderr)
" >&2
exit 1
fi
export PY_OWNER="$owner" PY_KIND="$owner_kind" PYTHONIOENCODING=utf-8
echo "$resp" | python -c '
import json, os, sys
repos = json.load(sys.stdin)
owner = os.environ.get("PY_OWNER", "?")
kind = os.environ.get("PY_KIND", "?")
print(f"{len(repos)} repo(s) en {owner} ({kind}):")
print()
for r in repos:
name = r.get("name","?")
vis = "private" if r.get("private") else "public "
archived = " [archived]" if r.get("archived") else ""
template = " [template]" if r.get("template") else ""
fork = " [fork]" if r.get("fork") else ""
size_kb = r.get("size", 0)
if size_kb < 1024:
size_str = f"{size_kb:>5}KB"
else:
size_str = f"{size_kb/1024:>5.1f}MB"
updated = (r.get("updated_at") or "")[:10]
desc = (r.get("description") or "").replace("\n", " ")
if len(desc) > 70: desc = desc[:67] + "..."
print(f" {name:<26} [{vis}] {size_str} upd {updated}{archived}{template}{fork}")
if desc:
print(f" {desc}")
'