view tests/pdiff @ 45816:4b79e92a5ef8

tests: test more cases where a file got replaced by a copy This adds a test where a file is modified on one branch and is renamed onto another file in another branch. That should ideally be automatically resolved (by propagating the modification to the rename destination). Alternatively, it could be considered a modify/delete conflict. It should at least not be automatically resolved by ignoring the modification. However, that is what actually happens with the changeset-centric algorithm since I broke it in b4057d001760 (merge: when rename was made on both sides, use ancestor as merge base, 2020-01-22). Before that commit, it resulted in a modify/delete conflict. The filelog-centric algorithm was broken already before that commit. Differential Revision: https://phab.mercurial-scm.org/D8652
author Martin von Zweigbergk <martinvonz@google.com>
date Mon, 22 Jun 2020 22:47:33 -0700
parents a2b55ee62803
children
line wrap: on
line source

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

    # in this case, files differ from each other
    return 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

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