bup() { "$top/bup" "$@"; }
compare-trees() { "$top/t/compare-trees" "$@"; }
+data-size() { "$top/t/data-size" "$@"; }
WVPASS cd "$tmpdir"
WVPASS bup init
WVSTART "gc (removed branch)"
-size_before=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
WVPASS rm "$BUP_DIR/refs/heads/src-2"
WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS [ "$size_before" -gt 5000 ]
-WVPASS [ "$size_after" -lt 500 ]
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 50000 ]
WVPASS rm -r "$tmpdir/restore"
WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
WVPASS bup index src-ab
WVPASS bup save -vvv --strip -n a src-ab/a
-size_before=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
WVPASS rm "$BUP_DIR/refs/heads/src-ab"
WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS [ "$size_before" -gt 5000 ]
-WVPASS [ "$size_after" -lt 500 ]
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
WVPASS rm -r "$tmpdir/restore"
WVPASS bup restore -C "$tmpdir/restore" /a/latest
WVPASS bup index src-ab
WVPASS bup save -r :bup-remote -vvv --strip -n a src-ab/a
-size_before=$(WVPASS du -k -s bup-remote | WVPASS cut -f1) || exit $?
+size_before=$(WVPASS data-size bup-remote) || exit $?
WVPASS rm bup-remote/refs/heads/src-ab
WVPASS bup -d bup-remote gc $GC_OPTS -v
-size_after=$(WVPASS du -k -s bup-remote | WVPASS cut -f1) || exit $?
+size_after=$(WVPASS data-size bup-remote) || exit $?
-WVPASS [ "$size_before" -gt 5000 ]
-WVPASS [ "$size_after" -lt 500 ]
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
WVPASS rm -rf "$tmpdir/restore"
WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /a/latest
WVPASS bup on - index src-ab
WVPASS bup on - save -vvv --strip -n a src-ab/a
-size_before=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
WVPASS rm "$BUP_DIR/refs/heads/src-ab"
WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS du -k -s "$BUP_DIR" | WVPASS cut -f1) || exit $?
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS [ "$size_before" -gt 5000 ]
-WVPASS [ "$size_after" -lt 500 ]
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
WVPASS rm -r "$tmpdir/restore"
WVPASS bup restore -C "$tmpdir/restore" /a/latest
WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
+WVSTART "gc (threshold)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+WVPASS rm src/0
+WVPASS bup index src
+WVPASS bup save -n src-2 src
+
+WVPASS bup rm --unsafe src-1
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 99 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 0 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
+WVPASS bup gc -v $GC_OPTS --threshold 1 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+
+# Check that only one pack was rewritten
+
+# Accommodate some systems that apparently used to change the default
+# ls sort order which must match LC_COLLATE for comm to work.
+packs_before="$(sort <(echo "$packs_before"))" || die $?
+packs_after="$(sort <(echo "$packs_after"))" || die $?
+
+only_in_before="$(comm -2 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+ || die $?
+
+only_in_after="$(comm -1 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+ || die $?
+
+in_both="$(comm -1 -2 <(echo "$packs_before") <(echo "$packs_after"))" || die $?
+
+WVPASSEQ 1 $(echo "$only_in_before" | wc -l)
+WVPASSEQ 1 $(echo "$only_in_after" | wc -l)
+WVPASSEQ 1 $(echo "$in_both" | wc -l)
+
+WVSTART "gc (threshold 0)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 0 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+# Check that the pack was rewritten, but not removed (since the
+# result-pack is equal to the source pack)
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
WVPASS rm -rf "$tmpdir"