Annotation of embedaddon/rsync/testsuite/xattrs.test, revision 1.1.1.3

1.1       misho       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: 
1.1.1.2   misho       8: . $suitedir/rsync.fns
1.1       misho       9: lnkdir="$tmpdir/lnk"
                     10: 
1.1.1.3 ! misho      11: $RSYNC --version | grep "[, ] xattrs" >/dev/null || test_skipped "Rsync is configured without xattr support"
1.1       misho      12: 
1.1.1.2   misho      13: case "$HOST_OS" in
                     14: darwin*)
1.1       misho      15:     xset() {
                     16:        xnam="$1"
                     17:        xval="$2"
                     18:        shift 2
                     19:        xattr -s "$xnam" "$xval" "${@}"
                     20:     }
                     21:     xls() {
                     22:        xattr -l "${@}" | sed "s/^[ $tab_ch]*//"
                     23:     }
                     24:     RSYNC_PREFIX='rsync'
                     25:     RUSR='rsync.nonuser'
                     26:     ;;
1.1.1.2   misho      27: solaris*)
                     28:     xset() {
                     29:        xnam="$1"
                     30:        xval="$2"
                     31:        shift 2
                     32:        for fn in "${@}"; do
                     33:            runat "$fn" "$SHELL_PATH" <<EOF
                     34: echo "${xval}" > "${xnam}"
                     35: EOF
                     36:        done
                     37:     }
                     38:     xls() {
                     39:        for fn in "${@}"; do
                     40:            runat "$fn" "$SHELL_PATH" <<EOF
                     41: for x in *; do echo "\$x=\`cat \$x\`"; done
                     42: EOF
                     43:        done
                     44:     }
                     45:     RSYNC_PREFIX='rsync'
                     46:     RUSR='rsync.nonuser'
                     47:     ;;
1.1.1.3 ! misho      48: freebsd*)
        !            49:     xset() {
        !            50:        xnam="$1"
        !            51:        xval="$2"
        !            52:        shift 2
        !            53:        setextattr -h user "$xnam" "$xval" "${@}"
        !            54:     }
        !            55:     xls() {
        !            56:        for f in "${@}"; do lsextattr -q -h user "$f" | tr '[[:space:]]' '\n' | sort | xargs -I % getextattr -h user % "$f"; done
        !            57:     }
        !            58:     RSYNC_PREFIX='rsync'
        !            59:     RUSR='rsync'
        !            60:     ;;
1.1       misho      61: *)
                     62:     xset() {
                     63:        xnam="$1"
                     64:        xval="$2"
                     65:        shift 2
                     66:        setfattr -n "$xnam" -v "$xval" "${@}"
                     67:     }
                     68:     xls() {
                     69:        getfattr -d "${@}"
                     70:     }
                     71:     RSYNC_PREFIX='user.rsync'
                     72:     RUSR='user.rsync'
                     73:     ;;
                     74: esac
                     75: 
                     76: makepath "$lnkdir" "$fromdir/foo/bar"
                     77: echo now >"$fromdir/file0"
                     78: echo something >"$fromdir/file1"
                     79: echo else >"$fromdir/file2"
                     80: echo deep >"$fromdir/foo/file3"
                     81: echo normal >"$fromdir/file4"
                     82: echo deeper >"$fromdir/foo/bar/file5"
                     83: 
                     84: makepath "$chkdir/foo"
                     85: echo wow >"$chkdir/file1"
                     86: cp_touch "$fromdir/foo/file3" "$chkdir/foo"
                     87: 
                     88: dirs='foo foo/bar'
                     89: files='file0 file1 file2 foo/file3 file4 foo/bar/file5'
                     90: 
                     91: uid_gid=`"$TOOLDIR/tls" "$fromdir/foo" | sed 's/^.* \([0-9][0-9]*\)\.\([0-9][0-9]*\) .*/\1:\2/'`
                     92: 
                     93: cd "$fromdir"
                     94: 
                     95: xset user.foo foo file0 2>/dev/null || test_skipped "Unable to set an xattr"
                     96: xset user.bar bar file0
                     97: 
                     98: xset user.short 'this is short' file1
                     99: xset user.long 'this is a long attribute that will be truncated in the initial data send' file1
                    100: xset user.good 'this is good' file1
                    101: xset user.nice 'this is nice' file1
                    102: 
                    103: xset user.foo foo file2
                    104: xset user.bar bar file2
                    105: xset user.long 'a long attribute for our new file that tests to ensure that this works' file2
                    106: 
                    107: xset user.dir1 'need to test directory xattrs too' foo
                    108: xset user.dir2 'another xattr' foo
                    109: xset user.dir3 'this is one last one for the moment' foo
                    110: 
                    111: xset user.dir4 'another dir test' foo/bar
                    112: xset user.dir5 'one last one' foo/bar
                    113: 
                    114: xset user.foo 'new foo' foo/file3 foo/bar/file5
                    115: xset user.bar 'new bar' foo/file3 foo/bar/file5
                    116: xset user.long 'this is also a long attribute that will be truncated in the initial data send' foo/file3 foo/bar/file5
                    117: xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' foo/file3 foo/bar/file5
                    118: 
                    119: xset user.dir0 'old extra value' "$chkdir/foo"
                    120: xset user.dir1 'old dir value' "$chkdir/foo"
                    121: 
                    122: xset user.short 'old short' "$chkdir/file1"
                    123: xset user.extra 'remove me' "$chkdir/file1"
                    124: 
                    125: xset user.foo 'old foo' "$chkdir/foo/file3"
                    126: xset $RUSR.equal 'this long attribute should remain the same and not need to be transferred' "$chkdir/foo/file3"
                    127: 
                    128: case $0 in
                    129: *hlink*)
                    130:     ln foo/bar/file5 foo/bar/file6 || test_skipped "Can't create hardlink"
                    131:     files="$files foo/bar/file6"
                    132:     dashH='-H'
                    133:     altDest='--link-dest'
                    134:     ;;
                    135: *)
                    136:     dashH=''
                    137:     altDest='--copy-dest'
                    138:     ;;
                    139: esac
                    140: 
                    141: xls $dirs $files >"$scratchdir/xattrs.txt"
                    142: 
