mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-04-25 16:49:42 -04:00
of running its own test using ln. - Made the merge test call checkit with absolute paths so that some folk's cd command won't foul things up with extra output.
303 lines
7.5 KiB
Bash
303 lines
7.5 KiB
Bash
#! /bin/sh
|
|
|
|
# Copyright (C) 2005 by Wayne Davison <wayned@samba.org>
|
|
|
|
# This program is distributable under the terms of the GNU GPL (see
|
|
# COPYING).
|
|
|
|
# Test the output of various copy commands to ensure itemized output
|
|
# and double-verbose output is correct.
|
|
|
|
. "$suitedir/rsync.fns"
|
|
|
|
to2dir="$tmpdir/to2"
|
|
|
|
chkfile="$scratchdir/rsync.chk"
|
|
outfile="$scratchdir/rsync.out"
|
|
|
|
makepath "$fromdir/foo"
|
|
makepath "$fromdir/bar/baz"
|
|
cp -p "$srcdir/configure.in" "$fromdir/foo/config1"
|
|
cp -p "$srcdir/config.h.in" "$fromdir/foo/config2"
|
|
cp -p "$srcdir/rsync.h" "$fromdir/bar/baz/rsync"
|
|
chmod 600 "$fromdir"/foo/config? "$fromdir/bar/baz/rsync"
|
|
umask 0
|
|
ln -s ../bar/baz/rsync "$fromdir/foo/sym"
|
|
umask 022
|
|
ln "$fromdir/foo/config1" "$fromdir/foo/extra"
|
|
rm -f "$to2dir"
|
|
|
|
# Check if rsync is set to hard-link symlinks.
|
|
confile=`echo "$scratchdir" | sed 's;/testtmp/itemize$;/config.h;'`
|
|
if egrep '^#define CAN_HARDLINK_SYMLINK 1' "$confile" >/dev/null; then
|
|
L=hL
|
|
else
|
|
L=cL
|
|
fi
|
|
|
|
# Check if rsync can preserve time on symlinks
|
|
case "$RSYNC" in
|
|
*protocol=2*)
|
|
T=.T
|
|
;;
|
|
*)
|
|
if $RSYNC --version | grep ", symtimes" >/dev/null; then
|
|
T=.t
|
|
else
|
|
T=.T
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
$RSYNC -iplr "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
cat <<EOT >"$chkfile"
|
|
cd$all_plus ./
|
|
cd$all_plus bar/
|
|
cd$all_plus bar/baz/
|
|
>f$all_plus bar/baz/rsync
|
|
cd$all_plus foo/
|
|
>f$all_plus foo/config1
|
|
>f$all_plus foo/config2
|
|
>f$all_plus foo/extra
|
|
cL$all_plus foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 1 failed"
|
|
|
|
# Ensure there are no accidental directory-time problems.
|
|
$RSYNC -a -f '-! */' "$fromdir/" "$todir"
|
|
|
|
cp -p "$srcdir/configure.in" "$fromdir/foo/config2"
|
|
chmod 601 "$fromdir/foo/config2"
|
|
$RSYNC -iplrH "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
cat <<EOT >"$chkfile"
|
|
>f..T.$dots bar/baz/rsync
|
|
>f..T.$dots foo/config1
|
|
>f.sTp$dots foo/config2
|
|
hf..T.$dots foo/extra => foo/config1
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 2 failed"
|
|
|
|
$RSYNC -a -f '-! */' "$fromdir/" "$todir"
|
|
sleep 1 # For directory mod below to ensure time difference
|
|
rm "$todir/foo/sym"
|
|
umask 0
|
|
ln -s ../bar/baz "$todir/foo/sym"
|
|
umask 022
|
|
cp -p "$srcdir/config.h.in" "$fromdir/foo/config2"
|
|
chmod 600 "$fromdir/foo/config2"
|
|
chmod 777 "$todir/bar/baz/rsync"
|
|
|
|
$RSYNC -iplrtc "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
cat <<EOT >"$chkfile"
|
|
.f..tp$dots bar/baz/rsync
|
|
.d..t.$dots foo/
|
|
.f..t.$dots foo/config1
|
|
>fcstp$dots foo/config2
|
|
cL.$T.$dots foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 3 failed"
|
|
|
|
cp -p "$srcdir/configure.in" "$fromdir/foo/config2"
|
|
chmod 600 "$fromdir/foo/config2"
|
|
# Lack of -t is for unchanged hard-link stress-test!
|
|
$RSYNC -vvplrH "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
bar/baz/rsync is uptodate
|
|
foo/config1 is uptodate
|
|
foo/config2
|
|
foo/extra is uptodate
|
|
foo/sym is uptodate
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 4 failed"
|
|
|
|
chmod 747 "$todir/bar/baz/rsync"
|
|
$RSYNC -a -f '-! */' "$fromdir/" "$todir"
|
|
$RSYNC -ivvplrtH "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
.d$allspace ./
|
|
.d$allspace bar/
|
|
.d$allspace bar/baz/
|
|
.f...p$dots bar/baz/rsync
|
|
.d$allspace foo/
|
|
.f$allspace foo/config1
|
|
>f..t.$dots foo/config2
|
|
hf$allspace foo/extra
|
|
.L$allspace foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 5 failed"
|
|
|
|
chmod 757 "$todir/foo/config1"
|
|
touch "$todir/foo/config2"
|
|
$RSYNC -vplrtH "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
foo/config2
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 6 failed"
|
|
|
|
chmod 757 "$todir/foo/config1"
|
|
touch "$todir/foo/config2"
|
|
$RSYNC -iplrtH "$fromdir/" "$todir/" \
|
|
| tee "$outfile"
|
|
cat <<EOT >"$chkfile"
|
|
.f...p$dots foo/config1
|
|
>f..t.$dots foo/config2
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 7 failed"
|
|
|
|
$RSYNC -ivvplrtH --copy-dest=../to "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
case `tail -1 "$outfile"` in
|
|
cL..t*)
|
|
sym_dots="..t.$dots"
|
|
L_sym_dots="cL$sym_dots"
|
|
is_uptodate='-> ../bar/baz/rsync'
|
|
echo "cL$sym_dots foo/sym $is_uptodate" >"$chkfile.extra"
|
|
L=cL
|
|
;;
|
|
*)
|
|
sym_dots="$allspace"
|
|
L_sym_dots=".L$allspace"
|
|
is_uptodate='is uptodate'
|
|
touch "$chkfile.extra"
|
|
;;
|
|
esac
|
|
cat <<EOT >"$chkfile"
|
|
cd$allspace ./
|
|
cd$allspace bar/
|
|
cd$allspace bar/baz/
|
|
cf$allspace bar/baz/rsync
|
|
cd$allspace foo/
|
|
cf$allspace foo/config1
|
|
cf$allspace foo/config2
|
|
hf$allspace foo/extra => foo/config1
|
|
cL$sym_dots foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 8 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -iplrtH --copy-dest=../to "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
cat - "$chkfile.extra" <<EOT >"$chkfile"
|
|
hf$allspace foo/extra => foo/config1
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 9 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -vvplrtH --copy-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
./ is uptodate
|
|
bar/ is uptodate
|
|
bar/baz/ is uptodate
|
|
bar/baz/rsync is uptodate
|
|
foo/ is uptodate
|
|
foo/config1 is uptodate
|
|
foo/config2 is uptodate
|
|
foo/extra => foo/config1
|
|
foo/sym $is_uptodate
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 10 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -ivvplrtH --link-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
cd$allspace ./
|
|
cd$allspace bar/
|
|
cd$allspace bar/baz/
|
|
hf$allspace bar/baz/rsync
|
|
cd$allspace foo/
|
|
hf$allspace foo/config1
|
|
hf$allspace foo/config2
|
|
hf$allspace foo/extra => foo/config1
|
|
$L$sym_dots foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 11 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -iplrtH --dry-run --link-dest=../to "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
cat - "$chkfile.extra" <<EOT >"$chkfile"
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 12 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -iplrtH --link-dest=../to "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
cat - "$chkfile.extra" <<EOT >"$chkfile"
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 13 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -vvplrtH --link-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
./ is uptodate
|
|
bar/ is uptodate
|
|
bar/baz/ is uptodate
|
|
bar/baz/rsync is uptodate
|
|
foo/ is uptodate
|
|
foo/config1 is uptodate
|
|
foo/config2 is uptodate
|
|
foo/extra is uptodate
|
|
foo/sym $is_uptodate
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 14 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -ivvplrtH --compare-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
cd$allspace ./
|
|
cd$allspace bar/
|
|
cd$allspace bar/baz/
|
|
.f$allspace bar/baz/rsync
|
|
cd$allspace foo/
|
|
.f$allspace foo/config1
|
|
.f$allspace foo/config2
|
|
.f$allspace foo/extra
|
|
$L_sym_dots foo/sym -> ../bar/baz/rsync
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 15 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -iplrtH --compare-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
cat - "$chkfile.extra" <<EOT >"$chkfile"
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 16 failed"
|
|
|
|
rm -rf "$to2dir"
|
|
$RSYNC -vvplrtH --compare-dest="$todir" "$fromdir/" "$to2dir/" \
|
|
| tee "$outfile"
|
|
filter_outfile
|
|
cat <<EOT >"$chkfile"
|
|
./ is uptodate
|
|
bar/ is uptodate
|
|
bar/baz/ is uptodate
|
|
bar/baz/rsync is uptodate
|
|
foo/ is uptodate
|
|
foo/config1 is uptodate
|
|
foo/config2 is uptodate
|
|
foo/extra is uptodate
|
|
foo/sym $is_uptodate
|
|
EOT
|
|
diff $diffopt "$chkfile" "$outfile" || test_fail "test 17 failed"
|
|
|
|
# The script would have aborted on error, so getting here means we've won.
|
|
exit 0
|