Am 15.01.2017 um 03:39 schrieb Junio C Hamano: > René Scharfe <l.s.r@xxxxxx> writes: > >>> I am also more focused on keeping the codebase maintainable in good >>> health by making sure that we made an effort to find a solution that >>> is general-enough before solving a single specific problem you have >>> today. We may end up deciding that a blank-line heuristics gives us >>> good enough tradeoff, but I do not want us to make a decision before >>> thinking. >> >> How about extending the context upward only up to and excluding a line >> that is either empty *or* a function line? That would limit the extra >> context to a single function in the worst case. >> >> Reducing context at the bottom with the aim to remove comments for the >> next section is more tricky as it could remove part of the function >> that we'd like to show if we get the boundary wrong. How bad would it >> be to keep the southern border unchanged? > > I personally do not think there is any robust heuristic other than > Vegard's "a blank line may be a signal enough that lines before that > are not part of the beginning of the function", and I think your > "hence we look for a blank line but if there is a line that matches > the function header, stop there as we know we came too far back" > will be a good-enough safety measure. > > I also agree with you that we probably do not want to futz with the > southern border. A replacement patch for 2/3 with these changes would look like this: diff --git a/xdiff/xemit.c b/xdiff/xemit.c index 8c88dbde38..9ed54cd318 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -174,11 +174,11 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0); if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) { + char dummy[1]; long fs1, i1 = xch->i1; /* Appended chunk? */ if (i1 >= xe->xdf1.nrec) { - char dummy[1]; long i2 = xch->i2; /* @@ -200,6 +200,10 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, } fs1 = get_func_line(xe, xecfg, NULL, i1, -1); + while (fs1 > 0 && !is_empty_rec(&xe->xdf1, fs1 - 1) && + match_func_rec(&xe->xdf1, xecfg, fs1 - 1, + dummy, sizeof(dummy)) < 0) + fs1--; if (fs1 < 0) fs1 = 0; if (fs1 < s1) {