Files
mr.zeroandClaude Opus 5 30e9a5a6e2 Close the desktop store item, and fix a check that had started lying
MORE_STORES item 2 is done: stores/warp-engine-desktop-store and
stores/ttg-desktop-store. The write-up records what the implementation changed
about the plan — chiefly that the `html` asset is not a downloadable archive but a
hosted directory, so a browser title becomes a menu entry that opens its page
rather than an offline install.

Separately: `check-repos.sh` reported `infra/wiki-pages` as STALE while the repo
was plainly there. Gitea caps a page at 50 items whatever `--limit` says, so
`tea repo list --limit 1000` had been quietly returning the first 50 — invisible
until today, when the estate reached 51 repos. The check now pages through, and
fails loudly if the server returns nothing at all rather than declaring the whole
workspace stale.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 10:00:41 +02:00

71 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Compare the scripts/repos.list clone list against the Gitea server
# (tea repo list --output json).
#
# - MISSING: exists on the server but is neither in the clone list
# nor in repos.ignore
# - STALE: listed as a Gitea repo but does not exist on the server
#
# Exit code: 0 if everything matches; 1 if either list has hits.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LIST="$SCRIPT_DIR/repos.list"
IGNORE="$SCRIPT_DIR/repos.ignore"
GITEA_HOST="git.teletypegames.org"
command -v tea >/dev/null 2>&1 || {
echo "ERROR: tea CLI not found. Run: make tea" >&2
exit 1
}
# Repos on the server: owner/name.
#
# Paginated on purpose. Gitea caps a page at MAX_RESPONSE_ITEMS (50 by default)
# whatever --limit says, so `tea repo list --limit 1000` silently returns the
# first 50 — which looked like a repo had vanished from the server the day the
# estate grew past fifty. Pages are requested until a short one comes back.
server=$(
page=1
while :; do
batch=$(tea api "/user/repos?limit=50&page=$page" | jq -r '.[].full_name')
[ -z "$batch" ] && break
echo "$batch"
[ "$(echo "$batch" | wc -l)" -lt 50 ] && break
page=$((page + 1))
done | sort -u
)
[ -n "$server" ] || { echo "ERROR: the server returned no repos — is the tea login still valid?" >&2; exit 1; }
# Gitea repos in the clone list: owner/name extracted from the clone URL
listed=$(sed -nE "s#^[^|#]+\|ssh://git@${GITEA_HOST}:[0-9]+/(.+)\$#\1#p" "$LIST" | sed 's/\.git$//' | sort)
# Intentionally excluded repos
ignored=$(sed -e 's/#.*//' -e '/^[[:space:]]*$/d' "$IGNORE" 2>/dev/null | sort || true)
missing=$(comm -23 <(echo "$server") <(sort -u <(echo "$listed") <(echo "$ignored")))
stale=$(comm -13 <(echo "$server") <(echo "$listed"))
status=0
if [ -n "$missing" ]; then
echo "MISSING from the clone list (exists on the server):"
echo "$missing" | sed 's/^/ - /'
status=1
fi
if [ -n "$stale" ]; then
echo "STALE in the clone list (not on the server):"
echo "$stale" | sed 's/^/ - /'
status=1
fi
if [ "$status" -eq 0 ]; then
echo "OK: the clone list covers all $(echo "$server" | wc -l | tr -d ' ') repos on the server ($(echo "$ignored" | grep -c . || true) intentionally excluded)."
fi
exit "$status"