tests/pdiff
changeset 28052 b59ef0c21405
child 28337 869e65e68aee
equal deleted inserted replaced
28051:413201fbbc82 28052:b59ef0c21405
       
     1 #!/bin/sh
       
     2 
       
     3 # Script to get stable diff output on any platform.
       
     4 #
       
     5 # Output of this script is almost equivalent to GNU diff with "-Nru".
       
     6 #
       
     7 # Use this script as "hg pdiff" via extdiff extension with preparation
       
     8 # below in test scripts:
       
     9 #
       
    10 #   $ cat >> $HGRCPATH <<EOF
       
    11 #   > [extdiff]
       
    12 #   > pdiff = sh "$RUNTESTDIR/pdiff"
       
    13 #   > EOF
       
    14 
       
    15 filediff(){
       
    16     # USAGE: filediff file1 file2 [header]
       
    17 
       
    18     # compare with /dev/null if file doesn't exist (as "-N" option)
       
    19     file1="$1"
       
    20     if test ! -f "$file1"; then
       
    21         file1=/dev/null
       
    22     fi
       
    23     file2="$2"
       
    24     if test ! -f "$file2"; then
       
    25         file2=/dev/null
       
    26     fi
       
    27 
       
    28     if cmp -s "$file1" "$file2"; then
       
    29         # Return immediately, because comparison isn't needed. This
       
    30         # also avoids redundant message of diff like "No differences
       
    31         # encountered" (on Solaris)
       
    32         return
       
    33     fi
       
    34 
       
    35     if test -n "$3"; then
       
    36         # show header only in recursive case
       
    37         echo "$3"
       
    38     fi
       
    39 
       
    40     # replace "/dev/null" by corresponded filename (as "-N" option)
       
    41     diff -u "$file1" "$file2" |
       
    42     sed "s@^--- /dev/null\(.*\)\$@--- $1\1@" |
       
    43     sed "s@^\+\+\+ /dev/null\(.*\)\$@+++ $2\1@"
       
    44 }
       
    45 
       
    46 if test -d "$1" -o -d "$2"; then
       
    47     # ensure comparison in dictionary order
       
    48     (
       
    49     if test -d "$1"; then (cd "$1" && find . -type f); fi
       
    50     if test -d "$2"; then (cd "$2" && find . -type f); fi
       
    51     ) |
       
    52     sed 's@^\./@@g' | sort | uniq |
       
    53     while read file; do
       
    54         filediff "$1/$file" "$2/$file" "diff -Nru $1/$file $2/$file"
       
    55     done
       
    56 else
       
    57     filediff "$1" "$2"
       
    58 fi