summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorEtienne Samson <samson.etienne@gmail.com>2019-11-06 11:08:52 +0100
committerEtienne Samson <samson.etienne@gmail.com>2019-11-06 11:17:56 +0100
commitfe42557a6f17db9345f1b5f7cb17a9784e59ea5f (patch)
tree563ac7d22599b4d4f0f8f5f99c5fcefea87fbe7a /examples
parent313908f9f5322f623ef1924f859726b39cb9740c (diff)
downloadlibgit2-fe42557a6f17db9345f1b5f7cb17a9784e59ea5f.tar.gz
examples: buff up rev-list by adding OID support
This allows the example to be used as a quick revwalk test harness.
Diffstat (limited to 'examples')
-rw-r--r--examples/rev-list.c80
1 files changed, 58 insertions, 22 deletions
diff --git a/examples/rev-list.c b/examples/rev-list.c
index c366ecea2..75fb19e70 100644
--- a/examples/rev-list.c
+++ b/examples/rev-list.c
@@ -15,16 +15,24 @@
#include "common.h"
-static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts);
+#include <assert.h>
+
+static int revwalk_parse_options(git_sort_t *sort, struct args_info *args);
+static int revwalk_parse_revs(git_repository *repo, git_revwalk *walk, struct args_info *args);
int lg2_rev_list(git_repository *repo, int argc, char **argv)
{
+ struct args_info args = ARGS_INFO_INIT;
git_revwalk *walk;
git_oid oid;
+ git_sort_t sort;
char buf[GIT_OID_HEXSZ+1];
+ check_lg2(revwalk_parse_options(&sort, &args), "parsing options", NULL);
+
check_lg2(git_revwalk_new(&walk, repo), "allocating revwalk", NULL);
- check_lg2(revwalk_parseopts(repo, walk, argc-1, argv+1), "parsing options", NULL);
+ git_revwalk_sorting(walk, sort);
+ check_lg2(revwalk_parse_revs(repo, walk, &args), "parsing revs", NULL);
while (!git_revwalk_next(&oid, walk)) {
git_oid_fmt(buf, &oid);
@@ -32,6 +40,7 @@ int lg2_rev_list(git_repository *repo, int argc, char **argv)
printf("%s\n", buf);
}
+ git_revwalk_free(walk);
return 0;
}
@@ -80,33 +89,60 @@ out:
return error;
}
-static int revwalk_parseopts(git_repository *repo, git_revwalk *walk, int nopts, char **opts)
+static void print_usage(void)
+{
+ fprintf(stderr, "rev-list [--git-dir=dir] [--topo-order|--date-order] [--reverse] <revspec>\n");
+ exit(-1);
+}
+
+static int revwalk_parse_options(git_sort_t *sort, struct args_info *args)
{
- int hide, i, error;
- unsigned int sorting = GIT_SORT_NONE;
+ assert(sort && args);
+ *sort = GIT_SORT_NONE;
+
+ if (args->argc < 1)
+ print_usage();
+
+ for (args->pos = 1; args->pos < args->argc; ++args->pos) {
+ const char *curr = args->argv[args->pos];
+
+ if (!strcmp(curr, "--topo-order")) {
+ *sort |= GIT_SORT_TOPOLOGICAL;
+ } else if (!strcmp(curr, "--date-order")) {
+ *sort |= GIT_SORT_TIME;
+ } else if (!strcmp(curr, "--reverse")) {
+ *sort |= (*sort & ~GIT_SORT_REVERSE) ^ GIT_SORT_REVERSE;
+ } else {
+ break;
+ }
+ }
+ return 0;
+}
+
+static int revwalk_parse_revs(git_repository *repo, git_revwalk *walk, struct args_info *args)
+{
+ int hide, error;
+ git_oid oid;
hide = 0;
- for (i = 0; i < nopts; i++) {
- if (!strcmp(opts[i], "--topo-order")) {
- sorting = GIT_SORT_TOPOLOGICAL | (sorting & GIT_SORT_REVERSE);
- git_revwalk_sorting(walk, sorting);
- } else if (!strcmp(opts[i], "--date-order")) {
- sorting = GIT_SORT_TIME | (sorting & GIT_SORT_REVERSE);
- git_revwalk_sorting(walk, sorting);
- } else if (!strcmp(opts[i], "--reverse")) {
- sorting = (sorting & ~GIT_SORT_REVERSE)
- | ((sorting & GIT_SORT_REVERSE) ? 0 : GIT_SORT_REVERSE);
- git_revwalk_sorting(walk, sorting);
- } else if (!strcmp(opts[i], "--not")) {
+ for (; args->pos < args->argc; ++args->pos) {
+ const char *curr = args->argv[args->pos];
+
+ if (!strcmp(curr, "--not")) {
hide = !hide;
- } else if (opts[i][0] == '^') {
- if ((error = push_spec(repo, walk, opts[i] + 1, !hide)))
+ } else if (curr[0] == '^') {
+ if ((error = push_spec(repo, walk, curr + 1, !hide)))
return error;
- } else if (strstr(opts[i], "..")) {
- if ((error = push_range(repo, walk, opts[i], hide)))
+ } else if (strstr(curr, "..")) {
+ if ((error = push_range(repo, walk, curr, hide)))
return error;
} else {
- if ((error = push_spec(repo, walk, opts[i], hide)))
+ if (push_spec(repo, walk, curr, hide) == 0)
+ continue;
+
+ if ((error = git_oid_fromstr(&oid, curr)))
+ return error;
+ if ((error = push_commit(walk, &oid, hide)))
return error;
}
}