From: "Bhushan G. Lodha & David A. Dalrymple" <dad-bgl@xxxxxxx> For filtering commits by function name, it's useful to identify the function name in cases such as adding a new function to a file (where the default functionality will not emit a function name in the hunk header, because it isn't part of the context). This adds a flag asking xdiff to be more aggressive in finding function names to emit, and turns the flag on when the --function-name option is in use. Signed-off-by: David Dalrymple (on zayin) <davidad@xxxxxxxxxxxx> --- diff.c | 2 ++ diffcore-pickaxe.c | 2 +- xdiff/xdiff.h | 1 + xdiff/xemit.c | 39 +++++++++++++++++++++++---------------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/diff.c b/diff.c index 2f6dbc1..914b4a2 100644 --- a/diff.c +++ b/diff.c @@ -2380,6 +2380,8 @@ static void builtin_diff(const char *name_a, xecfg.ctxlen = o->context; xecfg.interhunkctxlen = o->interhunkcontext; xecfg.flags = XDL_EMIT_FUNCNAMES; + if (o->funcname) + xecfg.flags |= XDL_EMIT_MOREFUNCNAMES; if (DIFF_OPT_TST(o, FUNCCONTEXT)) xecfg.flags |= XDL_EMIT_FUNCCONTEXT; if (pe) diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c index 259a8fa..ab31c18 100644 --- a/diffcore-pickaxe.c +++ b/diffcore-pickaxe.c @@ -164,7 +164,7 @@ static int diff_funcname_filter(mmfile_t *one, mmfile_t *two, xecfg.interhunkctxlen = o->interhunkcontext; if (!(one && two)) xecfg.flags = XDL_EMIT_FUNCCONTEXT; - xecfg.flags |= XDL_EMIT_FUNCNAMES; + xecfg.flags |= XDL_EMIT_FUNCNAMES | XDL_EMIT_MOREFUNCNAMES; xdi_diff_outf(one, two, match_funcname, &ecbdata, &xpp, &xecfg); return ecbdata.hit; } diff --git a/xdiff/xdiff.h b/xdiff/xdiff.h index c033991..469bded 100644 --- a/xdiff/xdiff.h +++ b/xdiff/xdiff.h @@ -44,6 +44,7 @@ #define XDL_EMIT_FUNCNAMES (1 << 0) #define XDL_EMIT_COMMON (1 << 1) #define XDL_EMIT_FUNCCONTEXT (1 << 2) +#define XDL_EMIT_MOREFUNCNAMES (1 << 3) #define XDL_MMB_READONLY (1 << 0) diff --git a/xdiff/xemit.c b/xdiff/xemit.c index 4266ada..0ddb094 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -23,6 +23,10 @@ #include "xinclude.h" +struct func_line { + long len; + char buf[80]; +}; static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec); @@ -135,12 +139,7 @@ static int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, return 0; } -struct func_line { - long len; - char buf[80]; -}; - -static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg, +static long get_func_line(xdfile_t *xdf, xdemitconf_t const *xecfg, struct func_line *func_line, long start, long limit) { find_func_t ff = xecfg->find_func ? xecfg->find_func : def_ff; @@ -150,9 +149,9 @@ static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg, buf = func_line ? func_line->buf : dummy; size = func_line ? sizeof(func_line->buf) : sizeof(dummy); - for (l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) { + for (l = start; l != limit && 0 <= l && l < xdf->nrec; l += step) { const char *rec; - long reclen = xdl_get_rec(&xe->xdf1, l, &rec); + long reclen = xdl_get_rec(xdf, l, &rec); long len = ff(rec, reclen, buf, size, xecfg->find_func_priv); if (len >= 0) { if (func_line) @@ -167,7 +166,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, xdemitconf_t const *xecfg) { long s1, s2, e1, e2, lctx; xdchange_t *xch, *xche; - long funclineprev = -1; + long funclineprev1 = -1, funclineprev2 = -1; struct func_line func_line = { 0 }; if (xecfg->flags & XDL_EMIT_COMMON) @@ -182,7 +181,7 @@ 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) { - long fs1 = get_func_line(xe, xecfg, NULL, xch->i1, -1); + long fs1 = get_func_line(&xe->xdf1, xecfg, NULL, xch->i1, -1); if (fs1 < 0) fs1 = 0; if (fs1 < s1) { @@ -200,7 +199,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, e2 = xche->i2 + xche->chg2 + lctx; if (xecfg->flags & XDL_EMIT_FUNCCONTEXT) { - long fe1 = get_func_line(xe, xecfg, NULL, + long fe1 = get_func_line(&xe->xdf1, xecfg, NULL, xche->i1 + xche->chg1, xe->xdf1.nrec); if (fe1 < 0) @@ -218,7 +217,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, if (xche->next) { long l = xche->next->i1; if (l <= e1 || - get_func_line(xe, xecfg, NULL, l, e1) < 0) { + get_func_line(&xe->xdf1, xecfg, NULL, l, e1) < 0) { xche = xche->next; goto again; } @@ -229,10 +228,18 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, * Emit current hunk header. */ - if (xecfg->flags & XDL_EMIT_FUNCNAMES) { - get_func_line(xe, xecfg, &func_line, - s1 - 1, funclineprev); - funclineprev = s1 - 1; + if (xecfg->flags & XDL_EMIT_MOREFUNCNAMES) { + long fl_in_xch1 = get_func_line(&xe->xdf1, xecfg, + &func_line, xch->i1, xch->i1+xch->chg1); + if (fl_in_xch1 < 0) { + get_func_line(&xe->xdf2, xecfg, &func_line, + xch->i2, funclineprev2); + funclineprev2 = xch->i2; + } + } else if (xecfg->flags & XDL_EMIT_FUNCNAMES) { + get_func_line(&xe->xdf1, xecfg, &func_line, + s1 - 1, funclineprev1); + funclineprev1 = s1 - 1; } if (xdl_emit_hunk_hdr(s1 + 1, e1 - s1, s2 + 1, e2 - s2, func_line.buf, func_line.len, ecb) < 0) -- 1.7.12.4 (Apple Git-37) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html