#!/usr/bin/env bash . wvtest.sh . wvtest-bup.sh . t/lib.sh set -o pipefail top="$(WVPASS pwd)" || exit $? tmpdir="$(WVPASS wvmktempdir)" || exit $? export BUP_DIR="$tmpdir/bup" bup() { "$top/bup" "$@"; } validate-local-and-remote-restore() { local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4" force-delete "$dest" WVPASS bup restore -C "$dest" "$src" WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest" force-delete "$dest" WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src" WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest" } WVPASS cd "$tmpdir" WVSTART "init" WVPASS bup init D=bupdata.tmp WVPASS force-delete $D WVPASS mkdir $D WVPASS touch $D/a WVPASS bup random 128k >$D/b WVPASS mkdir $D/d $D/d/e WVPASS bup random 512 >$D/f WVPASS touch $D/d/z WVPASS touch $D/d/z WVPASS bup index $D WVPASS bup save -t $D WVSTART "restore" WVPASS force-delete buprestore.tmp WVFAIL bup restore boink WVPASS touch "$tmpdir/$D/$D" WVPASS bup index -u "$tmpdir/$D" WVPASS bup save -n master / WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D" WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp" WVPASS force-delete buprestore.tmp WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/" WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails WVPASS diff -ur $D/ buprestore.tmp/ WVPASS force-delete buprestore.tmp WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/ WVPASSEQ "$(cat buprestore.tmp/data)" "" ( tmp=testrestore.tmp WVPASS force-delete $tmp WVPASS mkdir $tmp export BUP_DIR="$(pwd)/$tmp/bup" WVPASS WVPASS bup init WVPASS mkdir -p $tmp/src/x/y/z WVPASS bup random 8k > $tmp/src/x/y/random-1 WVPASS bup random 8k > $tmp/src/x/y/z/random-2 WVPASS bup index -u $tmp/src WVPASS bup save --strip -n foo $tmp/src WVSTART "restore /foo/latest" validate-local-and-remote-restore \ /foo/latest "$tmp/restore" \ "$tmp/src/" "$tmp/restore/latest/" WVSTART "restore /foo/latest/." WVPASS force-delete "$tmp/restore" validate-local-and-remote-restore \ /foo/latest/. "$tmp"/restore \ "$tmp"/src/ "$tmp"/restore WVSTART "restore /foo/latest/x" WVPASS force-delete "$tmp/restore" validate-local-and-remote-restore \ /foo/latest/x "$tmp"/restore \ "$tmp"/src/x/ "$tmp"/restore/x/ WVSTART "restore /foo/latest/x/" WVPASS force-delete "$tmp/restore" WVPASS bup restore -C "$tmp"/restore /foo/latest/x/ for x in "$tmp"/src/x/*; do WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)" done WVPASS force-delete "$tmp/restore" WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/ for x in "$tmp"/src/x/*; do WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)" done WVSTART "restore /foo/latest/x/." WVPASS force-delete "$tmp/restore" validate-local-and-remote-restore \ /foo/latest/x/. "$tmp"/restore \ "$tmp"/src/x/ "$tmp"/restore/ ) || exit $? WVSTART "save (no index)" ( tmp=save-no-index.tmp WVPASS force-delete $tmp WVPASS mkdir $tmp export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $? WVPASS bup init WVFAIL bup save -n nothing / WVPASS rm -r "$tmp" ) || exit $? WVSTART "save disjoint top-level directories" ( # Resolve any symlinks involving the top top-level dirs. real_pwd="$(WVPASS resolve-parent .)" || exit $? real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $? pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $? tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $? if [ "$pwd_top" = "$tmp_top" ]; then echo "(running from within /$tmp_top; skipping test)" 1>&2 exit 0 fi D=bupdata.tmp WVPASS force-delete $D WVPASS mkdir -p $D/x WVPASS date > $D/x/1 tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $? cleanup() { WVPASS rm -r "$tmpdir2"; } WVPASS trap cleanup EXIT WVPASS date > "$tmpdir2/2" export BUP_DIR="$tmpdir/bup" WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR" WVPASS bup init WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2" WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2" # For now, assume that "ls -a" and "sort" use the same order. actual="$(WVPASS bup ls -AF src/latest)" || exit $? expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $? WVPASSEQ "$actual" "$expected" ) || exit $? WVPASS cd "$top" WVPASS rm -rf "$tmpdir"