From: "Bhushan G. Lodha & David A. Dalrymple" <dad-...@mit.edu>

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) <davi...@alum.mit.edu>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to