diff options
author | Eoin Coffey <ecoffey@gmail.com> | 2014-05-23 12:59:19 -0600 |
---|---|---|
committer | Eoin Coffey <ecoffey@gmail.com> | 2014-05-23 12:59:19 -0600 |
commit | 26cce32133363133b479cfd811523270db851466 (patch) | |
tree | 94678e80247bd9b312bdaceb2c85b372c1ba9b07 | |
parent | 161e6dc1cacb724543c81ee0a62ed28742a81190 (diff) | |
download | libgit2-26cce32133363133b479cfd811523270db851466.tar.gz |
Add support for --grep
-rw-r--r-- | examples/log.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/examples/log.c b/examples/log.c index 5a43f632a..965f854d7 100644 --- a/examples/log.c +++ b/examples/log.c @@ -44,7 +44,6 @@ struct log_state { /** utility functions that are called to configure the walker */ static void set_sorting(struct log_state *s, unsigned int sort_mode); -static int signature_does_not_match(const git_signature *sig, const char *filter); static void push_rev(struct log_state *s, git_object *obj, int hide); static int add_revision(struct log_state *s, const char *revstr); @@ -57,6 +56,7 @@ struct log_options { git_time_t after; const char *author; const char *committer; + const char *grep; }; /** utility functions that parse options and help with log output */ @@ -66,6 +66,9 @@ static void print_time(const git_time *intime, const char *prefix); static void print_commit(git_commit *commit); static int match_with_parent(git_commit *commit, int i, git_diff_options *); +/** utility functions for filtering */ +static int signature_does_not_match(const git_signature *sig, const char *filter); +static int log_message_does_not_match(const git_commit *commit, const char *filter); int main(int argc, char *argv[]) { @@ -135,6 +138,9 @@ int main(int argc, char *argv[]) if (signature_does_not_match(git_commit_committer(commit), opt.committer)) continue; + if (log_message_does_not_match(commit, opt.grep)) + continue; + if (count++ < opt.skip) continue; if (opt.limit != -1 && printed++ >= opt.limit) { @@ -188,6 +194,20 @@ static int signature_does_not_match(const git_signature *sig, const char *filter (strstr(sig->name, filter) == NULL && strstr(sig->email, filter) == NULL)) return 1; + + return 0; +} + +static int log_message_does_not_match(const git_commit *commit, const char *filter) { + const char *message = NULL; + + if (filter == NULL) + return 0; + + if ((message = git_commit_message(commit)) == NULL || + strstr(message, filter) == NULL) + return 1; + return 0; } @@ -424,6 +444,8 @@ static int parse_options( /** Found valid --author */; else if (match_str_arg(&opt->committer, &args, "--committer")) /** Found valid --committer */; + else if (match_str_arg(&opt->grep, &args, "--grep")) + /** Found valid --grep */; else if (match_str_arg(&s->repodir, &args, "--git-dir")) /** Found git-dir. */; else if (match_int_arg(&opt->skip, &args, "--skip", 0)) |