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>
This commit is contained in:
Jeff King 2018-11-02 02:36:06 -04:00 committed by Junio C Hamano
parent 9346d6d14d
commit 3b40a090fd
4 changed files with 18 additions and 3 deletions

4
diff.c
View File

@ -3604,8 +3604,8 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
xpp.anchors_nr = o->anchors_nr; xpp.anchors_nr = o->anchors_nr;
xecfg.ctxlen = o->context; xecfg.ctxlen = o->context;
xecfg.interhunkctxlen = o->interhunkcontext; xecfg.interhunkctxlen = o->interhunkcontext;
if (xdi_diff_outf(&mf1, &mf2, NULL, diffstat_consume, if (xdi_diff_outf(&mf1, &mf2, discard_hunk_line,
diffstat, &xpp, &xecfg)) diffstat_consume, diffstat, &xpp, &xecfg))
die("unable to generate diffstat for %s", one->path); die("unable to generate diffstat for %s", one->path);
} }

View File

@ -62,7 +62,8 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
ecbdata.hit = 0; ecbdata.hit = 0;
xecfg.ctxlen = o->context; xecfg.ctxlen = o->context;
xecfg.interhunkctxlen = o->interhunkcontext; 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 0;
return ecbdata.hit; return ecbdata.hit;
} }

View 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); 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, int xdi_diff_outf(mmfile_t *mf1, mmfile_t *mf2,
xdiff_emit_hunk_fn hunk_fn, xdiff_emit_hunk_fn hunk_fn,
xdiff_emit_line_fn line_fn, xdiff_emit_line_fn line_fn,

View 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_config(const char *var, const char *value, void *cb);
extern int git_xmerge_style; 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. * Compare the strings l1 with l2 which are of size s1 and s2 respectively.
* Returns 1 if the strings are deemed equal, 0 otherwise. * Returns 1 if the strings are deemed equal, 0 otherwise.