aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/sync-check.sh28
-rw-r--r--scripts/tests/sync-check.bats30
2 files changed, 54 insertions, 4 deletions
diff --git a/scripts/sync-check.sh b/scripts/sync-check.sh
index 8fb9ab0..cc7bc62 100755
--- a/scripts/sync-check.sh
+++ b/scripts/sync-check.sh
@@ -35,12 +35,23 @@ fi
paths=(protocols.org workflows scripts)
+# Generated artifacts that should never count as drift. These appear on the
+# mirror side when tests run (pytest writes .pyc and .pytest_cache; emacs
+# writes .elc) but aren't part of the canonical source.
+exclude_args=(
+ --exclude='__pycache__'
+ --exclude='*.pyc'
+ --exclude='*.pyo'
+ --exclude='.pytest_cache'
+ --exclude='*.elc'
+)
+
check_drift() {
local drift=0
for relpath in "${paths[@]}"; do
- if ! diff -rq "$canonical/$relpath" "$mirror/$relpath" >/dev/null 2>&1; then
+ if ! diff -rq "${exclude_args[@]}" "$canonical/$relpath" "$mirror/$relpath" >/dev/null 2>&1; then
echo "drift: claude-templates/.ai/$relpath ↔ .ai/$relpath" >&2
- diff -rq "$canonical/$relpath" "$mirror/$relpath" 2>&1 | head -20 >&2
+ diff -rq "${exclude_args[@]}" "$canonical/$relpath" "$mirror/$relpath" 2>&1 | head -20 >&2
drift=1
fi
done
@@ -54,9 +65,18 @@ fi
if [ "${1:-}" = "--fix" ]; then
echo "" >&2
echo "sync-check --fix: syncing canonical → mirror..." >&2
+ # Same exclude patterns as the diff so generated files in the mirror
+ # aren't wiped by --delete when canonical has no counterpart.
+ rsync_excludes=(
+ --exclude='__pycache__'
+ --exclude='*.pyc'
+ --exclude='*.pyo'
+ --exclude='.pytest_cache'
+ --exclude='*.elc'
+ )
rsync -a "$canonical/protocols.org" "$mirror/protocols.org"
- rsync -a --delete "$canonical/workflows/" "$mirror/workflows/"
- rsync -a --delete "$canonical/scripts/" "$mirror/scripts/"
+ rsync -a --delete "${rsync_excludes[@]}" "$canonical/workflows/" "$mirror/workflows/"
+ rsync -a --delete "${rsync_excludes[@]}" "$canonical/scripts/" "$mirror/scripts/"
if check_drift; then
echo "sync-check --fix: resolved." >&2
echo "Re-stage the synced files and retry the commit." >&2
diff --git a/scripts/tests/sync-check.bats b/scripts/tests/sync-check.bats
index df775b3..17c9189 100644
--- a/scripts/tests/sync-check.bats
+++ b/scripts/tests/sync-check.bats
@@ -84,3 +84,33 @@ setup() {
[ "$status" -eq 2 ]
[[ "$output" == *"not inside a git checkout"* ]]
}
+
+@test "generated Python artifacts in mirror don't count as drift" {
+ mkdir -p .ai/scripts/__pycache__
+ touch .ai/scripts/__pycache__/foo.cpython-314.pyc
+ touch .ai/scripts/some.pyc
+ run scripts/sync-check.sh
+ [ "$status" -eq 0 ]
+}
+
+@test "compiled elisp artifacts in mirror don't count as drift" {
+ touch .ai/scripts/foo.elc
+ run scripts/sync-check.sh
+ [ "$status" -eq 0 ]
+}
+
+@test "pytest cache in mirror doesn't count as drift" {
+ mkdir -p .ai/scripts/.pytest_cache
+ touch .ai/scripts/.pytest_cache/CACHEDIR.TAG
+ run scripts/sync-check.sh
+ [ "$status" -eq 0 ]
+}
+
+@test "--fix preserves generated artifacts in mirror" {
+ mkdir -p .ai/scripts/__pycache__
+ touch .ai/scripts/__pycache__/foo.cpython-314.pyc
+ echo "drift" > .ai/protocols.org
+ run scripts/sync-check.sh --fix
+ [ "$status" -eq 0 ]
+ [ -f .ai/scripts/__pycache__/foo.cpython-314.pyc ]
+}