Add current-filesystem which reports the current filesystem type, and
path-filesystems which reports all the filesystems back up to the
root, and use the latter to skip the "save --strip-path (no match)"
test whenever all the filesystems involved aren't the same type.
This issue was discovered while testing on
/some/ext4/tree/containing/a/btrfs/tree. When the test indexes/saves,
it picks up the metadata for the parents above the btrfs, which may
have (for example) linux +e attrs. Then when it tries to restore the
tree fully within the btrfs, the restore defers an error when it tries
to restore the +e, which isn't valid for btrfs.
Normally we can avoid this problem via --strip, but this particular
test is actually checking the behavior when --strip doesn't apply.
Signed-off-by: Rob Browning <rlb@defaultvalue.org>
-# Assumes shell is Bash.
+# Assumes shell is Bash, and pipefail is set.
force-delete()
{
"import sys, bup.helpers; print bup.helpers.realpath(sys.stdin.readline())" \
|| return $?
}
+
+current-filesystem()
+{
+ df -T . | awk 'END{print $2}'
+}
+
+path-filesystems()
+(
+ # Return filesystem for each dir from $1 to /.
+ # Perhaps for /foo/bar, "ext4\next4\nbtrfs\n".
+ test "$#" -eq 1 || exit $?
+ cd "$1" || exit $?
+ current-filesystem || exit $?
+ dir="$(pwd)" || exit $?
+ while test "$dir" != /; do
+ cd .. || exit $?
+ dir="$(pwd)" || exit $?
+ current-filesystem || exit $?
+ done
+ exit 0
+)
WVSTART "save --strip-path (no match)"
(
+ if test $(WVPASS path-filesystems . | WVPASS sort -u | WVPASS wc -l) -ne 1
+ then
+ # Skip the test because the attempt to restore parent dirs to
+ # the current filesystem may fail -- i.e. running from
+ # /foo/ext4/bar/btrfs will fail when bup tries to restore
+ # linux attrs above btrfs to the restore tree *inside* btrfs.
+ echo "(running from tree with mixed filesystems; skipping test)" 1>&2
+ exit 0
+ fi
+
tmp=graft-points.tmp
WVPASS force-delete $tmp
WVPASS mkdir $tmp