Skip to content

Commit

Permalink
Merge branch 'rs/xdiff-ignore-ws-w-func-context'
Browse files Browse the repository at this point in the history
The "diff" machinery learned not to lose added/removed blank lines
in the context when --ignore-blank-lines and --function-context are
used at the same time.

* rs/xdiff-ignore-ws-w-func-context:
  xdiff: unignore changes in function context
  • Loading branch information
gitster committed Dec 16, 2019
2 parents 71a7de7 + 0bb313a commit f0070a7
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
6 changes: 1 addition & 5 deletions t/t4015-diff-whitespace.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2050,11 +2050,6 @@ test_expect_success 'compare mixed whitespace delta across moved blocks' '
test_cmp expected actual
'

# Note that the "6" in the expected hunk header below is funny, since we only
# show 5 lines (the missing one was blank and thus ignored). This is how
# --ignore-blank-lines behaves even without --function-context, and this test
# is just checking the interaction of the two features. Don't take it as an
# endorsement of that output.
test_expect_success 'combine --ignore-blank-lines with --function-context' '
test_write_lines 1 "" 2 3 4 5 >a &&
test_write_lines 1 2 3 4 >b &&
Expand All @@ -2064,6 +2059,7 @@ test_expect_success 'combine --ignore-blank-lines with --function-context' '
cat <<-\EOF >expect &&
@@ -1,6 +1,4 @@
1
-
2
3
4
Expand Down
17 changes: 17 additions & 0 deletions xdiff/xemit.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,12 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
struct func_line func_line = { 0 };

for (xch = xscr; xch; xch = xche->next) {
xdchange_t *xchp = xch;
xche = xdl_get_hunk(&xch, xecfg);
if (!xch)
break;

pre_context_calculation:
s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0);
s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0);

Expand Down Expand Up @@ -212,6 +214,21 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
if (fs1 < s1) {
s2 = XDL_MAX(s2 - (s1 - fs1), 0);
s1 = fs1;

/*
* Did we extend context upwards into an
* ignored change?
*/
while (xchp != xch &&
xchp->i1 + xchp->chg1 <= s1 &&
xchp->i2 + xchp->chg2 <= s2)
xchp = xchp->next;

/* If so, show it after all. */
if (xchp != xch) {
xch = xchp;
goto pre_context_calculation;
}
}
}

Expand Down

0 comments on commit f0070a7

Please sign in to comment.