Example usage: git log --invert-match --grep="uninteresting" This command will prune out all commits that match the grep pattern. How it works: The --invert-match flag sets invert_match, in rev_info. This boolean is later checked in commit_match() and if set it inverts the result of grep_buffer(). Signed-off-by: Bart Trojanowski <bart@xxxxxxxxx> --- This patch includes the Documentation update I missed in the first patch. Documentation/git-rev-list.txt | 6 ++++++ revision.c | 11 ++++++++++- revision.h | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt index 7cd0e89..f7a4891 100644 --- a/Documentation/git-rev-list.txt +++ b/Documentation/git-rev-list.txt @@ -29,6 +29,7 @@ SYNOPSIS [ \--(author|committer|grep)=<pattern> ] [ \--regexp-ignore-case | \-i ] [ \--extended-regexp | \-E ] + [ \--invert-match ] [ \--date={local|relative|default|iso|rfc|short} ] [ [\--objects | \--objects-edge] [ \--unpacked ] ] [ \--pretty | \--header ] @@ -238,6 +239,11 @@ limiting may be applied. Consider the limiting patterns to be extended regular expressions instead of the default basic regular expressions. +--invert-match:: + + Show those parts of history that do not match any of the regular + expression patterns. + --remove-empty:: Stop when a given path disappears from the tree. diff --git a/revision.c b/revision.c index 33d092c..57b2d0f 100644 --- a/revision.c +++ b/revision.c @@ -1182,6 +1182,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch regflags |= REG_ICASE; continue; } + if (!strcmp(arg, "--invert-match")) { + revs->invert_match = 1; + continue; + } if (!strcmp(arg, "--all-match")) { all_match = 1; continue; @@ -1383,11 +1387,16 @@ static int rewrite_parents(struct rev_info *revs, struct commit *commit) static int commit_match(struct commit *commit, struct rev_info *opt) { + int result; + if (!opt->grep_filter) return 1; - return grep_buffer(opt->grep_filter, + + result = grep_buffer(opt->grep_filter, NULL, /* we say nothing, not even filename */ commit->buffer, strlen(commit->buffer)); + + return opt->invert_match ? !result : result; } static struct commit *get_revision_1(struct rev_info *revs) diff --git a/revision.h b/revision.h index 98a0a8f..ead04a7 100644 --- a/revision.h +++ b/revision.h @@ -48,7 +48,8 @@ struct rev_info { parents:1, reverse:1, cherry_pick:1, - first_parent_only:1; + first_parent_only:1, + invert_match:1; /* Diff flags */ unsigned int diff:1, -- 1.5.3.1.154.g734e65 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html