xdiff: fix merging of appended hunk with -W
authorRené Scharfe <l.s.r@web.de>
Thu, 9 Jun 2016 21:54:48 +0000 (23:54 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Jun 2016 22:27:26 +0000 (15:27 -0700)
When -W is given we search the lines between the end of the current
context and the next change for a function line. If there is none then
we merge those two hunks as they must be part of the same function.

If the next change is an appended chunk we abort the search early in
get_func_line(), however, because its line number is out of range. Fix
that by searching from the end of the pre-image in that case instead.

Reported-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4051-diff-function-context.sh
xdiff/xemit.c
index b6bb04ab82a11bd208b44071e3c318bd14ccd500..b79b87790b29f6f1193578fd725d22da7058c819 100755 (executable)
@@ -64,7 +64,13 @@ test_expect_success 'setup' '
 
        grep -v "Begin of second part" <file.c >file.c.new &&
        mv file.c.new file.c &&
-       commit_and_tag long_common_tail file.c
+       commit_and_tag long_common_tail file.c &&
+
+       git checkout initial &&
+       grep -v "delete me from hello" <file.c >file.c.new &&
+       mv file.c.new file.c &&
+       cat "$dir/appended1.c" >>file.c &&
+       commit_and_tag changed_hello_appended file.c
 '
 
 check_diff changed_hello 'changed function'
@@ -157,4 +163,20 @@ test_expect_success ' context does not include preceding empty lines' '
        test "$(first_context_line <long_common_tail.diff.diff)" != " "
 '
 
+check_diff changed_hello_appended 'changed function plus appended function'
+
+test_expect_success ' context includes begin' '
+       grep "^ .*Begin of hello" changed_hello_appended.diff &&
+       grep "^[+].*Begin of first part" changed_hello_appended.diff
+'
+
+test_expect_success ' context includes end' '
+       grep "^ .*End of hello" changed_hello_appended.diff &&
+       grep "^[+].*End of first part" changed_hello_appended.diff
+'
+
+test_expect_success ' context does not include other functions' '
+       test $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2
+'
+
 test_done
index bfa53d3dcd2e472017309ad764543334780408cc..49aa16ff78d8c0f10942e0f519543cc6befabb9d 100644 (file)
@@ -246,7 +246,8 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                         * its new end.
                         */
                        if (xche->next) {
-                               long l = xche->next->i1;
+                               long l = XDL_MIN(xche->next->i1,
+                                                xe->xdf1.nrec - 1);
                                if (l <= e1 ||
                                    get_func_line(xe, xecfg, NULL, l, e1) < 0) {
                                        xche = xche->next;