diff: add -I<regex> that ignores matching changes
Add a new diff option that enables ignoring changes whose all lines (changed, removed, and added) match a given regular expression. This is similar to the -I/--ignore-matching-lines option in standalone diff utilities and can be used e.g. to ignore changes which only affect code comments or to look for unrelated changes in commits containing a large number of automatically applied modifications (e.g. a tree-wide string replacement). The difference between -G/-S and the new -I option is that the latter filters output on a per-change basis. Use the 'ignore' field of xdchange_t for marking a change as ignored or not. Since the same field is used by --ignore-blank-lines, identical hunk emitting rules apply for --ignore-blank-lines and -I. These two options can also be used together in the same git invocation (they are complementary to each other). Rename xdl_mark_ignorable() to xdl_mark_ignorable_lines(), to indicate that it is logically a "sibling" of xdl_mark_ignorable_regex() rather than its "parent". Signed-off-by: Michał Kępień <michal@isc.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
ec7967cfaf
commit
296d4a94e7
23
diff.c
23
diff.c
@ -3584,6 +3584,8 @@ static void builtin_diff(const char *name_a,
|
||||
if (header.len && !o->flags.suppress_diff_headers)
|
||||
ecbdata.header = &header;
|
||||
xpp.flags = o->xdl_opts;
|
||||
xpp.ignore_regex = o->ignore_regex;
|
||||
xpp.ignore_regex_nr = o->ignore_regex_nr;
|
||||
xpp.anchors = o->anchors;
|
||||
xpp.anchors_nr = o->anchors_nr;
|
||||
xecfg.ctxlen = o->context;
|
||||
@ -3711,6 +3713,8 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
|
||||
memset(&xpp, 0, sizeof(xpp));
|
||||
memset(&xecfg, 0, sizeof(xecfg));
|
||||
xpp.flags = o->xdl_opts;
|
||||
xpp.ignore_regex = o->ignore_regex;
|
||||
xpp.ignore_regex_nr = o->ignore_regex_nr;
|
||||
xpp.anchors = o->anchors;
|
||||
xpp.anchors_nr = o->anchors_nr;
|
||||
xecfg.ctxlen = o->context;
|
||||
@ -5174,6 +5178,22 @@ static int diff_opt_patience(const struct option *opt,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_ignore_regex(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
struct diff_options *options = opt->value;
|
||||
regex_t *regex;
|
||||
|
||||
BUG_ON_OPT_NEG(unset);
|
||||
regex = xmalloc(sizeof(*regex));
|
||||
if (regcomp(regex, arg, REG_EXTENDED | REG_NEWLINE))
|
||||
return error(_("invalid regex given to -I: '%s'"), arg);
|
||||
ALLOC_GROW(options->ignore_regex, options->ignore_regex_nr + 1,
|
||||
options->ignore_regex_alloc);
|
||||
options->ignore_regex[options->ignore_regex_nr++] = regex;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int diff_opt_pickaxe_regex(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
{
|
||||
@ -5462,6 +5482,9 @@ static void prep_parse_options(struct diff_options *options)
|
||||
OPT_BIT_F(0, "ignore-blank-lines", &options->xdl_opts,
|
||||
N_("ignore changes whose lines are all blank"),
|
||||
XDF_IGNORE_BLANK_LINES, PARSE_OPT_NONEG),
|
||||
OPT_CALLBACK_F('I', "ignore-matching-lines", options, N_("<regex>"),
|
||||
N_("ignore changes whose all lines match <regex>"),
|
||||
0, diff_opt_ignore_regex),
|
||||
OPT_BIT(0, "indent-heuristic", &options->xdl_opts,
|
||||
N_("heuristic to shift diff hunk boundaries for easy reading"),
|
||||
XDF_INDENT_HEURISTIC),
|
||||
|
||||
Reference in New Issue
Block a user