mirror of
https://github.com/xroche/httrack.git
synced 2026-07-28 11:32:48 +03:00
Under `set -e` a failing command in an EXIT trap becomes the script's exit status, so a hiccup while tearing down fixtures fails a test whose assertions all passed. That is what turned `57_local-proxy-connect.test` red on the Windows x64 leg of #765: five OK lines, no FAIL, exit 1. Every EXIT trap in the suite now runs teardown with errexit off, and the signal traps keep their own `trap` line, since sharing `set +e` with HUP/INT/QUIT/PIPE/TERM would leave errexit off for the rest of a signalled run and let a torn-down test still report success. A `|| true` on the `rm` would have been smaller, but it throws away the only diagnostic, and the evidence does not say which teardown command failed: a blocked `rm -rf` on the Windows runner exits 1 and prints "Device or resource busy", while the log shows exit 1 and nothing at all. The sharing violation in the issue is the plausible mechanism rather than a confirmed one, so whatever it really is now prints its own error. `99_teardown-status.test` pins the semantics both ways and scans the suite so a new test cannot reintroduce the shape, the leaky combined trap included. The `return 0` that three `cleanup()` bodies ended with never protected anything, since errexit fires at the failing command before it is reached. Closes #773 Signed-off-by: Xavier Roche <roche@httrack.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
1.9 KiB
Bash
Executable File
63 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
|
|
# Update path: re-mirroring a site reads the cache (cache_readex) to decide what
|
|
# is up to date -- a path the one-shot crawl tests never exercise. Offline
|
|
# (file://), so it always runs.
|
|
#
|
|
# 1. mirror, then re-mirror unchanged -> the cache-read pass must complete clean
|
|
# (guards against a crash/abort/error in cache_readex).
|
|
# 2. change a source file, re-mirror -> the update must pick up the new content
|
|
# (guards the update decision that reads the cached metadata).
|
|
|
|
set -euo pipefail
|
|
|
|
site=$(mktemp -d)
|
|
out=$(mktemp -d)
|
|
trap 'set +e; rm -rf "$site" "$out"' EXIT
|
|
|
|
cat >"$site/index.html" <<EOF
|
|
<a href="a.html">a</a> <a href="sub/b.html">b</a>
|
|
EOF
|
|
echo 'OLDCONTENT' >"$site/a.html"
|
|
mkdir -p "$site/sub"
|
|
echo '<p>bbb</p>' >"$site/sub/b.html"
|
|
|
|
url="file://$site/index.html"
|
|
|
|
# count Error: lines in the log (grep -c exits 1 on zero matches: guard it)
|
|
errors() { grep -ciE '^[0-9:]*[[:space:]]Error:' "$out/hts-log.txt" || true; }
|
|
|
|
# 1. fresh mirror writes the cache
|
|
httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1
|
|
test -e "$out/hts-cache/new.zip" || {
|
|
echo "no cache was written" >&2
|
|
exit 1
|
|
}
|
|
|
|
# 2. re-mirror unchanged: the update reads the cache and must complete cleanly
|
|
httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1
|
|
test "$(errors)" = 0 || {
|
|
echo "update (unchanged) reported errors" >&2
|
|
exit 1
|
|
}
|
|
for suffix in a.html sub/b.html; do
|
|
test -n "$(find "$out" -path "*/$suffix" -print -quit)" || {
|
|
echo "missing $suffix after update" >&2
|
|
exit 1
|
|
}
|
|
done
|
|
|
|
# 3. change a source file: the update must pick up the new content
|
|
sleep 1
|
|
echo 'NEWCONTENT' >"$site/a.html"
|
|
httrack "$url" -O "$out" -q -%v0 -r3 >/dev/null 2>&1
|
|
test "$(errors)" = 0 || {
|
|
echo "update (changed) reported errors" >&2
|
|
exit 1
|
|
}
|
|
grep -q NEWCONTENT "$(find "$out" -path '*/a.html')" || {
|
|
echo "update did not pick up the changed source" >&2
|
|
exit 1
|
|
}
|