summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEoin Coffey <ecoffey@gmail.com>2014-05-23 12:27:16 -0600
committerEoin Coffey <ecoffey@gmail.com>2014-05-23 12:27:16 -0600
commit161e6dc1cacb724543c81ee0a62ed28742a81190 (patch)
tree6bfefd48f20aabd326e652942ad23d32af5c3ca1
parent97fc71ab3b935df5f32faae13035e40eeb03c07f (diff)
downloadlibgit2-161e6dc1cacb724543c81ee0a62ed28742a81190.tar.gz
Add --committer option, and break out helper function
-rw-r--r--examples/log.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/examples/log.c b/examples/log.c
index 655b95d10..5a43f632a 100644
--- a/examples/log.c
+++ b/examples/log.c
@@ -44,6 +44,7 @@ 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);
@@ -55,7 +56,7 @@ struct log_options {
git_time_t before;
git_time_t after;
const char *author;
- char *committer;
+ const char *committer;
};
/** utility functions that parse options and help with log output */
@@ -75,7 +76,6 @@ int main(int argc, char *argv[])
git_oid oid;
git_commit *commit = NULL;
git_pathspec *ps = NULL;
- const git_signature *sig;
git_threads_init();
@@ -129,11 +129,11 @@ int main(int argc, char *argv[])
continue;
}
- if (opt.author != NULL) {
- if ((sig = git_commit_author(commit)) == NULL ||
- strstr(sig->name, opt.author) == NULL)
- continue;
- }
+ if (signature_does_not_match(git_commit_author(commit), opt.author))
+ continue;
+
+ if (signature_does_not_match(git_commit_committer(commit), opt.committer))
+ continue;
if (count++ < opt.skip)
continue;
@@ -179,6 +179,18 @@ int main(int argc, char *argv[])
return 0;
}
+/** Determine if the given git_signature does not contain the filter text. */
+static int signature_does_not_match(const git_signature *sig, const char *filter) {
+ if (filter == NULL)
+ return 0;
+
+ if (sig == NULL ||
+ (strstr(sig->name, filter) == NULL &&
+ strstr(sig->email, filter) == NULL))
+ return 1;
+ return 0;
+}
+
/** Push object (for hide or show) onto revwalker. */
static void push_rev(struct log_state *s, git_object *obj, int hide)
{
@@ -410,6 +422,8 @@ static int parse_options(
set_sorting(s, GIT_SORT_REVERSE);
else if (match_str_arg(&opt->author, &args, "--author"))
/** Found valid --author */;
+ else if (match_str_arg(&opt->committer, &args, "--committer"))
+ /** Found valid --committer */;
else if (match_str_arg(&s->repodir, &args, "--git-dir"))
/** Found git-dir. */;
else if (match_int_arg(&opt->skip, &args, "--skip", 0))