#!/bin/bash
# Publish a new avatar-decorations version to the Gitea generic package
# registry and write the pin that LXC 106's deploy installs (matrix #22).
#
# GITEA_TOKEN=… deploy/publish-decorations.sh
#
# holds .png files and thumbs/.webp (the same layout the app
# requests). The set is split into ≤150 MB tar parts (the registry's proxy
# refuses large uploads), each part is uploaded, and cinny/decorations.sha256
# is rewritten. Commit that file to deploy; nothing changes until you do.
set -euo pipefail
SRC=${1:?usage: publish-decorations.sh }
VER=${2:?usage: publish-decorations.sh }
: "${GITEA_TOKEN:?set GITEA_TOKEN (package write scope)}"
REPO_ROOT=$(cd "$(dirname "$0")/.." && pwd)
BASE="https://code.lotusguild.org/api/packages/LotusGuild/generic/avatar-decorations/$VER"
WORK=$(mktemp -d)
trap 'rm -rf "$WORK"' EXIT
mkdir -p "$WORK/decorations/thumbs"
cp "$SRC"/*.png "$WORK/decorations/"
cp "$SRC"/thumbs/*.webp "$WORK/decorations/thumbs/"
cd "$WORK"
for f in decorations/*.png; do
s=$(basename "$f" .png)
[ -f "decorations/thumbs/$s.webp" ] || { echo "missing thumbs/$s.webp" >&2; exit 1; }
done
(cd decorations && find . -type f \( -name '*.png' -o -name '*.webp' \) | sort | xargs sha256sum > MANIFEST.sha256)
python3 - "$VER" <<'PY'
import os, subprocess, sys
ver, root, limit = sys.argv[1], 'decorations', 150 * 1024 * 1024
files = sorted(os.path.join(root, f) for f in os.listdir(root) if f.endswith('.png'))
first = [os.path.join(root, 'MANIFEST.sha256')] + sorted(os.path.join(root, 'thumbs', t) for t in os.listdir(os.path.join(root, 'thumbs')))
parts, cur, size = [], list(first), sum(os.path.getsize(f) for f in first)
for f in files:
if size + os.path.getsize(f) > limit and cur:
parts.append(cur); cur, size = [], 0
cur.append(f); size += os.path.getsize(f)
parts.append(cur)
for i, p in enumerate(parts, 1):
lst = f'part{i}.list'
open(lst, 'w').write('\n'.join(p) + '\n')
subprocess.run(['tar', '--sort=name', '--owner=0', '--group=0', '--mtime=@0', '-cf',
f'avatar-decorations-{ver}.part{i}.tar', '-T', lst], check=True)
PY
sha256sum avatar-decorations-"$VER".part*.tar > SHA256SUMS
for f in avatar-decorations-"$VER".part*.tar SHA256SUMS; do
code=$(curl -s -o /dev/null -w '%{http_code}' -X PUT -H "Authorization: token $GITEA_TOKEN" \
--upload-file "$f" "$BASE/$f")
[ "$code" = 201 ] || { echo "upload of $f failed: HTTP $code" >&2; exit 1; }
echo "uploaded $f"
done
cp SHA256SUMS "$REPO_ROOT/cinny/decorations.sha256"
echo "Pinned $VER in cinny/decorations.sha256: commit it to deploy."