mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-01-20 12:58:00 -05:00
144 lines
3.6 KiB
Bash
144 lines
3.6 KiB
Bash
#! /bin/sh
|
|
|
|
# This program is distributable under the terms of the GNU GPL (see
|
|
# COPYING).
|
|
|
|
# Test that rsync handles basic xattr preservation.
|
|
|
|
. $suitedir/rsync.fns
|
|
|
|
$RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync is configured without xattr support"
|
|
|
|
case "`xattr 2>&1`" in
|
|
*--list:*)
|
|
xset() {
|
|
xnam="$1"
|
|
xval="$2"
|
|
shift 2
|
|
xattr -s "$xnam" "$xval" "${@}"
|
|
}
|
|
xls() {
|
|
xattr -l "${@}"
|
|
}
|
|
RUSR='rsync.nonuser'
|
|
;;
|
|
*)
|
|
xset() {
|
|
xnam="$1"
|
|
xval="$2"
|
|
shift 2
|
|
setfattr -n "$xnam" -v "$xval" "${@}"
|
|
}
|
|
xls() {
|
|
getfattr -d "${@}"
|
|
}
|
|
RUSR='user.rsync'
|
|
;;
|
|
esac
|
|
|
|
makepath "$fromdir/foo/bar"
|
|
echo now >"$fromdir/file0"
|
|
echo something >"$fromdir/file1"
|
|
echo else >"$fromdir/file2"
|
|
echo deep >"$fromdir/foo/file3"
|
|
echo normal >"$fromdir/file4"
|
|
echo deeper >"$fromdir/foo/bar/file5"
|
|
|
|
makepath "$chkdir/foo"
|
|
echo wow >"$chkdir/file1"
|
|
cp_touch "$fromdir/foo/file3" "$chkdir/foo"
|
|
|
|
files='foo file0 file1 file2 foo/file3 file4 foo/bar/file5'
|
|
|
|
cd "$fromdir"
|
|
|
|
xset user.foo foo file0 2>/dev/null || test_skipped "Unable to set an xattr"
|
|
xset user.bar bar file0
|
|
|
|
xset user.short 'this is short' file1
|
|
xset user.long 'this is a long attribute that will be truncated in the initial data send' file1
|
|
xset user.good 'this is good' file1
|
|
xset user.nice 'this is nice' file1
|
|
|
|
xset user.foo foo file2
|
|
xset user.bar bar file2
|
|
xset user.long 'a long attribute for our new file that tests to ensure that this works' file2
|
|
|
|
xset user.dir1 'need to test directory xattrs too' foo
|
|
xset user.dir2 'another xattr' foo
|
|
xset user.dir3 'this is one last one for the moment' foo
|
|
|
|
xset user.foo 'new foo' foo/file3 foo/bar/file5
|
|
xset user.bar 'new bar' foo/file3 foo/bar/file5
|
|
xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3 foo/bar/file5
|
|
xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' foo/file3 foo/bar/file5
|
|
|
|
xset user.short 'old short' "$chkdir/file1"
|
|
xset user.extra 'remove me' "$chkdir/file1"
|
|
|
|
xset user.foo 'old foo' "$chkdir/foo/file3"
|
|
xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3"
|
|
|
|
xls $files >"$scratchdir/xattrs.txt"
|
|
|
|
# OK, let's try a simple xattr copy.
|
|
checkit "$RSYNC -avX --super . '$chkdir/'" "$fromdir" "$chkdir"
|
|
|
|
cd "$chkdir"
|
|
xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
|
|
|
|
cd "$fromdir"
|
|
|
|
checkit "$RSYNC -aiX --super --copy-dest=../chk . ../to" "$fromdir" "$todir"
|
|
|
|
cd "$todir"
|
|
xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
|
|
|
|
cd "$fromdir"
|
|
rm -rf "$todir"
|
|
|
|
xset user.nice 'this is nice, but different' file1
|
|
|
|
xls $files >"$scratchdir/xattrs.txt"
|
|
|
|
checkit "$RSYNC -aiX --fake-super --link-dest=../chk . ../to" "$chkdir" "$todir"
|
|
|
|
cd "$todir"
|
|
xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
|
|
|
|
sed -n -e '/\.\/file1$/d' -e '/^[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *1 /p' "$scratchdir/ls-to" >"$scratchdir/ls-diff"
|
|
if [ -s "$scratchdir/ls-diff" ]; then
|
|
echo "Missing hard links on:"
|
|
cat "$scratchdir/ls-diff"
|
|
exit 1
|
|
fi
|
|
|
|
cd "$fromdir"
|
|
rm -rf "$todir" "$chkdir"
|
|
|
|
$RSYNC -aX file1 file2
|
|
$RSYNC -aX file1 file2 ../chk/
|
|
$RSYNC -aX --del ../chk/ .
|
|
$RSYNC -aX file1 ../lnk/
|
|
|
|
xls file1 file2 >"$scratchdir/xattrs.txt"
|
|
|
|
checkit "$RSYNC -aiiX --copy-dest=../lnk . ../to" "$chkdir" "$todir"
|
|
|
|
cd "$todir"
|
|
xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
|
|
|
|
cd "$fromdir"
|
|
rm "$todir/file2"
|
|
|
|
echo extra >file1
|
|
$RSYNC -aX . ../chk/
|
|
|
|
checkit "$RSYNC -aiiX . ../to" "$chkdir" "$todir"
|
|
|
|
cd "$todir"
|
|
xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
|
|
|
|
# The script would have aborted on error, so getting here means we've won.
|
|
exit 0
|