Merge branch 'ab/pickaxe-pcre2'
Rewrite the backend for "diff -G/-S" to use pcre2 engine when available. * ab/pickaxe-pcre2: (22 commits) xdiff-interface: replace discard_hunk_line() with a flag xdiff users: use designated initializers for out_line pickaxe -G: don't special-case create/delete pickaxe -G: terminate early on matching lines xdiff-interface: allow early return from xdiff_emit_line_fn xdiff-interface: prepare for allowing early return pickaxe -S: slightly optimize contains() pickaxe: rename variables in has_changes() for brevity pickaxe -S: support content with NULs under --pickaxe-regex pickaxe: assert that we must have a needle under -G or -S pickaxe: refactor function selection in diffcore-pickaxe() perf: add performance test for pickaxe pickaxe/style: consolidate declarations and assignments diff.h: move pickaxe fields together again pickaxe: die when --find-object and --pickaxe-all are combined pickaxe: die when -G and --pickaxe-regex are combined pickaxe tests: add missing test for --no-pickaxe-regex being an error pickaxe tests: test for -G, -S and --find-object incompatibility pickaxe tests: add test for "log -S" not being a regex pickaxe tests: add test for diffgrep_consume() internals ...
This commit is contained in:
39
diff.c
39
diff.c
@ -2340,7 +2340,7 @@ static void find_lno(const char *line, struct emit_callback *ecbdata)
|
||||
ecbdata->lno_in_postimage = strtol(p + 1, NULL, 10);
|
||||
}
|
||||
|
||||
static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
static int fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct emit_callback *ecbdata = priv;
|
||||
struct diff_options *o = ecbdata->opt;
|
||||
@ -2376,7 +2376,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
len = sane_truncate_line(line, len);
|
||||
find_lno(line, ecbdata);
|
||||
emit_hunk_header(ecbdata, line, len);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ecbdata->diff_words) {
|
||||
@ -2386,11 +2386,11 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
if (line[0] == '-') {
|
||||
diff_words_append(line, len,
|
||||
&ecbdata->diff_words->minus);
|
||||
return;
|
||||
return 0;
|
||||
} else if (line[0] == '+') {
|
||||
diff_words_append(line, len,
|
||||
&ecbdata->diff_words->plus);
|
||||
return;
|
||||
return 0;
|
||||
} else if (starts_with(line, "\\ ")) {
|
||||
/*
|
||||
* Eat the "no newline at eof" marker as if we
|
||||
@ -2399,11 +2399,11 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
* defer processing. If this is the end of
|
||||
* preimage, more "+" lines may come after it.
|
||||
*/
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
diff_words_flush(ecbdata);
|
||||
emit_diff_symbol(o, s, line, len, 0);
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (line[0]) {
|
||||
@ -2427,6 +2427,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
|
||||
line, len, 0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pprint_rename(struct strbuf *name, const char *a, const char *b)
|
||||
@ -2526,7 +2527,7 @@ static struct diffstat_file *diffstat_add(struct diffstat_t *diffstat,
|
||||
return x;
|
||||
}
|
||||
|
||||
static void diffstat_consume(void *priv, char *line, unsigned long len)
|
||||
static int diffstat_consume(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct diffstat_t *diffstat = priv;
|
||||
struct diffstat_file *x = diffstat->files[diffstat->nr - 1];
|
||||
@ -2535,6 +2536,7 @@ static void diffstat_consume(void *priv, char *line, unsigned long len)
|
||||
x->added++;
|
||||
else if (line[0] == '-')
|
||||
x->deleted++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char mime_boundary_leader[] = "------------";
|
||||
@ -3212,7 +3214,7 @@ static void checkdiff_consume_hunk(void *priv,
|
||||
data->lineno = nb - 1;
|
||||
}
|
||||
|
||||
static void checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
static int checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct checkdiff_t *data = priv;
|
||||
int marker_size = data->conflict_marker_size;
|
||||
@ -3236,7 +3238,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
}
|
||||
bad = ws_check(line + 1, len - 1, data->ws_rule);
|
||||
if (!bad)
|
||||
return;
|
||||
return 0;
|
||||
data->status |= bad;
|
||||
err = whitespace_error_string(bad);
|
||||
fprintf(data->o->file, "%s%s:%d: %s.\n",
|
||||
@ -3248,6 +3250,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)
|
||||
} else if (line[0] == ' ') {
|
||||
data->lineno++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned char *deflate_it(char *data,
|
||||
@ -3726,7 +3729,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, discard_hunk_line,
|
||||
xecfg.flags = XDL_EMIT_NO_HUNK_HDR;
|
||||
if (xdi_diff_outf(&mf1, &mf2, NULL,
|
||||
diffstat_consume, diffstat, &xpp, &xecfg))
|
||||
die("unable to generate diffstat for %s", one->path);
|
||||
|
||||
@ -4632,6 +4636,12 @@ void diff_setup_done(struct diff_options *options)
|
||||
if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK))
|
||||
die(_("-G, -S and --find-object are mutually exclusive"));
|
||||
|
||||
if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_G_REGEX_MASK))
|
||||
die(_("-G and --pickaxe-regex are mutually exclusive, use --pickaxe-regex with -S"));
|
||||
|
||||
if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_ALL_OBJFIND_MASK))
|
||||
die(_("---pickaxe-all and --find-object are mutually exclusive, use --pickaxe-all with -G and -S"));
|
||||
|
||||
/*
|
||||
* Most of the time we can say "there are changes"
|
||||
* only by checking if there are changed paths, but
|
||||
@ -6119,17 +6129,18 @@ void flush_one_hunk(struct object_id *result, git_hash_ctx *ctx)
|
||||
}
|
||||
}
|
||||
|
||||
static void patch_id_consume(void *priv, char *line, unsigned long len)
|
||||
static int patch_id_consume(void *priv, char *line, unsigned long len)
|
||||
{
|
||||
struct patch_id_t *data = priv;
|
||||
int new_len;
|
||||
|
||||
if (len > 12 && starts_with(line, "\\ "))
|
||||
return;
|
||||
return 0;
|
||||
new_len = remove_space(line, len);
|
||||
|
||||
the_hash_algo->update_fn(data->ctx, line, new_len);
|
||||
data->patchlen += new_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void patch_id_add_string(git_hash_ctx *ctx, const char *str)
|
||||
@ -6227,8 +6238,8 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
|
||||
|
||||
xpp.flags = 0;
|
||||
xecfg.ctxlen = 3;
|
||||
xecfg.flags = 0;
|
||||
if (xdi_diff_outf(&mf1, &mf2, discard_hunk_line,
|
||||
xecfg.flags = XDL_EMIT_NO_HUNK_HDR;
|
||||
if (xdi_diff_outf(&mf1, &mf2, NULL,
|
||||
patch_id_consume, &data, &xpp, &xecfg))
|
||||
return error("unable to generate patch-id diff for %s",
|
||||
p->one->path);
|
||||
|
||||
Reference in New Issue
Block a user