pdiff
69 lines
| 1.9 KiB
| text/plain
|
TextLexer
/ tests / pdiff
|
r28052 | #!/bin/sh | ||
# Script to get stable diff output on any platform. | ||||
# | ||||
# Output of this script is almost equivalent to GNU diff with "-Nru". | ||||
# | ||||
# Use this script as "hg pdiff" via extdiff extension with preparation | ||||
# below in test scripts: | ||||
# | ||||
# $ cat >> $HGRCPATH <<EOF | ||||
# > [extdiff] | ||||
# > pdiff = sh "$RUNTESTDIR/pdiff" | ||||
# > EOF | ||||
filediff(){ | ||||
# USAGE: filediff file1 file2 [header] | ||||
# compare with /dev/null if file doesn't exist (as "-N" option) | ||||
file1="$1" | ||||
if test ! -f "$file1"; then | ||||
file1=/dev/null | ||||
fi | ||||
file2="$2" | ||||
if test ! -f "$file2"; then | ||||
file2=/dev/null | ||||
fi | ||||
|
r28337 | if cmp -s "$file1" "$file2" 2> /dev/null; then | ||
|
r28052 | # Return immediately, because comparison isn't needed. This | ||
# also avoids redundant message of diff like "No differences | ||||
# encountered" (on Solaris) | ||||
return | ||||
fi | ||||
if test -n "$3"; then | ||||
# show header only in recursive case | ||||
echo "$3" | ||||
fi | ||||
# replace "/dev/null" by corresponded filename (as "-N" option) | ||||
diff -u "$file1" "$file2" | | ||||
sed "s@^--- /dev/null\(.*\)\$@--- $1\1@" | | ||||
sed "s@^\+\+\+ /dev/null\(.*\)\$@+++ $2\1@" | ||||
|
r33613 | |||
# in this case, files differ from each other | ||||
return 1 | ||||
|
r28052 | } | ||
if test -d "$1" -o -d "$2"; then | ||||
# ensure comparison in dictionary order | ||||
( | ||||
if test -d "$1"; then (cd "$1" && find . -type f); fi | ||||
if test -d "$2"; then (cd "$2" && find . -type f); fi | ||||
) | | ||||
sed 's@^\./@@g' | sort | uniq | | ||||
while read file; do | ||||
filediff "$1/$file" "$2/$file" "diff -Nru $1/$file $2/$file" | ||||
done | ||||
|
r33613 | |||
# TODO: there is no portable way for current while-read based | ||||
# implementation to return 1 at detecting changes. | ||||
# | ||||
# On bash and dash, assignment to variable inside while-block | ||||
# doesn't affect outside, because inside while-block is executed | ||||
# in sub-shell. BTW, it affects outside while-block on ksh (as sh | ||||
# on Solaris). | ||||
|
r28052 | else | ||
filediff "$1" "$2" | ||||
fi | ||||