1.1.1.3 ! misho     143: XFILT='-f-x_system.* -f-x_security.*'
        !           144: 
1.1       misho     145: # OK, let's try a simple xattr copy.
1.1.1.3 ! misho     146: checkit "$RSYNC -avX $XFILT $dashH --super . '$chkdir/'" "$fromdir" "$chkdir"
1.1       misho     147: 
                    148: cd "$chkdir"
                    149: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
                    150: 
                    151: cd "$fromdir"
                    152: 
                    153: if [ "$dashH" ]; then
                    154:     for fn in $files; do
                    155:        name=`basename $fn`
                    156:        ln $fn ../lnk/$name
                    157:     done
                    158: fi
                    159: 
1.1.1.3 ! misho     160: checkit "$RSYNC -aiX $XFILT $dashH --super $altDest=../chk . ../to" "$fromdir" "$todir"
1.1       misho     161: 
                    162: cd "$todir"
                    163: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
                    164: 
                    165: [ "$dashH" ] && rm -rf "$lnkdir"
                    166: 
                    167: cd "$fromdir"
                    168: rm -rf "$todir"
                    169: 
                    170: xset user.nice 'this is nice, but different' file1
                    171: 
                    172: xls $dirs $files >"$scratchdir/xattrs.txt"
                    173: 
1.1.1.3 ! misho     174: checkit "$RSYNC -aiX $XFILT $dashH --fake-super --link-dest=../chk . ../to" "$chkdir" "$todir"
1.1       misho     175: 
                    176: cd "$todir"
                    177: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
                    178: 
1.1.1.3 ! misho     179: sed -n -e '/^[^d ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *1 /p' "$scratchdir/ls-to" >"$scratchdir/ls-diff-all"
1.1       misho     180: fgrep -v './file1' "$scratchdir/ls-diff-all" >"$scratchdir/ls-diff" || :
                    181: if [ -s "$scratchdir/ls-diff" ]; then
                    182:     echo "Missing hard links on:"
                    183:     cat "$scratchdir/ls-diff"
                    184:     exit 1
                    185: fi
                    186: if [ ! -s "$scratchdir/ls-diff-all" ]; then
                    187:     echo "Too many hard links on file1!"
                    188:     exit 1
                    189: fi
                    190: 
                    191: cd "$chkdir"
                    192: chmod go-rwx . $dirs $files
                    193: 
                    194: xset user.nice 'this is nice, but different' file1
                    195: xset $RSYNC_PREFIX.%stat "40000 0,0 $uid_gid" $dirs
                    196: xset $RSYNC_PREFIX.%stat "100000 0,0 $uid_gid" $files
                    197: 
                    198: xls $dirs $files >"$scratchdir/xattrs.txt"
                    199: 
                    200: cd "$fromdir"
                    201: rm -rf "$todir"
                    202: 
                    203: # When run by a non-root tester, this checks if no-user-perm files/dirs can be copied.
1.1.1.3 ! misho     204: checkit "$RSYNC -aiX $XFILT $dashH --fake-super --chmod=a= . ../to" "$chkdir" "$todir" # 2>"$scratchdir/errors.txt"
1.1       misho     205: 
                    206: cd "$todir"
                    207: xls $dirs $files | diff $diffopt "$scratchdir/xattrs.txt" -
                    208: 
                    209: cd "$fromdir"
                    210: rm -rf "$todir" "$chkdir"
                    211: 
                    212: $RSYNC -aX file1 file2
                    213: $RSYNC -aX file1 file2 ../chk/
                    214: $RSYNC -aX --del ../chk/ .
                    215: $RSYNC -aX file1 ../lnk/
                    216: [ "$dashH" ] && ln "$chkdir/file1" ../lnk/extra-link
                    217: 
                    218: xls file1 file2 >"$scratchdir/xattrs.txt"
                    219: 
1.1.1.3 ! misho     220: checkit "$RSYNC -aiiX $XFILT $dashH $altDest=../lnk . ../to" "$chkdir" "$todir"
1.1       misho     221: 
                    222: [ "$dashH" ] && rm ../lnk/extra-link
                    223: 
                    224: cd "$todir"
                    225: xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
                    226: 
                    227: cd "$fromdir"
                    228: rm "$todir/file2"
                    229: 
                    230: echo extra >file1
                    231: $RSYNC -aX . ../chk/
                    232: 
1.1.1.3 ! misho     233: checkit "$RSYNC -aiiX $XFILT . ../to" "$chkdir" "$todir"
1.1       misho     234: 
                    235: cd "$todir"
                    236: xls file1 file2 | diff $diffopt "$scratchdir/xattrs.txt" -
                    237: 
                    238: # The script would have aborted on error, so getting here means we've won.
                    239: exit 0

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>