The improved --xattrs option is landing on the trunk.
[rsync/rsync.git] / testsuite / xattrs.test
... / ...
CommitLineData
1#! /bin/sh
2
3# This program is distributable under the terms of the GNU GPL (see
4# COPYING).
5
6# Test that rsync handles basic xattr preservation.
7
8. $srcdir/testsuite/rsync.fns
9
10$RSYNC --version | grep ", xattrs" >/dev/null || test_skipped "Rsync is configured without xattr support"
11
12case "$RSYNC" in
13*protocol=29*) test_skipped "xattr support requires protocol 30" ;;
14esac
15
16case "`xattr 2>&1`" in
17*--list:*)
18 xset() {
19 xnam="$1"
20 xval="$2"
21 shift 2
22 xattr -s "$xnam" "$xval" "${@}"
23 }
24 xls() {
25 xattr -l "${@}"
26 }
27 ;;
28*)
29 xset() {
30 xnam="$1"
31 xval="$2"
32 shift 2
33 setfattr -n "$xnam" -v "$xval" "${@}"
34 }
35 xls() {
36 getfattr -d "${@}"
37 }
38 ;;
39esac
40
41makepath "$fromdir/foo"
42echo now >"$fromdir/file0"
43echo something >"$fromdir/file1"
44echo else >"$fromdir/file2"
45echo deep >"$fromdir/foo/file3"
46echo normal >"$fromdir/file4"
47
48makepath "$chkdir/foo"
49echo wow >"$chkdir/file1"
50cp -p "$fromdir/foo/file3" "$chkdir/foo"
51
52files='foo file0 file1 file2 foo/file3 file4'
53
54cd "$fromdir"
55
56xset user.foo foo file0 2>/dev/null || test_skipped "Unable to set an xattr"
57xset user.bar bar file0
58
59xset user.short 'this is short' file1
60xset user.long 'this is a long attribute that will be truncated in the initial data send' file1
61xset user.good 'this is good' file1
62xset user.nice 'this is nice' file1
63
64xset user.foo foo file2
65xset user.bar bar file2
66xset user.long 'a long attribute for our new file that tests to ensure that this works' file2
67
68xset user.foo 'new foo' foo/file3
69xset user.bar 'new bar' foo/file3
70xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3
71xset user.equal 'this long attribute should remain the same and not need to be transferred' foo/file3
72
73xset user.short 'old short' "$chkdir/file1"
74xset user.extra 'remove me' "$chkdir/file1"
75
76xset user.foo 'old foo' "$chkdir/foo/file3"
77xset user.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3"
78
79xls $files >"$scratchdir/xattrs.txt"
80
81# OK, let's try a simple xattr copy.
82checkit "$RSYNC -avX . \"$chkdir/\"" "$fromdir" "$chkdir"
83
84cd "$chkdir"
85xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
86
87cd "$fromdir"
88
89checkit "$RSYNC -aiX --copy-dest=../chk . ../to" "$fromdir" "$todir"
90
91cd "$todir"
92xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
93
94cd "$fromdir"
95xset user.nice 'this is nice, but different' file1
96
97xls $files >"$scratchdir/xattrs.txt"
98
99rm -rf "$todir"
100
101checkit "$RSYNC -aiX --link-dest=../chk . ../to" "$chkdir" "$todir"
102
103cd "$todir"
104xls $files | diff $diffopt "$scratchdir/xattrs.txt" -
105
106# The script would have aborted on error, so getting here means we've won.
107exit 0