export: stop an unanchored exclude from eating a plugin

The publication rsync excluded 'tools' to keep the repo-root tools/ dir
off GitHub. rsync patterns without a leading slash match at any depth, so
naming a plugin 'tools' meant plugins/tools/ was dropped too. It was
committed, exported, bundled and deployed, and the first sign of trouble
was `plugin install tools` on the server failing on a manifest.json that
had never been shipped.

The root-intended excludes are anchored, and the sync now verifies that
every plugins/*/manifest.json in the working tree came out the other side.
A silent omission of a whole plugin should not be something a deploy
discovers for us.
This commit is contained in:
cproudlock
2026-08-12 12:13:23 -04:00
parent a64796f060
commit 457349d258

View File

@@ -50,9 +50,9 @@ done
rsync -a --delete \
--exclude '.git' \
--exclude '.gitea' \
--exclude 'docs' \
--exclude 'tools' \
--exclude 'mcp' \
--exclude '/docs' \
--exclude '/tools' \
--exclude '/mcp' \
--exclude 'start-api.sh' \
--exclude 'start-ui.sh' \
--exclude 'CLAUDE.md' \
@@ -69,7 +69,7 @@ rsync -a --delete \
--exclude 'frontend/dist*' \
--exclude 'frontend/src/.plugins-staged' \
--exclude 'frontend/src/router/routes.gen.js' \
--exclude 'instance' \
--exclude '/instance' \
--exclude '.env' \
--exclude '__pycache__' \
--exclude '.pytest_cache' \
@@ -80,6 +80,26 @@ rsync -a --delete \
--exclude 'scripts/site_imports/wjf/idmap.json' \
"$WORK/" "$PUB/"
# --- 1b. every bundled plugin must have survived the sync ---
#
# The excludes above are rsync patterns, and a pattern with no leading slash
# matches at ANY depth. 'tools' was meant to drop the repo-root tools/ dir (this
# script lives in it) and silently dropped plugins/tools/ as well, so a plugin
# was committed, exported, bundled and deployed without ever being in the
# payload - the failure only surfaced as a missing manifest.json on the server.
# The excludes are anchored now; this check is what makes a recurrence loud.
missing=""
for manifest in "$WORK"/plugins/*/manifest.json; do
[ -e "$manifest" ] || continue
plugin=$(basename "$(dirname "$manifest")")
[ -f "$PUB/plugins/$plugin/manifest.json" ] || missing="$missing $plugin"
done
if [ -n "$missing" ]; then
echo "ERROR: bundled plugin(s) missing from the publication tree:$missing" >&2
echo " an rsync --exclude above is matching them; anchor it with a leading slash." >&2
exit 1
fi
cd "$PUB"
# --- 2. re-apply the publication wording (idempotent) ---