mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-05-14 19:41:16 +00:00
IgnoreRules (src/apps/cli/serviceModules/IgnoreRules.ts): - Reads .livesync/ignore for user-defined glob patterns - Applies gitignore matchBase semantics: patterns without / get **/ prefix, patterns ending with / get ** appended for directory contents - Supports `import: .gitignore` directive to merge gitignore patterns - Rejects negation patterns with a warning (not fully supportable) - Integrated into both daemon and mirror commands via isTargetFile handler Wiring: - IgnoreRules loaded before LiveSyncBaseCore construction so beginWatch() receives rules when it fires during onLoad/onFirstInitialise - Passed through initialiseServiceModulesCLI -> StorageEventManagerCLI -> CLIStorageEventManagerAdapter -> CLIWatchAdapter Deployment: - src/apps/cli/deploy/livesync-cli.service - systemd unit template - src/apps/cli/deploy/install.sh - user/system install script Testing: - src/apps/cli/test/test-daemon-linux.sh - e2e tests for ignore rules - src/apps/cli/serviceModules/IgnoreRules.unit.spec.ts - 15 unit tests - src/apps/cli/commands/daemonCommand.unit.spec.ts - 7 unit tests
167 lines
7.0 KiB
Bash
Executable File
167 lines
7.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Test: daemon-related ignore rules behaviour
|
|
#
|
|
# Tests that are runnable without a long-running daemon process are exercised
|
|
# here using the `mirror` command, which calls the same `isTargetFile` handler
|
|
# stack that the daemon uses.
|
|
#
|
|
# Covered cases:
|
|
# 1. .livesync/ignore with *.tmp pattern → ignored file is NOT synced to DB
|
|
# 2. .livesync/ignore missing → no error, normal sync continues
|
|
# 3. import: .gitignore directive → patterns from .gitignore are merged
|
|
#
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
CLI_DIR="$(cd -- "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$CLI_DIR"
|
|
source "$SCRIPT_DIR/test-helpers.sh"
|
|
display_test_info
|
|
|
|
RUN_BUILD="${RUN_BUILD:-1}"
|
|
cli_test_init_cli_cmd
|
|
|
|
WORK_DIR="$(mktemp -d "${TMPDIR:-/tmp}/livesync-cli-daemon-test.XXXXXX")"
|
|
trap 'rm -rf "$WORK_DIR"' EXIT
|
|
|
|
SETTINGS_FILE="$WORK_DIR/data.json"
|
|
VAULT_DIR="$WORK_DIR/vault"
|
|
mkdir -p "$VAULT_DIR/notes"
|
|
|
|
if [[ "$RUN_BUILD" == "1" ]]; then
|
|
echo "[INFO] building CLI..."
|
|
npm run build
|
|
fi
|
|
|
|
echo "[INFO] generating settings -> $SETTINGS_FILE"
|
|
cli_test_init_settings_file "$SETTINGS_FILE"
|
|
cli_test_mark_settings_configured "$SETTINGS_FILE"
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
assert_pass() { echo "[PASS] $1"; PASS=$((PASS + 1)); }
|
|
assert_fail() { echo "[FAIL] $1" >&2; FAIL=$((FAIL + 1)); }
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Case 1: .livesync/ignore with *.tmp → matched file should NOT appear in DB
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "=== Case 1: .livesync/ignore *.tmp → ignored file not synced to DB ==="
|
|
|
|
mkdir -p "$VAULT_DIR/.livesync"
|
|
printf '*.tmp\n' > "$VAULT_DIR/.livesync/ignore"
|
|
|
|
# Also write a normal file so we can confirm mirror ran at all.
|
|
printf 'normal content\n' > "$VAULT_DIR/notes/normal.md"
|
|
# Write the file that should be ignored.
|
|
printf 'tmp content\n' > "$VAULT_DIR/notes/scratch.tmp"
|
|
|
|
run_cli "$VAULT_DIR" --settings "$SETTINGS_FILE" mirror
|
|
|
|
# The normal file should be in the DB.
|
|
RESULT_NORMAL="$WORK_DIR/case1-normal.txt"
|
|
if run_cli "$VAULT_DIR" --settings "$SETTINGS_FILE" pull notes/normal.md "$RESULT_NORMAL" 2>/dev/null; then
|
|
if cmp -s "$VAULT_DIR/notes/normal.md" "$RESULT_NORMAL"; then
|
|
assert_pass "normal.md was synced to DB"
|
|
else
|
|
assert_fail "normal.md content mismatch after mirror"
|
|
fi
|
|
else
|
|
assert_fail "normal.md was not found in DB after mirror"
|
|
fi
|
|
|
|
# The .tmp file should NOT be in the DB.
|
|
DB_LIST="$WORK_DIR/case1-ls.txt"
|
|
run_cli "$VAULT_DIR" --settings "$SETTINGS_FILE" ls > "$DB_LIST"
|
|
if grep -q "scratch.tmp" "$DB_LIST"; then
|
|
assert_fail "scratch.tmp (ignored) was unexpectedly synced to DB"
|
|
echo "--- DB listing ---" >&2; cat "$DB_LIST" >&2
|
|
else
|
|
assert_pass "scratch.tmp (*.tmp pattern) was NOT synced to DB"
|
|
fi
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Case 2: .livesync/ignore absent → no error, normal sync continues
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "=== Case 2: .livesync/ignore absent → no error, sync continues ==="
|
|
|
|
VAULT_DIR2="$WORK_DIR/vault2"
|
|
mkdir -p "$VAULT_DIR2/notes"
|
|
SETTINGS_FILE2="$WORK_DIR/data2.json"
|
|
cli_test_init_settings_file "$SETTINGS_FILE2"
|
|
cli_test_mark_settings_configured "$SETTINGS_FILE2"
|
|
|
|
# No .livesync directory at all.
|
|
printf 'hello\n' > "$VAULT_DIR2/notes/hello.md"
|
|
|
|
# mirror should succeed without error.
|
|
set +e
|
|
MIRROR_OUTPUT="$WORK_DIR/case2-mirror.txt"
|
|
run_cli "$VAULT_DIR2" --settings "$SETTINGS_FILE2" mirror >"$MIRROR_OUTPUT" 2>&1
|
|
MIRROR_EXIT=$?
|
|
set -e
|
|
|
|
if [[ "$MIRROR_EXIT" -ne 0 ]]; then
|
|
assert_fail "mirror exited non-zero ($MIRROR_EXIT) when .livesync/ignore is absent"
|
|
cat "$MIRROR_OUTPUT" >&2
|
|
else
|
|
assert_pass "mirror succeeded when .livesync/ignore is absent"
|
|
fi
|
|
|
|
# The normal file should have been synced.
|
|
RESULT_HELLO="$WORK_DIR/case2-hello.txt"
|
|
if run_cli "$VAULT_DIR2" --settings "$SETTINGS_FILE2" pull notes/hello.md "$RESULT_HELLO" 2>/dev/null; then
|
|
assert_pass "file synced normally when .livesync/ignore is absent"
|
|
else
|
|
assert_fail "file was not synced when .livesync/ignore is absent"
|
|
fi
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Case 3: import: .gitignore merges patterns
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "=== Case 3: import: .gitignore directive merges patterns ==="
|
|
|
|
VAULT_DIR3="$WORK_DIR/vault3"
|
|
mkdir -p "$VAULT_DIR3/notes"
|
|
SETTINGS_FILE3="$WORK_DIR/data3.json"
|
|
cli_test_init_settings_file "$SETTINGS_FILE3"
|
|
cli_test_mark_settings_configured "$SETTINGS_FILE3"
|
|
|
|
mkdir -p "$VAULT_DIR3/.livesync"
|
|
printf 'import: .gitignore\n' > "$VAULT_DIR3/.livesync/ignore"
|
|
printf '# gitignore comment\n*.log\nbuild/\n' > "$VAULT_DIR3/.gitignore"
|
|
|
|
printf 'regular note\n' > "$VAULT_DIR3/notes/regular.md"
|
|
printf 'log content\n' > "$VAULT_DIR3/notes/debug.log"
|
|
|
|
run_cli "$VAULT_DIR3" --settings "$SETTINGS_FILE3" mirror
|
|
|
|
DB_LIST3="$WORK_DIR/case3-ls.txt"
|
|
run_cli "$VAULT_DIR3" --settings "$SETTINGS_FILE3" ls > "$DB_LIST3"
|
|
|
|
if grep -q "debug.log" "$DB_LIST3"; then
|
|
assert_fail "debug.log (ignored via .gitignore import) was unexpectedly synced to DB"
|
|
echo "--- DB listing ---" >&2; cat "$DB_LIST3" >&2
|
|
else
|
|
assert_pass "debug.log (*.log from imported .gitignore) was NOT synced to DB"
|
|
fi
|
|
|
|
# regular.md should still be present.
|
|
if grep -q "regular.md" "$DB_LIST3"; then
|
|
assert_pass "regular.md was synced normally alongside .gitignore import rules"
|
|
else
|
|
assert_fail "regular.md was NOT synced — .gitignore import may have been too broad"
|
|
fi
|
|
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
# Summary
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
echo ""
|
|
echo "Results: PASS=$PASS FAIL=$FAIL"
|
|
if [[ "$FAIL" -gt 0 ]]; then
|
|
exit 1
|
|
fi
|