summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2018-11-02 06:36:06 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-11-05 04:14:35 (GMT)
commit3b40a090fd4e441e88897dfa96f50039952ed45b (patch)
tree41935127edd97b3508504b0ca8533ef8226c43ed
parent9346d6d14dddc7989ba879839d58f6c2426cffbb (diff)
downloadgit-3b40a090fd4e441e88897dfa96f50039952ed45b.zip
git-3b40a090fd4e441e88897dfa96f50039952ed45b.tar.gz
git-3b40a090fd4e441e88897dfa96f50039952ed45b.tar.bz2
diff: avoid generating unused hunk header lines
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>
-rw-r--r--diff.c4
-rw-r--r--diffcore-pickaxe.c3
-rw-r--r--xdiff-interface.c6
-rw-r--r--xdiff-interface.h8
4 files changed, 18 insertions, 3 deletions
diff --git a/diff.c b/diff.c
index f9b9adc..d3e7262 100644
--- 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);
}
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 7609bb4..25e1214 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -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;
}
diff --git a/xdiff-interface.c b/xdiff-interface.c
index eb9c05a..b99a578 100644
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
@@ -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,
diff --git a/xdiff-interface.h b/xdiff-interface.h
index 2dbe2fe..8af245e 100644
--- a/xdiff-interface.h
+++ b/xdiff-interface.h
@@ -36,6 +36,14 @@ 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.
* The `flags` given as XDF_WHITESPACE_FLAGS determine how white spaces