From: Junio C Hamano Date: Wed, 21 Sep 2016 22:15:26 +0000 (-0700) Subject: Merge branch 'rs/xdiff-merge-overlapping-hunks-for-W-context' X-Git-Tag: v2.11.0-rc0~126 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/4ed38637ec6fa08b4bef42a35d87f95c0582b97b?hp=e9c6d3dcc2112f0d6190681211ea76b714fcd704 Merge branch 'rs/xdiff-merge-overlapping-hunks-for-W-context' "git diff -W" output needs to extend the context backward to include the header line of the current function and also forward to include the body of the entire current function up to the header line of the next one. This process may have to merge to adjacent hunks, but the code forgot to do so in some cases. * rs/xdiff-merge-overlapping-hunks-for-W-context: xdiff: fix merging of hunks with -W context and -u context --- diff --git a/t/t4051-diff-function-context.sh b/t/t4051-diff-function-context.sh index b79b87790b..6154acb456 100755 --- a/t/t4051-diff-function-context.sh +++ b/t/t4051-diff-function-context.sh @@ -66,6 +66,15 @@ test_expect_success 'setup' ' mv file.c.new file.c && commit_and_tag long_common_tail file.c && + git checkout initial && + cat "$dir/hello.c" "$dir/dummy.c" >file.c && + commit_and_tag hello_dummy file.c && + + # overlap function context of 1st change and -u context of 2nd change + grep -v "delete me from hello" <"$dir/hello.c" >file.c && + sed 2p <"$dir/dummy.c" >>file.c && + commit_and_tag changed_hello_dummy file.c && + git checkout initial && grep -v "delete me from hello" file.c.new && mv file.c.new file.c && @@ -179,4 +188,20 @@ test_expect_success ' context does not include other functions' ' test $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2 ' +check_diff changed_hello_dummy 'changed two consecutive functions' + +test_expect_success ' context includes begin' ' + grep "^ .*Begin of hello" changed_hello_dummy.diff && + grep "^ .*Begin of dummy" changed_hello_dummy.diff +' + +test_expect_success ' context includes end' ' + grep "^ .*End of hello" changed_hello_dummy.diff && + grep "^ .*End of dummy" changed_hello_dummy.diff +' + +test_expect_success ' overlapping hunks are merged' ' + test $(grep -c "^@@" changed_hello_dummy.diff) -eq 1 +' + test_done diff --git a/xdiff/xemit.c b/xdiff/xemit.c index b52b4b9c1e..7389ce4102 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -239,7 +239,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, if (xche->next) { long l = XDL_MIN(xche->next->i1, xe->xdf1.nrec - 1); - if (l <= e1 || + if (l - xecfg->ctxlen <= e1 || get_func_line(xe, xecfg, NULL, l, e1) < 0) { xche = xche->next; goto post_context_calculation;