Commit | Line | Data |
---|---|---|
16edf865 WD |
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 | ||
12 | case "$RSYNC" in | |
13 | *protocol=29*) test_skipped "xattr support requires protocol 30" ;; | |
14 | esac | |
15 | ||
16 | case "`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 | ;; | |
39 | esac | |
40 | ||
41 | makepath "$fromdir/foo" | |
42 | echo now >"$fromdir/file0" | |
43 | echo something >"$fromdir/file1" | |
44 | echo else >"$fromdir/file2" | |
45 | echo deep >"$fromdir/foo/file3" | |
46 | echo normal >"$fromdir/file4" | |
47 | ||
48 | makepath "$chkdir/foo" | |
49 | echo wow >"$chkdir/file1" | |
50 | cp -p "$fromdir/foo/file3" "$chkdir/foo" | |
51 | ||
52 | files='foo file0 file1 file2 foo/file3 file4' | |
53 | ||
54 | cd "$fromdir" | |
55 | ||
56 | xset user.foo foo file0 2>/dev/null || test_skipped "Unable to set an xattr" | |
57 | xset user.bar bar file0 | |
58 | ||
59 | xset user.short 'this is short' file1 | |
60 | xset user.long 'this is a long attribute that will be truncated in the initial data send' file1 | |
61 | xset user.good 'this is good' file1 | |
62 | xset user.nice 'this is nice' file1 | |
63 | ||
64 | xset user.foo foo file2 | |
65 | xset user.bar bar file2 | |
66 | xset user.long 'a long attribute for our new file that tests to ensure that this works' file2 | |
67 | ||
68 | xset user.foo 'new foo' foo/file3 | |
69 | xset user.bar 'new bar' foo/file3 | |
70 | xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3 | |
71 | xset user.equal 'this long attribute should remain the same and not need to be transferred' foo/file3 | |
72 | ||
73 | xset user.short 'old short' "$chkdir/file1" | |
74 | xset user.extra 'remove me' "$chkdir/file1" | |
75 | ||
76 | xset user.foo 'old foo' "$chkdir/foo/file3" | |
77 | xset user.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3" | |
78 | ||
79 | xls $files >"$scratchdir/xattrs.txt" | |
80 | ||
81 | # OK, let's try a simple xattr copy. | |
82 | checkit "$RSYNC -avX . \"$chkdir/\"" "$fromdir" "$chkdir" | |
83 | ||
84 | cd "$chkdir" | |
85 | xls $files | diff $diffopt "$scratchdir/xattrs.txt" - | |
86 | ||
87 | cd "$fromdir" | |
88 | ||
89 | checkit "$RSYNC -aiX --copy-dest=../chk . ../to" "$fromdir" "$todir" | |
90 | ||
91 | cd "$todir" | |
92 | xls $files | diff $diffopt "$scratchdir/xattrs.txt" - | |
93 | ||
94 | cd "$fromdir" | |
95 | xset user.nice 'this is nice, but different' file1 | |
96 | ||
97 | xls $files >"$scratchdir/xattrs.txt" | |
98 | ||
99 | rm -rf "$todir" | |
100 | ||
101 | checkit "$RSYNC -aiX --link-dest=../chk . ../to" "$chkdir" "$todir" | |
102 | ||
103 | cd "$todir" | |
104 | xls $files | diff $diffopt "$scratchdir/xattrs.txt" - | |
105 | ||
106 | # The script would have aborted on error, so getting here means we've won. | |
107 | exit 0 |