From b9d02460f14151909b39fc963d119b373834f6d1 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Wed, 30 Oct 2013 13:07:58 -0700 Subject: [PATCH] Reorganize rev-parse example --- examples/rev-parse.c | 109 ++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/examples/rev-parse.c b/examples/rev-parse.c index cdbb61e46..21f87c881 100644 --- a/examples/rev-parse.c +++ b/examples/rev-parse.c @@ -1,17 +1,37 @@ -#include -#include -#include -#include +/* + * 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; -}