mirror of
https://https.git.savannah.gnu.org/git/diffutils.git
synced 2026-01-26 15:03:22 +00:00
* bootstrap.conf (gnulib_modules): Add c-file-type and remove file-type. * po/POTFILES.in: Add lib/c-file-type.c, remove lib/file-type.c * src/diff.c (O_PATH_DEFINED): New constant. (detype_from_mode): Remove; no longer used. (dir_p): Go back to the old way of using S_ISDIR. (compare_prepped_files): Use filetype and stat macros, not detype. Pass symlink fd and "" to careadlinkat if available, as that avoids a race. Test for dir vs file earlier, so that a missing file is treated consistently with dir/file vs file. (compare_files): New arg DETYPE replacing the old DETYPE0 and DETYPE1. All uses changed. st_size for nonexistent files is 0, not -1. Set up .filetype, not .detype, as .filetype is finer-grained. Open symlinks with O_PATH on GNU/Linux, since we can then use readlinkat on the resulting file descriptor and this avoids a race. * src/diff.h (struct file_data): Remove detype member. Add filetype member; it’s finer-grained. All uses changed. * tests/no-dereference: Add test that the previous commit failed.
158 lines
4.7 KiB
Bash
158 lines
4.7 KiB
Bash
#!/bin/sh
|
|
# Test the --no-dereference option.
|
|
|
|
. "${srcdir=.}/init.sh"; path_prepend_ ../src
|
|
|
|
echo 'Simple contents' > regular1
|
|
echo 'Sample contents' > regular2
|
|
echo 'Sample contents' > regular3
|
|
ln -s regular1 symlink1
|
|
ln -s regular1 symlink1bis
|
|
ln -s regular2 symlink2
|
|
ln -s regular3 symlink3
|
|
|
|
# Non-recursive comparisons.
|
|
|
|
# Compare regular file with regular file.
|
|
returns_ 1 diff --no-dereference regular1 regular2 > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
1c1
|
|
< Simple contents
|
|
---
|
|
> Sample contents
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare regular file with symbolic link.
|
|
returns_ 1 diff --no-dereference regular1 symlink1 > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
File regular1 is a regular file while file symlink1 is a symbolic link
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic link with regular file.
|
|
returns_ 1 diff --no-dereference symlink1 regular1 > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
File symlink1 is a symbolic link while file regular1 is a regular file
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic links with same value.
|
|
diff --no-dereference symlink1 symlink1bis > out || fail=1
|
|
compare /dev/null out || fail=1
|
|
|
|
# Compare symbolic links with different value and different target contents.
|
|
LC_ALL=C returns_ 1 diff --no-dereference symlink1 symlink2 > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Symbolic links 'symlink1' -> 'regular1' and 'symlink2' -> 'regular2' differ
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic links with different value and same target contents.
|
|
LC_ALL=C returns_ 1 diff --no-dereference symlink2 symlink3 > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Symbolic links 'symlink2' -> 'regular2' and 'symlink3' -> 'regular3' differ
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
mkdir subdir &&
|
|
ln -s loop loop &&
|
|
ln -s loop subdir/loop || framework_failure_
|
|
diff --no-dereference loop subdir > out || fail=1
|
|
compare /dev/null out || fail=1
|
|
|
|
# Recursive comparisons.
|
|
|
|
# Compare symbolic link with nonexistent file.
|
|
mkdir subdir1a
|
|
mkdir subdir1b
|
|
ln -s nonexistent subdir1a/foo
|
|
ln -s ../regular1 subdir1a/bar
|
|
returns_ 1 diff -r --no-dereference subdir1a subdir1b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Only in subdir1a: bar
|
|
Only in subdir1a: foo
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare nonexistent file with symbolic link.
|
|
mkdir subdir2a
|
|
mkdir subdir2b
|
|
ln -s nonexistent subdir2b/foo
|
|
ln -s ../regular1 subdir2b/bar
|
|
returns_ 1 diff -r --no-dereference subdir2a subdir2b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Only in subdir2b: bar
|
|
Only in subdir2b: foo
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare regular file with regular file.
|
|
mkdir subdir3a
|
|
mkdir subdir3b
|
|
cp regular1 subdir3a/foo
|
|
cp regular2 subdir3b/foo
|
|
returns_ 1 diff -r --no-dereference subdir3a subdir3b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
diff -r --no-dereference subdir3a/foo subdir3b/foo
|
|
1c1
|
|
< Simple contents
|
|
---
|
|
> Sample contents
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare regular file with symbolic link.
|
|
mkdir subdir4a
|
|
mkdir subdir4b
|
|
cp regular1 subdir4a/foo
|
|
ln -s ../regular1 subdir4b/foo
|
|
returns_ 1 diff -r --no-dereference subdir4a subdir4b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
File subdir4a/foo is a regular file while file subdir4b/foo is a symbolic link
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic link with regular file.
|
|
mkdir subdir5a
|
|
mkdir subdir5b
|
|
ln -s ../regular1 subdir5a/foo
|
|
cp regular1 subdir5b/foo
|
|
returns_ 1 diff -r --no-dereference subdir5a subdir5b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
File subdir5a/foo is a symbolic link while file subdir5b/foo is a regular file
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic links with same value.
|
|
mkdir subdir6a
|
|
mkdir subdir6b
|
|
ln -s ../regular1 subdir6a/foo
|
|
ln -s ../regular1 subdir6b/foo
|
|
diff -r --no-dereference subdir6a subdir6b > out || fail=1
|
|
compare /dev/null out || fail=1
|
|
|
|
# Compare symbolic links with different value and different target contents.
|
|
mkdir subdir7a
|
|
mkdir subdir7b
|
|
ln -s ../regular1 subdir7a/foo
|
|
ln -s ../regular2 subdir7b/foo
|
|
LC_ALL=C returns_ 1 diff -r --no-dereference subdir7a subdir7b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Symbolic links 'subdir7a/foo' -> '../regular1' and 'subdir7b/foo' -> '../regular2' differ
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
# Compare symbolic links with different value and same target contents.
|
|
mkdir subdir8a
|
|
mkdir subdir8b
|
|
ln -s ../regular2 subdir8a/foo
|
|
ln -s ../regular3 subdir8b/foo
|
|
LC_ALL=C returns_ 1 diff -r --no-dereference subdir8a subdir8b > out || fail=1
|
|
cat <<EOF > expected || framework_failure_
|
|
Symbolic links 'subdir8a/foo' -> '../regular2' and 'subdir8b/foo' -> '../regular3' differ
|
|
EOF
|
|
compare expected out || fail=1
|
|
|
|
Exit $fail
|