The branch main has been updated by bapt:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b37a6938e39a7ed9542fafee671465bf719fd537

commit b37a6938e39a7ed9542fafee671465bf719fd537
Author:     Baptiste Daroussin <[email protected]>
AuthorDate: 2023-09-05 11:24:53 +0000
Commit:     Baptiste Daroussin <[email protected]>
CommitDate: 2023-09-06 15:06:39 +0000

    diff3: make the diff3 -E -m and diff3 -m behaviour match gnu diff3
    
    In gnu diff3 3 way merging files where the new file and the target are
    already the same will die and show what has failed to be merged except
    if -E is passed in argument, in this case it will finish the merge.
    
    This difference in behaviour was breaking one of the etcupdate testcase
    with bsd diff3
    
    Reviewed by:    emaste
    Differential Revision:  https://reviews.freebsd.org/D41730
---
 usr.bin/diff3/diff3.c             |  8 +++++---
 usr.bin/diff3/tests/Makefile      |  2 ++
 usr.bin/diff3/tests/diff3_test.sh | 32 ++++++++++++++++++++++++++++++++
 usr.bin/diff3/tests/fbsdid1.txt   |  5 +++++
 usr.bin/diff3/tests/fbsdid2.txt   |  5 +++++
 5 files changed, 49 insertions(+), 3 deletions(-)

diff --git a/usr.bin/diff3/diff3.c b/usr.bin/diff3/diff3.c
index e80b1d142231..380987560ee0 100644
--- a/usr.bin/diff3/diff3.c
+++ b/usr.bin/diff3/diff3.c
@@ -335,7 +335,8 @@ merge(int m1, int m2)
                                change(2, &d2->old, false);
                        } else if (Aflag || mflag) {
                                // XXX-THJ: What does it mean for the second 
file to differ?
-                               j = edit(d2, dup, j, DIFF_TYPE2);
+                               if (eflag == EFLAG_UNMERGED)
+                                       j = edit(d2, dup, j, DIFF_TYPE2);
                        }
                        d2++;
                        continue;
@@ -861,7 +862,7 @@ main(int argc, char **argv)
                        eflag = EFLAG_UNMERGED;
                        break;
                case 'E':
-                       eflag = EFLAG_UNMERGED;
+                       eflag = EFLAG_OVERLAP;
                        oflag = 1;
                        break;
                case 'i':
@@ -907,7 +908,8 @@ main(int argc, char **argv)
        argv += optind;
 
        if (Aflag) {
-               eflag = EFLAG_UNMERGED;
+               if (eflag == EFLAG_NONE)
+                       eflag = EFLAG_UNMERGED;
                oflag = 1;
        }
 
diff --git a/usr.bin/diff3/tests/Makefile b/usr.bin/diff3/tests/Makefile
index df000d68cc7e..3b720586d148 100644
--- a/usr.bin/diff3/tests/Makefile
+++ b/usr.bin/diff3/tests/Makefile
@@ -23,5 +23,7 @@ ${PACKAGE}FILES+=     \
        long-ed.out \
        long-A.out \
        long-merge.out \
+       fbsdid1.txt \
+       fbsdid2.txt
 
 .include <bsd.test.mk>
diff --git a/usr.bin/diff3/tests/diff3_test.sh 
b/usr.bin/diff3/tests/diff3_test.sh
index 3a4fc128ca16..3cbd7dac1ed9 100755
--- a/usr.bin/diff3/tests/diff3_test.sh
+++ b/usr.bin/diff3/tests/diff3_test.sh
@@ -4,6 +4,7 @@ atf_test_case diff3_lesssimple
 atf_test_case diff3_ed
 atf_test_case diff3_A
 atf_test_case diff3_merge
+atf_test_case diff3_E_merge
 
 diff3_body()
 {
@@ -66,6 +67,36 @@ diff3_merge_body()
                diff3 -m -L long-m.txt -L long-o.txt -L long-y.txt 
$(atf_get_srcdir)/long-m.txt $(atf_get_srcdir)/long-o.txt 
$(atf_get_srcdir)/long-y.txt
 }
 
+diff3_E_merge_body()
+{
+
+expected="<<<<<<< 2
+# \$FreeBSD: head/local 12000 jhb \$
+=======
+# \$FreeBSD: head/local 12345 jhb \$
+>>>>>>> 3
+# \$FreeBSD: head/local 12345 jhb \$
+
+this is a file
+
+these are some local mods to the file
+"
+       # first test the regular test
+       cp $(atf_get_srcdir)/fbsdid2.txt out.txt
+       atf_check -s exit:1 -o inline:"${expected}" \
+               diff3 -m -L 1 -L 2 -L 3 out.txt $(atf_get_srcdir)/fbsdid1.txt 
$(atf_get_srcdir)/fbsdid2.txt
+
+merged="# \$FreeBSD: head/local 12345 jhb \$
+
+this is a file
+
+these are some local mods to the file
+"
+       atf_check -s exit:0 -o inline:"${merged}" \
+               diff3 -E -m out.txt $(atf_get_srcdir)/fbsdid1.txt 
$(atf_get_srcdir)/fbsdid2.txt
+}
+
+
 atf_init_test_cases()
 {
        atf_add_test_case diff3
@@ -73,4 +104,5 @@ atf_init_test_cases()
        atf_add_test_case diff3_ed
        atf_add_test_case diff3_A
        atf_add_test_case diff3_merge
+       atf_add_test_case diff3_E_merge
 }
diff --git a/usr.bin/diff3/tests/fbsdid1.txt b/usr.bin/diff3/tests/fbsdid1.txt
new file mode 100644
index 000000000000..9f94660bda97
--- /dev/null
+++ b/usr.bin/diff3/tests/fbsdid1.txt
@@ -0,0 +1,5 @@
+# $FreeBSD: head/local 12000 jhb $
+
+this is a file
+
+these are some local mods to the file
diff --git a/usr.bin/diff3/tests/fbsdid2.txt b/usr.bin/diff3/tests/fbsdid2.txt
new file mode 100644
index 000000000000..420ad975868b
--- /dev/null
+++ b/usr.bin/diff3/tests/fbsdid2.txt
@@ -0,0 +1,5 @@
+# $FreeBSD: head/local 12345 jhb $
+
+this is a file
+
+these are some local mods to the file

Reply via email to