diff: avoid generating unused hunk header lines
authorJeff King <peff@peff.net>
Fri, 2 Nov 2018 06:36:06 +0000 (02:36 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Nov 2018 04:14:35 +0000 (13:14 +0900)
Some callers of xdi_diff_outf() do not look at the generated hunk header
lines at all. By plugging in a no-op hunk callback, this tells xdiff not
to even bother formatting them.

This patch introduces a stock no-op callback and uses it with a few
callers whose line callbacks explicitly ignore hunk headers (because
they look only for +/- lines).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
diffcore-pickaxe.c
xdiff-interface.c
xdiff-interface.h
diff --git a/diff.c b/diff.c
index f9b9adc545c8cd04a9660ad49cae40be6c125fdf..d3e72623109c14d8f143fc877a4012ac5b7679a1 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -3604,8 +3604,8 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
                xpp.anchors_nr = o->anchors_nr;
                xecfg.ctxlen = o->context;
                xecfg.interhunkctxlen = o->interhunkcontext;
-               if (xdi_diff_outf(&mf1, &mf2, NULL, diffstat_consume,
-                                 diffstat, &xpp, &xecfg))
+               if (xdi_diff_outf(&mf1, &mf2, discard_hunk_line,
+                                 diffstat_consume, diffstat, &xpp, &xecfg))
                        die("unable to generate diffstat for %s", one->path);
        }
 
index 7609bb4fe1b1857ff395bb79b4bf98c8f33b2f5a..25e12148e46ab3f57e20498ccbd58d96f091bb20 100644 (file)
@@ -62,7 +62,8 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
        ecbdata.hit = 0;
        xecfg.ctxlen = o->context;
        xecfg.interhunkctxlen = o->interhunkcontext;
-       if (xdi_diff_outf(one, two, NULL, diffgrep_consume, &ecbdata, &xpp, &xecfg))
+       if (xdi_diff_outf(one, two, discard_hunk_line, diffgrep_consume,
+                         &ecbdata, &xpp, &xecfg))
                return 0;
        return ecbdata.hit;
 }
index eb9c05a1e34d6d9921bcb379ff0bdf7fe6c643bf..b99a57825f8510907f88575354cccf25eafd0052 100644 (file)
@@ -157,6 +157,12 @@ int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t co
        return xdl_diff(&a, &b, xpp, xecfg, xecb);
 }
 
+void discard_hunk_line(void *priv,
+                      long ob, long on, long nb, long nn,
+                      const char *func, long funclen)
+{
+}
+
 int xdi_diff_outf(mmfile_t *mf1, mmfile_t *mf2,
                  xdiff_emit_hunk_fn hunk_fn,
                  xdiff_emit_line_fn line_fn,
index 2dbe2feb196c4b568c0773784059b50f74640526..8af245eed9b43b5c9473d2dcb4beccbdafda7546 100644 (file)
@@ -35,6 +35,14 @@ extern void xdiff_clear_find_func(xdemitconf_t *xecfg);
 extern int git_xmerge_config(const char *var, const char *value, void *cb);
 extern int git_xmerge_style;
 
+/*
+ * Can be used as a no-op hunk_fn for xdi_diff_outf(), since a NULL
+ * one just sends the hunk line to the line_fn callback).
+ */
+void discard_hunk_line(void *priv,
+                      long ob, long on, long nb, long nn,
+                      const char *func, long funclen);
+
 /*
  * Compare the strings l1 with l2 which are of size s1 and s2 respectively.
  * Returns 1 if the strings are deemed equal, 0 otherwise.