Build / Build (push) Successful in 1m7s
Starts the completion program (docs/ROADMAP.md, "Owner decisions on finishing everything", 2026-10-17). - Dead code: the commented-out collAnon blocks (discussions, seeding, admin user lists, HTTP/3, the old signature middleware), the empty PrivaPubWorkersConfiguration, PublicAvatarUsersService and UserPolicyType, unused helpers, the second IPasswordHasher registration, the PasswordGenerator package, SignUpAsync/LoginAsync's unused invitation parameters. "Starting PrivaPub"; a signed-in login is sent to "/", not to "/discussions". - Stored fields nothing read: RootUser.Contacts and ResetPasswordToken*, the local Avatar.AvatarServer, EmailRecovery.RecoveryCode/RequestIP/CreationDate, MongoSettings.LogsDatabase, and AppConfiguration's upload/discussion keys, RequiresFirstTimeSetup and Version (old documents still load: MongoDB.Entities ignores extra elements). DmPost's indexes are no longer made. 49 collAnon keys leave FieldsNameResource in every language. - /clientapi/data/current-version answers the build's ref. UsersIds is a list that can't throw, and the admin routes leave the administrator out without mutating the request. - deploy.yml checks SecureMode on a name no persona can have, and the browser redirect on the directory's first local persona: @thepra is the administrator's own now. - Town: decePub's e2e remnants (expect, client.jsonl, the decePub column) and town/tests go; the dead gaps/load commands too. Mobilizon no longer keeps an event for a deleted test. - tools/pasture/sweep.sh runs every peer's scenario, batch by batch, as CLAUDE.md asks before a change to what PrivaPub sends. - Docs: CLAUDE.md's repo map, route table (every frozen route) and stale lines; ROADMAP's status (setup, v1.25.0, v1.26.0, the program C), the 2026-10-17 decisions, and dated notes where earlier text no longer holds; FEDERATION.md's FEP list (7888, f228, 7628, ae0c and 8967 supported) and the deploy's persona. Verified: dotnet build PrivaPub.sln -c Release (0 errors, no new warnings); bash -n on the touched scripts; py_compile on the town; the pasture's gts, mastodon and lemmy scenarios on this build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WpVCoDeM1qUTRp4fXQdfof
73 lines
3.4 KiB
Bash
Executable File
73 lines
3.4 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 and aoderelay; scenarios: those five, threads followsync pins
|
|
# moves relay (relay's covers both relays)
|
|
# 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" ;;
|
|
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" ;;
|
|
*) 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 ]
|