tests/pdiff
author Gábor Stefanik <gabor.stefanik@nng.com>
Thu, 13 Oct 2016 02:19:43 +0200
changeset 30197 0accd5a5ad04
parent 28337 869e65e68aee
child 33611 a2b55ee62803
permissions -rwxr-xr-x
mergecopies: invoke _computenonoverlap for both base and tca during merges The algorithm of _checkcopies can only walk backwards in the DAG, never forward. Because of this, the two _checkcopies patches need to run from their respective endpoints to the TCA to cover the entire subgraph where the merge is being performed. However, detection of files new in both endpoints, as well as directory rename detection, need to run with respect to the merge base, so we need lists of new files both from the TCA's and the merge base's viewpoint to correctly detect renames in a graft-like merge scenario. (Series reworked by Pierre-Yves David)

#!/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

    if cmp -s "$file1" "$file2" 2> /dev/null; then
        # 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@"
}

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
else
    filediff "$1" "$2"
fi