Reorganize rev-parse example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
diff --git a/examples/rev-parse.c b/examples/rev-parse.c
index cdbb61e..21f87c8 100644
--- a/examples/rev-parse.c
+++ b/examples/rev-parse.c
@@ -1,17 +1,37 @@
-#include <stdio.h>
-#include <git2.h>
-#include <stdlib.h>
-#include <string.h>
+/*
+ * Copyright (C) the libgit2 contributors. All rights reserved.
+ *
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
+ * a Linking Exception. For full terms see the included COPYING file.
+ */
-static void check(int error, const char *message, const char *arg)
+#include "common.h"
+
+
+/* Forward declarations for helpers */
+struct parse_state {
+ git_repository *repo;
+ const char *repodir;
+ const char *spec;
+ int not;
+};
+static void parse_opts(struct parse_state *ps, int argc, char *argv[]);
+static int parse_revision(struct parse_state *ps);
+
+
+int main(int argc, char *argv[])
{
- if (!error)
- return;
- if (arg)
- fprintf(stderr, "%s %s (%d)\n", message, arg, error);
- else
- fprintf(stderr, "%s(%d)\n", message, error);
- exit(1);
+ struct parse_state ps = {0};
+
+ git_threads_init();
+ parse_opts(&ps, argc, argv);
+
+ check_lg2(parse_revision(&ps), "Parsing", NULL);
+
+ git_repository_free(ps.repo);
+ git_threads_shutdown();
+
+ return 0;
}
static void usage(const char *message, const char *arg)
@@ -24,13 +44,25 @@ static void usage(const char *message, const char *arg)
exit(1);
}
-struct parse_state {
- git_repository *repo;
- const char *repodir;
- int not;
-};
+static void parse_opts(struct parse_state *ps, int argc, char *argv[])
+{
+ struct args_info args = ARGS_INFO_INIT;
-static int parse_revision(struct parse_state *ps, const char *revstr)
+ for (args.pos=1; args.pos < argc; ++args.pos) {
+ const char *a = argv[args.pos];
+
+ if (a[0] != '-') {
+ if (ps->spec)
+ usage("Too many specs", a);
+ ps->spec = a;
+ } else if (!strcmp(a, "--not"))
+ ps->not = !ps->not;
+ else if (!match_str_arg(&ps->repodir, &args, "--git-dir"))
+ usage("Cannot handle argument", a);
+ }
+}
+
+static int parse_revision(struct parse_state *ps)
{
git_revspec rs;
char str[GIT_OID_HEXSZ + 1];
@@ -38,11 +70,11 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
if (!ps->repo) {
if (!ps->repodir)
ps->repodir = ".";
- check(git_repository_open_ext(&ps->repo, ps->repodir, 0, NULL),
+ check_lg2(git_repository_open_ext(&ps->repo, ps->repodir, 0, NULL),
"Could not open repository from", ps->repodir);
}
- check(git_revparse(&rs, ps->repo, revstr), "Could not parse", revstr);
+ check_lg2(git_revparse(&rs, ps->repo, ps->spec), "Could not parse", ps->spec);
if ((rs.flags & GIT_REVPARSE_SINGLE) != 0) {
git_oid_tostr(str, sizeof(str), git_object_id(rs.from));
@@ -56,9 +88,9 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
if ((rs.flags & GIT_REVPARSE_MERGE_BASE) != 0) {
git_oid base;
- check(git_merge_base(&base, ps->repo,
- git_object_id(rs.from), git_object_id(rs.to)),
- "Could not find merge base", revstr);
+ check_lg2(git_merge_base(&base, ps->repo,
+ git_object_id(rs.from), git_object_id(rs.to)),
+ "Could not find merge base", ps->spec);
git_oid_tostr(str, sizeof(str), &base);
printf("%s\n", str);
@@ -69,38 +101,9 @@ static int parse_revision(struct parse_state *ps, const char *revstr)
git_object_free(rs.from);
}
else {
- check(0, "Invalid results from git_revparse", revstr);
+ fatal("Invalid results from git_revparse", ps->spec);
}
return 0;
}
-int main(int argc, char *argv[])
-{
- int i;
- char *a;
- struct parse_state ps;
-
- git_threads_init();
-
- memset(&ps, 0, sizeof(ps));
-
- for (i = 1; i < argc; ++i) {
- a = argv[i];
-
- if (a[0] != '-') {
- if (parse_revision(&ps, a) != 0)
- break;
- } else if (!strcmp(a, "--not"))
- ps.not = !ps.not;
- else if (!strncmp(a, "--git-dir=", strlen("--git-dir=")))
- ps.repodir = a + strlen("--git-dir=");
- else
- usage("Cannot handle argument", a);
- }
-
- git_repository_free(ps.repo);
- git_threads_shutdown();
-
- return 0;
-}