LocalEmoji, a new collection (unique shortcode whatever its case, never renamed: the shortcode is its id elsewhere),
managed on /clientapi/admin/emoji/list|insert|update|delete and kept in the staff's log (emoji.insert, .update,
.delete). Its picture goes through IMediaService.EmojiImage: PNG, GIF, WebP or JPEG up to 256 KB, a PNG within 256 px
with alpha kept (an animated GIF or WebP stays an animated GIF, with a still PNG), keep=none, shrunk until it fits
GoToSocial's 100 KiB, held by ServerUse "emoji:<shortcode>" so the janitor and the audit leave it. LocalEmojis keeps the
offered ones in memory, reloaded on every change: GET /api/v1/custom_emojis is real; local posts (words, title, warning,
poll options, each revision) and profiles keep the emoji they name; Notes, Questions, actors and EmojiReacts carry
Mastodon's Emoji tag with its id, served as an Emoji at /emojis/{shortcode} (410 once deleted; the path awaits the
owner's confirmation); a persona reacts with one (Pleroma's reactions, announcements). A restore keeps the live emoji
as it keeps the settings, and trashes server pictures nothing holds. tools/pasture/scenarios/emoji.sh joins batch A.
Verified: built, and run locally against a scratch database (uploads of every type, animation kept, metadata gone,
refusals, rendering, reactions, history, announcements, delete and revive, backup and restore, media audit). The
pasture scenario and the sweep were not run.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
75 lines
3.7 KiB
Bash
Executable File
75 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Every peer's scenario, a batch of peers at a time: a change to what PrivaPub sends (the @context, an actor's
|
|
# properties, an activity's shape, a delivery's headers) runs against all of them before it is committed, since one
|
|
# reader stricter than the rest fails on it alone. Each batch starts its own pasture afresh (run.sh up), runs its
|
|
# scenarios (interop.sh) and takes the pasture down (run.sh down), and the next batch runs whatever the one before did.
|
|
# PrivaPub runs with SecureMode on, as in production, unless PRIVAPUB_ENV says otherwise; DOTNET and PASTURE_PORT reach
|
|
# run.sh as they are. Each batch's output is kept in out/sweep-<batch>.log.
|
|
# usage: tools/pasture/sweep.sh [A|B|C|D ...] (default: every batch, in that order)
|
|
# A gts mastodon misskey sharkey akkoma, with relay, aoderelay and mailpit; scenarios: those five, threads followsync
|
|
# pins moves relay (relay's covers both relays) accounts (mailpit's) instance (the server's own settings: it changes
|
|
# them all and puts them back) moderation (gts and mastodon; after instance, whose log check expects only the
|
|
# administrator's acts) emoji (gts, mastodon, misskey and akkoma; after moderation)
|
|
# B lemmy lemmy19 piefed mbin nodebb
|
|
# C peertube pixelfed vernissage wordpress ghost writefreely owncast castopod funkwhale
|
|
# D friendica mobilizon gancio bookwyrm smithereen mitra snac ktistec forte hubzilla
|
|
# Not swept: restore (run it alone: it restores the whole server), crawler (it needs the crawler's own settings) and
|
|
# persona-archive; hollo, iceshrimp, pleroma, flood and decepub have no scenario of their own.
|
|
set -uo pipefail
|
|
here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
export PRIVAPUB_ENV=${PRIVAPUB_ENV:-Federation__SecureMode=true}
|
|
|
|
batch_peers() {
|
|
case "$1" in
|
|
A) echo "gts mastodon misskey sharkey akkoma relay aoderelay mailpit" ;;
|
|
B) echo "lemmy lemmy19 piefed mbin nodebb" ;;
|
|
C) echo "peertube pixelfed vernissage wordpress ghost writefreely owncast castopod funkwhale" ;;
|
|
D) echo "friendica mobilizon gancio bookwyrm smithereen mitra snac ktistec forte hubzilla" ;;
|
|
esac
|
|
}
|
|
batch_scenarios() {
|
|
case "$1" in
|
|
A) echo "gts mastodon misskey sharkey akkoma threads followsync pins moves relay accounts instance moderation emoji" ;;
|
|
*) batch_peers "$1" ;;
|
|
esac
|
|
}
|
|
|
|
[ $# -gt 0 ] || set -- A B C D
|
|
for batch in "$@"; do
|
|
[ -n "$(batch_peers "$batch")" ] || { echo "no such batch: $batch (A, B, C or D)" >&2; exit 2; }
|
|
for peer in $(batch_peers "$batch"); do
|
|
[ -f "$here/peers/$peer.sh" ] || { echo "batch $batch: no such peer: $peer" >&2; exit 2; }
|
|
done
|
|
for scenario in $(batch_scenarios "$batch"); do
|
|
[ -f "$here/scenarios/$scenario.sh" ] || { echo "batch $batch: no scenario for $scenario" >&2; exit 2; }
|
|
done
|
|
done
|
|
|
|
mkdir -p "$here/out"
|
|
summary=(); bad=0
|
|
for batch in "$@"; do
|
|
log="$here/out/sweep-$batch.log"
|
|
echo "== batch $batch: $(batch_peers "$batch")"
|
|
# shellcheck disable=SC2046
|
|
if ! "$here/run.sh" up $(batch_peers "$batch") 2>&1 | tee "$log"; then
|
|
summary+=("$batch the pasture did not start (out/sweep-$batch.log)"); bad=1
|
|
"$here/run.sh" down || true
|
|
continue
|
|
fi
|
|
# shellcheck disable=SC2046
|
|
"$here/interop.sh" $(batch_scenarios "$batch") 2>&1 | tee -a "$log"
|
|
status=${PIPESTATUS[0]}
|
|
"$here/run.sh" down || true
|
|
passed=$(grep -c '^ ok ' "$log"); failed=$(grep -c '^ FAIL ' "$log"); xfailed=$(grep -c '^ xf ' "$log")
|
|
line="$batch ok $passed ko $failed xf $xfailed ($(batch_scenarios "$batch"))"
|
|
if ! grep -qE '^[0-9]+ passed, [0-9]+ failed, [0-9]+ expected failures$' "$log"; then
|
|
line="$line stopped before its end (exit $status)"; bad=1
|
|
fi
|
|
[ "$failed" = 0 ] || bad=1
|
|
summary+=("$line")
|
|
done
|
|
|
|
echo; echo "sweep:"
|
|
printf ' %s\n' "${summary[@]}"
|
|
[ "$bad" = 0 ]
|