summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <vicent@github.com>2014-05-29 14:51:25 +0200
committerVicent Marti <vicent@github.com>2014-05-29 14:51:25 +0200
commit19d77ce10937a5b86e114192f816fef9ba7e23b3 (patch)
treef51e64899a55610c6f0cf5a7cfa6fa54d465b2f2
parent31c551528b3f3bc7bd1d944ed582fc7a379806c6 (diff)
parent33bf1b1ab0e14453e67e94dc6aa679dcdcce56e8 (diff)
downloadlibgit2-19d77ce10937a5b86e114192f816fef9ba7e23b3.tar.gz
Merge pull request #2381 from ecoffey/example_log_author_filter
Add support for --author flag in example log implementation
-rw-r--r--PROJECTS.md6
-rw-r--r--examples/log.c49
2 files changed, 47 insertions, 8 deletions
diff --git a/PROJECTS.md b/PROJECTS.md
index 9472fb43c..d17214471 100644
--- a/PROJECTS.md
+++ b/PROJECTS.md
@@ -39,12 +39,6 @@ These are good small projects to get started with libgit2.
the data is available, you would just need to add the code into the
`print_commit()` routine (along with a way of passing the option
into that function).
- * For `examples/log.c`, implement any one of `--author=<...>`,
- `--committer=<...>`, or `--grep=<...>` but just use simple string
- match with `strstr()` instead of full regular expression
- matching. (I.e. I'm suggesting implementing this as if
- `--fixed-strings` was always turned on, because it will be a simpler
- project.)
* As an extension to the matching idea for `examples/log.c`, add the
`-i` option to use `strcasestr()` for matches.
* For `examples/log.c`, implement the `--first-parent` option now that
diff --git a/examples/log.c b/examples/log.c
index 471c5ff96..d5f75a297 100644
--- a/examples/log.c
+++ b/examples/log.c
@@ -54,8 +54,9 @@ struct log_options {
int min_parents, max_parents;
git_time_t before;
git_time_t after;
- char *author;
- char *committer;
+ const char *author;
+ const char *committer;
+ const char *grep;
};
/** utility functions that parse options and help with log output */
@@ -65,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_matches(const git_signature *sig, const char *filter);
+static int log_message_matches(const git_commit *commit, const char *filter);
int main(int argc, char *argv[])
{
@@ -128,6 +132,15 @@ int main(int argc, char *argv[])
continue;
}
+ if (!signature_matches(git_commit_author(commit), opt.author))
+ continue;
+
+ if (!signature_matches(git_commit_committer(commit), opt.committer))
+ continue;
+
+ if (!log_message_matches(commit, opt.grep))
+ continue;
+
if (count++ < opt.skip)
continue;
if (opt.limit != -1 && printed++ >= opt.limit) {
@@ -172,6 +185,32 @@ int main(int argc, char *argv[])
return 0;
}
+/** Determine if the given git_signature does not contain the filter text. */
+static int signature_matches(const git_signature *sig, const char *filter) {
+ if (filter == NULL)
+ return 1;
+
+ if (sig != NULL &&
+ (strstr(sig->name, filter) != NULL ||
+ strstr(sig->email, filter) != NULL))
+ return 1;
+
+ return 0;
+}
+
+static int log_message_matches(const git_commit *commit, const char *filter) {
+ const char *message = NULL;
+
+ if (filter == NULL)
+ return 1;
+
+ if ((message = git_commit_message(commit)) != NULL &&
+ strstr(message, 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)
{
@@ -401,6 +440,12 @@ static int parse_options(
set_sorting(s, GIT_SORT_TOPOLOGICAL);
else if (!strcmp(a, "--reverse"))
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(&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))