forgejo-mcp/hack/snapshot-downloads.sh

52 lines
1.8 KiB
Bash
Executable file

#!/bin/sh
# Snapshot per-asset release download counts into an append-only JSONL time series.
#
# The Forgejo API exposes a *cumulative* download_count per release asset but keeps
# no history. We snapshot it daily; git becomes the time-series database. Each run
# appends one line per (date, tag, asset). Re-running on the same day replaces that
# day's rows (idempotent), so a retried CI job never double-counts.
#
# POSIX sh (no bashisms): the CI runner's pod image may not ship bash.
#
# Usage: hack/snapshot-downloads.sh [owner/repo] [output.jsonl]
set -eu
REPO="${1:-goern/forgejo-mcp}"
OUT="${2:-docs/downloads/downloads.jsonl}"
API="${FORGEJO_API:-https://codeberg.org/api/v1}"
TODAY="$(date -u +%F)"
mkdir -p "$(dirname "$OUT")"
# Paginate releases until a page comes back empty, flattening assets to one row
# each. download_count is the cumulative counter we are sampling at $TODAY.
snapshot="$(mktemp)"
trap 'rm -f "$snapshot"' EXIT INT TERM
page=1
while : ; do
body="$(curl -fsS "$API/repos/$REPO/releases?limit=50&page=$page")"
count="$(printf '%s' "$body" | jq 'length')"
[ "$count" -eq 0 ] && break
printf '%s' "$body" | jq -c --arg date "$TODAY" '
.[] as $rel
| $rel.assets[]
| {date:$date, tag:$rel.tag_name, published:$rel.published_at,
asset:.name, size:.size, downloads:.download_count}
' >> "$snapshot"
page=$((page + 1))
done
if [ ! -s "$snapshot" ]; then
echo "snapshot-downloads: no assets returned for $REPO — aborting (kept existing $OUT)" >&2
exit 1
fi
# Idempotent append: drop any rows already recorded for $TODAY, then add fresh ones.
if [ -f "$OUT" ]; then
grep -v "\"date\":\"$TODAY\"" "$OUT" > "$OUT.tmp" || true
mv "$OUT.tmp" "$OUT"
fi
cat "$snapshot" >> "$OUT"
echo "snapshot-downloads: recorded $(wc -l < "$snapshot") asset rows for $TODAY into $OUT"