diff options
author | Patrick Steinhardt <ps@pks.im> | 2019-11-28 13:51:40 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-28 13:51:40 +0100 |
commit | dfea0713e04fa4f9f129b85c2262e7d0420aaaf3 (patch) | |
tree | 2d3252f9720402e3c176e6073118b8621182db79 /examples | |
parent | b63ad95888d867d8931b66b789cf86b89542ca0c (diff) | |
parent | fe42557a6f17db9345f1b5f7cb17a9784e59ea5f (diff) | |
download | libgit2-dfea0713e04fa4f9f129b85c2262e7d0420aaaf3.tar.gz |
Merge pull request #5272 from tiennou/examples/cli-ification
Various examples shape-ups
Diffstat (limited to 'examples')
-rw-r--r-- | examples/CMakeLists.txt | 2 | ||||
-rw-r--r-- | examples/add.c | 97 | ||||
-rw-r--r-- | examples/args.c | 197 | ||||
-rw-r--r-- | examples/args.h | 90 | ||||
-rw-r--r-- | examples/blame.c | 8 | ||||
-rw-r--r-- | examples/cat-file.c | 15 | ||||
-rw-r--r-- | examples/checkout.c | 9 | ||||
-rw-r--r-- | examples/common.c | 183 | ||||
-rw-r--r-- | examples/common.h | 78 | ||||
-rw-r--r-- | examples/describe.c | 21 | ||||
-rw-r--r-- | examples/diff.c | 20 | ||||
-rw-r--r-- | examples/for-each-ref.c | 66 | ||||
-rw-r--r-- | examples/init.c | 8 | ||||
-rw-r--r-- | examples/lg2.c | 3 | ||||
-rw-r--r-- | examples/log.c | 3 | ||||
-rw-r--r-- | examples/ls-files.c | 12 | ||||
-rw-r--r-- | examples/merge.c | 17 | ||||
-rw-r--r-- | examples/remote.c | 28 | ||||
-rw-r--r-- | examples/rev-list.c | 80 | ||||
-rw-r--r-- | examples/show-index.c | 2 | ||||
-rw-r--r-- | examples/status.c | 8 | ||||
-rw-r--r-- | examples/tag.c | 18 |
22 files changed, 521 insertions, 444 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 05e344df1..8cc72b35e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ INCLUDE_DIRECTORIES(${LIBGIT2_INCLUDES}) INCLUDE_DIRECTORIES(SYSTEM ${LIBGIT2_SYSTEM_INCLUDES}) -FILE(GLOB LG2_SOURCES *.c) +FILE(GLOB LG2_SOURCES *.c *.h) ADD_EXECUTABLE(lg2 ${LG2_SOURCES}) SET_TARGET_PROPERTIES(lg2 PROPERTIES C_STANDARD 90) diff --git a/examples/add.c b/examples/add.c index 14e69e96f..6e3c239fc 100644 --- a/examples/add.c +++ b/examples/add.c @@ -13,7 +13,6 @@ */ #include "common.h" -#include <assert.h> /** * The following example demonstrates how to add files with libgit2. @@ -27,48 +26,50 @@ * -u/--update: update the index instead of adding to it. */ -enum print_options { - SKIP = 1, - VERBOSE = 2, - UPDATE = 4, +enum index_mode { + INDEX_NONE, + INDEX_ADD, }; -struct print_payload { - enum print_options options; +struct index_options { + int dry_run; + int verbose; git_repository *repo; + enum index_mode mode; + int add_update; }; /* Forward declarations for helpers */ -static void parse_opts(int *options, int *count, int argc, char *argv[]); -void init_array(git_strarray *array, int argc, char **argv); +static void parse_opts(const char **repo_path, struct index_options *opts, struct args_info *args); int print_matched_cb(const char *path, const char *matched_pathspec, void *payload); -int lg2_add(git_repository *repo, int argc, char** argv) +int lg2_add(git_repository *repo, int argc, char **argv) { git_index_matched_path_cb matched_cb = NULL; git_index *index; git_strarray array = {0}; - int options = 0, count = 0; - struct print_payload payload = {0}; + struct index_options options; + struct args_info args = ARGS_INFO_INIT; - parse_opts(&options, &count, argc, argv); - init_array(&array, argc-count, argv+count); + /* Parse the options & arguments. */ + parse_opts(NULL, &options, &args); + strarray_from_args(&array, &args); + /* Grab the repository's index. */ check_lg2(git_repository_index(&index, repo), "Could not open repository index", NULL); /* Setup a callback if the requested options need it */ - if ((options & VERBOSE) || (options & SKIP)) { + if (options.verbose || options.dry_run) { matched_cb = &print_matched_cb; } - /* Perform the requested action with the index and files */ - payload.options = options; - payload.repo = repo; + options.repo = repo; - if (options & UPDATE) { - git_index_update_all(index, &array, matched_cb, &payload); + /* Perform the requested action with the index and files */ + if (options.add_update) { + git_index_update_all(index, &array, matched_cb, &options); } else { - git_index_add_all(index, &array, 0, matched_cb, &payload); + git_index_add_all(index, &array, 0, matched_cb, &options); } /* Cleanup memory */ @@ -85,15 +86,14 @@ int lg2_add(git_repository *repo, int argc, char** argv) */ int print_matched_cb(const char *path, const char *matched_pathspec, void *payload) { - struct print_payload p = *(struct print_payload*)(payload); + struct index_options *opts = (struct index_options *)(payload); int ret; unsigned status; (void)matched_pathspec; /* Get the file status */ - if (git_status_file(&status, p.repo, path)) { + if (git_status_file(&status, opts->repo, path) < 0) return -1; - } if ((status & GIT_STATUS_WT_MODIFIED) || (status & GIT_STATUS_WT_NEW)) { printf("add '%s'\n", path); @@ -102,9 +102,8 @@ int print_matched_cb(const char *path, const char *matched_pathspec, void *paylo ret = 1; } - if ((p.options & SKIP)) { + if (opts->dry_run) ret = 1; - } return ret; } @@ -133,33 +132,39 @@ void print_usage(void) exit(1); } -static void parse_opts(int *options, int *count, int argc, char *argv[]) +static void parse_opts(const char **repo_path, struct index_options *opts, struct args_info *args) { - int i; + if (args->argc <= 1) + print_usage(); - for (i = 1; i < argc; ++i) { - if (argv[i][0] != '-') - break; - else if (!strcmp(argv[i], "--verbose") || !strcmp(argv[i], "-v")) - *options |= VERBOSE; - else if (!strcmp(argv[i], "--dry-run") || !strcmp(argv[i], "-n")) - *options |= SKIP; - else if (!strcmp(argv[i], "--update") || !strcmp(argv[i], "-u")) - *options |= UPDATE; - else if (!strcmp(argv[i], "-h")) { + for (args->pos = 1; args->pos < args->argc; ++args->pos) { + const char *curr = args->argv[args->pos]; + + if (curr[0] != '-') { + if (!strcmp("add", curr)) { + opts->mode = INDEX_ADD; + continue; + } else if (opts->mode == INDEX_NONE) { + fprintf(stderr, "missing command: %s", curr); + print_usage(); + break; + } else { + /* We might be looking at a filename */ + break; + } + } else if (match_bool_arg(&opts->verbose, args, "--verbose") || + match_bool_arg(&opts->dry_run, args, "--dry-run") || + match_str_arg(repo_path, args, "--git-dir") || + (opts->mode == INDEX_ADD && match_bool_arg(&opts->add_update, args, "--update"))) { + continue; + } else if (match_bool_arg(NULL, args, "--help")) { print_usage(); break; - } else if (!strcmp(argv[i], "--")) { - i++; + } else if (match_arg_separator(args)) { break; } else { - fprintf(stderr, "Unsupported option %s.\n", argv[i]); + fprintf(stderr, "Unsupported option %s.\n", curr); print_usage(); } } - - if (argc <= i) - print_usage(); - - *count = i; } diff --git a/examples/args.c b/examples/args.c new file mode 100644 index 000000000..533e1579b --- /dev/null +++ b/examples/args.c @@ -0,0 +1,197 @@ +#include "common.h" +#include "args.h" + +size_t is_prefixed(const char *str, const char *pfx) +{ + size_t len = strlen(pfx); + return strncmp(str, pfx, len) ? 0 : len; +} + +int optional_str_arg( + const char **out, struct args_info *args, const char *opt, const char *def) +{ + const char *found = args->argv[args->pos]; + size_t len = is_prefixed(found, opt); + + if (!len) + return 0; + + if (!found[len]) { + if (args->pos + 1 == args->argc) { + *out = def; + return 1; + } + args->pos += 1; + *out = args->argv[args->pos]; + return 1; + } + + if (found[len] == '=') { + *out = found + len + 1; + return 1; + } + + return 0; +} + +int match_str_arg( + const char **out, struct args_info *args, const char *opt) +{ + const char *found = args->argv[args->pos]; + size_t len = is_prefixed(found, opt); + + if (!len) + return 0; + + if (!found[len]) { + if (args->pos + 1 == args->argc) + fatal("expected value following argument", opt); + args->pos += 1; + *out = args->argv[args->pos]; + return 1; + } + + if (found[len] == '=') { + *out = found + len + 1; + return 1; + } + + return 0; +} + +static const char *match_numeric_arg(struct args_info *args, const char *opt) +{ + const char *found = args->argv[args->pos]; + size_t len = is_prefixed(found, opt); + + if (!len) + return NULL; + + if (!found[len]) { + if (args->pos + 1 == args->argc) + fatal("expected numeric value following argument", opt); + args->pos += 1; + found = args->argv[args->pos]; + } else { + found = found + len; + if (*found == '=') + found++; + } + + return found; +} + +int match_uint16_arg( + uint16_t *out, struct args_info *args, const char *opt) +{ + const char *found = match_numeric_arg(args, opt); + uint16_t val; + char *endptr = NULL; + + if (!found) + return 0; + + val = (uint16_t)strtoul(found, &endptr, 0); + if (!endptr || *endptr != '\0') + fatal("expected number after argument", opt); + + if (out) + *out = val; + return 1; +} + +int match_uint32_arg( + uint32_t *out, struct args_info *args, const char *opt) +{ + const char *found = match_numeric_arg(args, opt); + uint16_t val; + char *endptr = NULL; + + if (!found) + return 0; + + val = (uint32_t)strtoul(found, &endptr, 0); + if (!endptr || *endptr != '\0') + fatal("expected number after argument", opt); + + if (out) + *out = val; + return 1; +} + +static int match_int_internal( + int *out, const char *str, int allow_negative, const char *opt) +{ + char *endptr = NULL; + int val = (int)strtol(str, &endptr, 10); + + if (!endptr || *endptr != '\0') + fatal("expected number", opt); + else if (val < 0 && !allow_negative) + fatal("negative values are not allowed", opt); + + if (out) + *out = val; + + return 1; +} + +int match_bool_arg(int *out, struct args_info *args, const char *opt) +{ + const char *found = args->argv[args->pos]; + + if (!strcmp(found, opt)) { + *out = 1; + return 1; + } + + if (!strncmp(found, "--no-", strlen("--no-")) && + !strcmp(found + strlen("--no-"), opt + 2)) { + *out = 0; + return 1; + } + + *out = -1; + return 0; +} + +int is_integer(int *out, const char *str, int allow_negative) +{ + return match_int_internal(out, str, allow_negative, NULL); +} + +int match_int_arg( + int *out, struct args_info *args, const char *opt, int allow_negative) +{ + const char *found = match_numeric_arg(args, opt); + if (!found) + return 0; + return match_int_internal(out, found, allow_negative, opt); +} + +int match_arg_separator(struct args_info *args) +{ + if (args->opts_done) + return 1; + + if (strcmp(args->argv[args->pos], "--") != 0) + return 0; + + args->opts_done = 1; + args->pos++; + return 1; +} + +void strarray_from_args(git_strarray *array, struct args_info *args) +{ + size_t i; + + array->count = args->argc - args->pos; + array->strings = calloc(array->count, sizeof(char *)); + assert(array->strings != NULL); + + for (i = 0; args->pos < args->argc; ++args->pos) { + array->strings[i++] = args->argv[args->pos]; + } + args->pos = args->argc; +} diff --git a/examples/args.h b/examples/args.h new file mode 100644 index 000000000..d626f98c8 --- /dev/null +++ b/examples/args.h @@ -0,0 +1,90 @@ +#ifndef INCLUDE_examples_args_h__ +#define INCLUDE_examples_args_h__ + +/** + * Argument-processing helper structure + */ +struct args_info { + int argc; + char **argv; + int pos; + int opts_done : 1; /**< Did we see a -- separator */ +}; +#define ARGS_INFO_INIT { argc, argv, 0, 0 } +#define ARGS_CURRENT(args) args->argv[args->pos] + +/** + * Check if a string has the given prefix. Returns 0 if not prefixed + * or the length of the prefix if it is. + */ +extern size_t is_prefixed(const char *str, const char *pfx); + +/** + * Match an integer string, returning 1 if matched, 0 if not. + */ +extern int is_integer(int *out, const char *str, int allow_negative); + +/** + * Check current `args` entry against `opt` string. If it matches + * exactly, take the next arg as a string; if it matches as a prefix with + * an equal sign, take the remainder as a string; if value not supplied, + * default value `def` will be given. otherwise return 0. + */ +extern int optional_str_arg( + const char **out, struct args_info *args, const char *opt, const char *def); + +/** + * Check current `args` entry against `opt` string. If it matches + * exactly, take the next arg as a string; if it matches as a prefix with + * an equal sign, take the remainder as a string; otherwise return 0. + */ +extern int match_str_arg( + const char **out, struct args_info *args, const char *opt); + +/** + * Check current `args` entry against `opt` string parsing as uint16. If + * `opt` matches exactly, take the next arg as a uint16_t value; if `opt` + * is a prefix (equal sign optional), take the remainder of the arg as a + * uint16_t value; otherwise return 0. + */ +extern int match_uint16_arg( + uint16_t *out, struct args_info *args, const char *opt); + +/** + * Check current `args` entry against `opt` string parsing as uint32. If + * `opt` matches exactly, take the next arg as a uint16_t value; if `opt` + * is a prefix (equal sign optional), take the remainder of the arg as a + * uint32_t value; otherwise return 0. + */ +extern int match_uint32_arg( + uint32_t *out, struct args_info *args, const char *opt); + +/** + * Check current `args` entry against `opt` string parsing as int. If + * `opt` matches exactly, take the next arg as an int value; if it matches + * as a prefix (equal sign optional), take the remainder of the arg as a + * int value; otherwise return 0. + */ +extern int match_int_arg( + int *out, struct args_info *args, const char *opt, int allow_negative); + +/** + * Check current `args` entry against a "bool" `opt` (ie. --[no-]progress). + * If `opt` matches positively, out will be set to 1, or if `opt` matches + * negatively, out will be set to 0, and in both cases 1 will be returned. + * If neither the positive or the negative form of opt matched, out will be -1, + * and 0 will be returned. + */ +extern int match_bool_arg(int *out, struct args_info *args, const char *opt); + +/** + * Check if we're processing past the single -- separator + */ +extern int match_arg_separator(struct args_info *args); + +/** + * Consume all remaining arguments in a git_strarray + */ +extern void strarray_from_args(git_strarray *array, struct args_info *args); + +#endif diff --git a/examples/blame.c b/examples/blame.c index 469dbd1a1..49350fc0f 100644 --- a/examples/blame.c +++ b/examples/blame.c @@ -19,7 +19,7 @@ * simulate the output of `git blame` and a few of its command line arguments. */ -struct opts { +struct blame_opts { char *path; char *commitspec; int C; @@ -28,14 +28,14 @@ struct opts { int end_line; int F; }; -static void parse_opts(struct opts *o, int argc, char *argv[]); +static void parse_opts(struct blame_opts *o, int argc, char *argv[]); int lg2_blame(git_repository *repo, int argc, char *argv[]) { int line, break_on_null_hunk; git_object_size_t i, rawsize; char spec[1024] = {0}; - struct opts o = {0}; + struct blame_opts o = {0}; const char *rawdata; git_revspec revspec = {0}; git_blame_options blameopts = GIT_BLAME_OPTIONS_INIT; @@ -143,7 +143,7 @@ static void usage(const char *msg, const char *arg) } /** Parse the arguments. */ -static void parse_opts(struct opts *o, int argc, char *argv[]) +static void parse_opts(struct blame_opts *o, int argc, char *argv[]) { int i; char *bare_args[3] = {0}; diff --git a/examples/cat-file.c b/examples/cat-file.c index 9b14a7048..b81e9a8da 100644 --- a/examples/cat-file.c +++ b/examples/cat-file.c @@ -102,27 +102,28 @@ static void show_tag(const git_tag *tag) printf("\n%s\n", git_tag_message(tag)); } -enum { +typedef enum { SHOW_TYPE = 1, SHOW_SIZE = 2, SHOW_NONE = 3, SHOW_PRETTY = 4 -}; +} catfile_mode; /* Forward declarations for option-parsing helper */ -struct opts { +struct catfile_options { const char *dir; const char *rev; - int action; + catfile_mode action; int verbose; }; -static void parse_opts(struct opts *o, int argc, char *argv[]); + +static void parse_opts(struct catfile_options *o, int argc, char *argv[]); /** Entry point for this command */ int lg2_cat_file(git_repository *repo, int argc, char *argv[]) { - struct opts o = { ".", NULL, 0, 0 }; + struct catfile_options o = { ".", NULL, 0, 0 }; git_object *obj = NULL; char oidstr[GIT_OID_HEXSZ + 1]; @@ -201,7 +202,7 @@ static void usage(const char *message, const char *arg) } /** Parse the command-line options taken from git */ -static void parse_opts(struct opts *o, int argc, char *argv[]) +static void parse_opts(struct catfile_options *o, int argc, char *argv[]) { struct args_info args = ARGS_INFO_INIT; diff --git a/examples/checkout.c b/examples/checkout.c index d552eece8..70b51859c 100644 --- a/examples/checkout.c +++ b/examples/checkout.c @@ -13,7 +13,6 @@ */ #include "common.h" -#include <assert.h> /* Define the printf format specifer to use for size_t output */ #if defined(_MSC_VER) || defined(__MINGW32__) @@ -66,7 +65,7 @@ static void parse_options(const char **repo_path, checkout_options *opts, struct const char *curr = args->argv[args->pos]; int bool_arg; - if (strcmp(curr, "--") == 0) { + if (match_arg_separator(args)) { break; } else if (!strcmp(curr, "--force")) { opts->force = 1; @@ -191,11 +190,7 @@ int lg2_checkout(git_repository *repo, int argc, char **argv) goto cleanup; } - if (args.pos >= args.argc) { - fprintf(stderr, "unhandled\n"); - err = -1; - goto cleanup; - } else if (!strcmp("--", args.argv[args.pos])) { + if (match_arg_separator(&args)) { /** * Try to checkout the given path */ diff --git a/examples/common.c b/examples/common.c index 22807e129..30f6cdc3b 100644 --- a/examples/common.c +++ b/examples/common.c @@ -12,21 +12,14 @@ * <http://creativecommons.org/publicdomain/zero/1.0/>. */ -#include <assert.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/stat.h> -#ifdef _WIN32 -# include <io.h> -#else -# include <fcntl.h> + +#include "common.h" + +#ifndef _WIN32 # include <unistd.h> #endif -#include <string.h> #include <errno.h> -#include "common.h" - void check_lg2(int error, const char *message, const char *extra) { const git_error *lg2err; @@ -60,174 +53,6 @@ void fatal(const char *message, const char *extra) exit(1); } -size_t is_prefixed(const char *str, const char *pfx) -{ - size_t len = strlen(pfx); - return strncmp(str, pfx, len) ? 0 : len; -} - -int optional_str_arg( - const char **out, struct args_info *args, const char *opt, const char *def) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return 0; - - if (!found[len]) { - if (args->pos + 1 == args->argc) { - *out = def; - return 1; - } - args->pos += 1; - *out = args->argv[args->pos]; - return 1; - } - - if (found[len] == '=') { - *out = found + len + 1; - return 1; - } - - return 0; -} - -int match_str_arg( - const char **out, struct args_info *args, const char *opt) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return 0; - - if (!found[len]) { - if (args->pos + 1 == args->argc) - fatal("expected value following argument", opt); - args->pos += 1; - *out = args->argv[args->pos]; - return 1; - } - - if (found[len] == '=') { - *out = found + len + 1; - return 1; - } - - return 0; -} - -static const char *match_numeric_arg(struct args_info *args, const char *opt) -{ - const char *found = args->argv[args->pos]; - size_t len = is_prefixed(found, opt); - - if (!len) - return NULL; - - if (!found[len]) { - if (args->pos + 1 == args->argc) - fatal("expected numeric value following argument", opt); - args->pos += 1; - found = args->argv[args->pos]; - } else { - found = found + len; - if (*found == '=') - found++; - } - - return found; -} - -int match_uint16_arg( - uint16_t *out, struct args_info *args, const char *opt) -{ - const char *found = match_numeric_arg(args, opt); - uint16_t val; - char *endptr = NULL; - - if (!found) - return 0; - - val = (uint16_t)strtoul(found, &endptr, 0); - if (!endptr || *endptr != '\0') - fatal("expected number after argument", opt); - - if (out) - *out = val; - return 1; -} - -int match_uint32_arg( - uint32_t *out, struct args_info *args, const char *opt) -{ - const char *found = match_numeric_arg(args, opt); - uint16_t val; - char *endptr = NULL; - - if (!found) - return 0; - - val = (uint32_t)strtoul(found, &endptr, 0); - if (!endptr || *endptr != '\0') - fatal("expected number after argument", opt); - - if (out) - *out = val; - return 1; -} - -static int match_int_internal( - int *out, const char *str, int allow_negative, const char *opt) -{ - char *endptr = NULL; - int val = (int)strtol(str, &endptr, 10); - - if (!endptr || *endptr != '\0') - fatal("expected number", opt); - else if (val < 0 && !allow_negative) - fatal("negative values are not allowed", opt); - - if (out) - *out = val; - - return 1; -} - -int match_bool_arg(int *out, struct args_info *args, const char *opt) -{ - const char *found = args->argv[args->pos]; - - if (!strcmp(found, opt)) { - *out = 1; - return 1; - } - - if (!strncmp(found, "--no-", strlen("--no-")) && - !strcmp(found + strlen("--no-"), opt + 2)) { - *out = 0; - return 1; - } - - *out = -1; - return 0; -} - -int is_integer(int *out, const char *str, int allow_negative) -{ - return match_int_internal(out, str, allow_negative, NULL); -} - -int match_int_arg( - int *out, struct args_info *args, const char *opt, int allow_negative) -{ - const char *found = match_numeric_arg(args, opt); - if (!found) - return 0; - return match_int_internal(out, found, allow_negative, opt); -} - int diff_output( const git_diff_delta *d, const git_diff_hunk *h, diff --git a/examples/common.h b/examples/common.h index 2ad897bca..5a029b49a 100644 --- a/examples/common.h +++ b/examples/common.h @@ -11,7 +11,10 @@ * with this software. If not, see * <http://creativecommons.org/publicdomain/zero/1.0/>. */ +#ifndef INCLUDE_examples_common_h__ +#define INCLUDE_examples_common_h__ +#include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> @@ -49,6 +52,8 @@ #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) #define UNUSED(x) (void)(x) +#include "args.h" + extern int lg2_add(git_repository *repo, int argc, char **argv); extern int lg2_blame(git_repository *repo, int argc, char **argv); extern int lg2_cat_file(git_repository *repo, int argc, char **argv); @@ -94,77 +99,6 @@ extern char *read_file(const char *path); extern void fatal(const char *message, const char *extra); /** - * Check if a string has the given prefix. Returns 0 if not prefixed - * or the length of the prefix if it is. - */ -extern size_t is_prefixed(const char *str, const char *pfx); - -/** - * Match an integer string, returning 1 if matched, 0 if not. - */ -extern int is_integer(int *out, const char *str, int allow_negative); - -struct args_info { - int argc; - char **argv; - int pos; -}; -#define ARGS_INFO_INIT { argc, argv, 0 } - -/** - * Check current `args` entry against `opt` string. If it matches - * exactly, take the next arg as a string; if it matches as a prefix with - * an equal sign, take the remainder as a string; if value not supplied, - * default value `def` will be given. otherwise return 0. - */ -extern int optional_str_arg( - const char **out, struct args_info *args, const char *opt, const char *def); - -/** - * Check current `args` entry against `opt` string. If it matches - * exactly, take the next arg as a string; if it matches as a prefix with - * an equal sign, take the remainder as a string; otherwise return 0. - */ -extern int match_str_arg( - const char **out, struct args_info *args, const char *opt); - -/** - * Check current `args` entry against `opt` string parsing as uint16. If - * `opt` matches exactly, take the next arg as a uint16_t value; if `opt` - * is a prefix (equal sign optional), take the remainder of the arg as a - * uint16_t value; otherwise return 0. - */ -extern int match_uint16_arg( - uint16_t *out, struct args_info *args, const char *opt); - -/** - * Check current `args` entry against `opt` string parsing as uint32. If - * `opt` matches exactly, take the next arg as a uint16_t value; if `opt` - * is a prefix (equal sign optional), take the remainder of the arg as a - * uint32_t value; otherwise return 0. - */ -extern int match_uint32_arg( - uint32_t *out, struct args_info *args, const char *opt); - -/** - * Check current `args` entry against `opt` string parsing as int. If - * `opt` matches exactly, take the next arg as an int value; if it matches - * as a prefix (equal sign optional), take the remainder of the arg as a - * int value; otherwise return 0. - */ -extern int match_int_arg( - int *out, struct args_info *args, const char *opt, int allow_negative); - -/** - * Check current `args` entry against a "bool" `opt` (ie. --[no-]progress). - * If `opt` matches positively, out will be set to 1, or if `opt` matches - * negatively, out will be set to 0, and in both cases 1 will be returned. - * If neither the positive or the negative form of opt matched, out will be -1, - * and 0 will be returned. - */ -extern int match_bool_arg(int *out, struct args_info *args, const char *opt); - -/** * Basic output function for plain text diff output * Pass `FILE*` such as `stdout` or `stderr` as payload (or NULL == `stdout`) */ @@ -196,3 +130,5 @@ extern int cred_acquire_cb(git_cred **out, const char *username_from_url, unsigned int allowed_types, void *payload); + +#endif diff --git a/examples/describe.c b/examples/describe.c index 53f548c8b..1236272a1 100644 --- a/examples/describe.c +++ b/examples/describe.c @@ -13,7 +13,6 @@ */ #include "common.h" -#include <assert.h> /** * The following example partially reimplements the `git describe` command @@ -38,16 +37,14 @@ */ /** describe_options represents the parsed command line options */ -typedef struct { +struct describe_options { const char **commits; size_t commit_count; git_describe_options describe_options; git_describe_format_options format_options; -} describe_options; +}; -typedef struct args_info args_info; - -static void opts_add_commit(describe_options *opts, const char *commit) +static void opts_add_commit(struct describe_options *opts, const char *commit) { size_t sz; @@ -58,7 +55,7 @@ static void opts_add_commit(describe_options *opts, const char *commit) opts->commits[opts->commit_count - 1] = commit; } -static void do_describe_single(git_repository *repo, describe_options *opts, const char *rev) +static void do_describe_single(git_repository *repo, struct describe_options *opts, const char *rev) { git_object *commit; git_describe_result *describe_result; @@ -81,7 +78,7 @@ static void do_describe_single(git_repository *repo, describe_options *opts, con printf("%s\n", buf.ptr); } -static void do_describe(git_repository *repo, describe_options *opts) +static void do_describe(git_repository *repo, struct describe_options *opts) { if (opts->commit_count == 0) do_describe_single(repo, opts, NULL); @@ -100,9 +97,9 @@ static void print_usage(void) } /** Parse command line arguments */ -static void parse_options(describe_options *opts, int argc, char **argv) +static void parse_options(struct describe_options *opts, int argc, char **argv) { - args_info args = ARGS_INFO_INIT; + struct args_info args = ARGS_INFO_INIT; for (args.pos = 1; args.pos < argc; ++args.pos) { const char *curr = argv[args.pos]; @@ -142,7 +139,7 @@ static void parse_options(describe_options *opts, int argc, char **argv) } /** Initialize describe_options struct */ -static void describe_options_init(describe_options *opts) +static void describe_options_init(struct describe_options *opts) { memset(opts, 0, sizeof(*opts)); @@ -154,7 +151,7 @@ static void describe_options_init(describe_options *opts) int lg2_describe(git_repository *repo, int argc, char **argv) { - describe_options opts; + struct describe_options opts; describe_options_init(&opts); parse_options(&opts, argc, argv); diff --git a/examples/diff.c b/examples/diff.c index 9e2aa9c41..2305c8652 100644 --- a/examples/diff.c +++ b/examples/diff.c @@ -47,8 +47,8 @@ enum { CACHE_NONE = 2 }; -/** The 'opts' struct captures all the various parsed command line options. */ -struct opts { +/** The 'diff_options' struct captures all the various parsed command line options. */ +struct diff_options { git_diff_options diffopts; git_diff_find_options findopts; int color; @@ -63,18 +63,17 @@ struct opts { /** These functions are implemented at the end */ static void usage(const char *message, const char *arg); -static void parse_opts(struct opts *o, int argc, char *argv[]); +static void parse_opts(struct diff_options *o, int argc, char *argv[]); static int color_printer( const git_diff_delta*, const git_diff_hunk*, const git_diff_line*, void*); -static void diff_print_stats(git_diff *diff, struct opts *o); -static void compute_diff_no_index(git_diff **diff, struct opts *o); +static void diff_print_stats(git_diff *diff, struct diff_options *o); +static void compute_diff_no_index(git_diff **diff, struct diff_options *o); int lg2_diff(git_repository *repo, int argc, char *argv[]) { git_tree *t1 = NULL, *t2 = NULL; git_diff *diff; - - struct opts o = { + struct diff_options o = { GIT_DIFF_OPTIONS_INIT, GIT_DIFF_FIND_OPTIONS_INIT, -1, -1, 0, 0, GIT_DIFF_FORMAT_PATCH, NULL, NULL, "." }; @@ -166,7 +165,7 @@ int lg2_diff(git_repository *repo, int argc, char *argv[]) return 0; } -static void compute_diff_no_index(git_diff **diff, struct opts *o) { +static void compute_diff_no_index(git_diff **diff, struct diff_options *o) { git_patch *patch = NULL; char *file1_str = NULL; char *file2_str = NULL; @@ -242,11 +241,10 @@ static int color_printer( } /** Parse arguments as copied from git-diff. */ -static void parse_opts(struct opts *o, int argc, char *argv[]) +static void parse_opts(struct diff_options *o, int argc, char *argv[]) { struct args_info args = ARGS_INFO_INIT; - for (args.pos = 1; args.pos < argc; ++args.pos) { const char *a = argv[args.pos]; @@ -343,7 +341,7 @@ static void parse_opts(struct opts *o, int argc, char *argv[]) } /** Display diff output with "--stat", "--numstat", or "--shortstat" */ -static void diff_print_stats(git_diff *diff, struct opts *o) +static void diff_print_stats(git_diff *diff, struct diff_options *o) { git_diff_stats *stats; git_buf b = GIT_BUF_INIT_CONST(NULL, 0); diff --git a/examples/for-each-ref.c b/examples/for-each-ref.c index 900792c12..020dab474 100644 --- a/examples/for-each-ref.c +++ b/examples/for-each-ref.c @@ -3,42 +3,42 @@ static int show_ref(git_reference *ref, void *data) { - git_repository *repo = data; - git_reference *resolved = NULL; - char hex[GIT_OID_HEXSZ+1]; - const git_oid *oid; - git_object *obj; - - if (git_reference_type(ref) == GIT_REFERENCE_SYMBOLIC) - check_lg2(git_reference_resolve(&resolved, ref), - "Unable to resolve symbolic reference", - git_reference_name(ref)); - - oid = git_reference_target(resolved ? resolved : ref); - git_oid_fmt(hex, oid); - hex[GIT_OID_HEXSZ] = 0; - check_lg2(git_object_lookup(&obj, repo, oid, GIT_OBJECT_ANY), - "Unable to lookup object", hex); - - printf("%s %-6s\t%s\n", - hex, - git_object_type2string(git_object_type(obj)), - git_reference_name(ref)); - - if (resolved) - git_reference_free(resolved); - return 0; + git_repository *repo = data; + git_reference *resolved = NULL; + char hex[GIT_OID_HEXSZ+1]; + const git_oid *oid; + git_object *obj; + + if (git_reference_type(ref) == GIT_REFERENCE_SYMBOLIC) + check_lg2(git_reference_resolve(&resolved, ref), + "Unable to resolve symbolic reference", + git_reference_name(ref)); + + oid = git_reference_target(resolved ? resolved : ref); + git_oid_fmt(hex, oid); + hex[GIT_OID_HEXSZ] = 0; + check_lg2(git_object_lookup(&obj, repo, oid, GIT_OBJECT_ANY), + "Unable to lookup object", hex); + + printf("%s %-6s\t%s\n", + hex, + git_object_type2string(git_object_type(obj)), + git_reference_name(ref)); + + if (resolved) + git_reference_free(resolved); + return 0; } int lg2_for_each_ref(git_repository *repo, int argc, char **argv) { UNUSED(argv); - - if (argc != 1) - fatal("Sorry, no for-each-ref options supported yet", NULL); - - check_lg2(git_reference_foreach(repo, show_ref, repo), - "Could not iterate over references", NULL); - - return 0; + + if (argc != 1) + fatal("Sorry, no for-each-ref options supported yet", NULL); + + check_lg2(git_reference_foreach(repo, show_ref, repo), + "Could not iterate over references", NULL); + + return 0; } diff --git a/examples/init.c b/examples/init.c index e9841bc93..2f681c5ae 100644 --- a/examples/init.c +++ b/examples/init.c @@ -27,7 +27,7 @@ */ /** Forward declarations of helpers */ -struct opts { +struct init_opts { int no_options; int quiet; int bare; @@ -38,11 +38,11 @@ struct opts { const char *dir; }; static void create_initial_commit(git_repository *repo); -static void parse_opts(struct opts *o, int argc, char *argv[]); +static void parse_opts(struct init_opts *o, int argc, char *argv[]); int lg2_init(git_repository *repo, int argc, char *argv[]) { - struct opts o = { 1, 0, 0, 0, GIT_REPOSITORY_INIT_SHARED_UMASK, 0, 0, 0 }; + struct init_opts o = { 1, 0, 0, 0, GIT_REPOSITORY_INIT_SHARED_UMASK, 0, 0, 0 }; parse_opts(&o, argc, argv); @@ -210,7 +210,7 @@ static uint32_t parse_shared(const char *shared) return 0; } -static void parse_opts(struct opts *o, int argc, char *argv[]) +static void parse_opts(struct init_opts *o, int argc, char *argv[]) { struct args_info args = ARGS_INFO_INIT; const char *sharedarg; diff --git a/examples/lg2.c b/examples/lg2.c index f1a8843d2..a3987c34d 100644 --- a/examples/lg2.c +++ b/examples/lg2.c @@ -84,8 +84,7 @@ int main(int argc, char **argv) break; } else if (optional_str_arg(&git_dir, &args, "--git-dir", ".git")) { continue; - } else if (!strcmp(a, "--")) { - /* arg separator */ + } else if (match_arg_separator(&args)) { break; } } diff --git a/examples/log.c b/examples/log.c index a6bd957ae..3eee7d421 100644 --- a/examples/log.c +++ b/examples/log.c @@ -424,8 +424,7 @@ static int parse_options( else /** Try failed revision parse as filename. */ break; - } else if (!strcmp(a, "--")) { - ++args.pos; + } else if (!match_arg_separator(&args)) { break; } else if (!strcmp(a, "--date-order")) diff --git a/examples/ls-files.c b/examples/ls-files.c index b82af0124..a23506962 100644 --- a/examples/ls-files.c +++ b/examples/ls-files.c @@ -25,11 +25,11 @@ * This currently supports the default behavior and the `--error-unmatch` option. */ -typedef struct { +struct ls_options { int error_unmatch; char *files[1024]; size_t file_count; -} ls_options; +}; static void usage(const char *message, const char *arg) { @@ -41,12 +41,12 @@ static void usage(const char *message, const char *arg) exit(1); } -static int parse_options(ls_options *opts, int argc, char *argv[]) +static int parse_options(struct ls_options *opts, int argc, char *argv[]) { int parsing_files = 0; int i; - memset(opts, 0, sizeof(ls_options)); + memset(opts, 0, sizeof(struct ls_options)); if (argc < 2) return 0; @@ -78,7 +78,7 @@ static int parse_options(ls_options *opts, int argc, char *argv[]) return 0; } -static int print_paths(ls_options *opts, git_index *index) +static int print_paths(struct ls_options *opts, git_index *index) { size_t i; const git_index_entry *entry; @@ -113,7 +113,7 @@ static int print_paths(ls_options *opts, git_index *index) int lg2_ls_files(git_repository *repo, int argc, char *argv[]) { git_index *index = NULL; - ls_options opts; + struct ls_options opts; int error; if ((error = parse_options(&opts, argc, argv)) < 0) diff --git a/examples/merge.c b/examples/merge.c index 995ac021b..460c06a25 100644 --- a/examples/merge.c +++ b/examples/merge.c @@ -13,7 +13,6 @@ */ #include "common.h" -#include <assert.h> /** The following example demonstrates how to do merges with libgit2. * @@ -24,7 +23,7 @@ * */ -typedef struct { +struct merge_options { const char **heads; size_t heads_count; @@ -32,7 +31,7 @@ typedef struct { size_t annotated_count; int no_commit : 1; -} merge_options; +}; static void print_usage(void) { @@ -40,7 +39,7 @@ static void print_usage(void) exit(1); } -static void merge_options_init(merge_options *opts) +static void merge_options_init(struct merge_options *opts) { memset(opts, 0, sizeof(*opts)); @@ -50,7 +49,7 @@ static void merge_options_init(merge_options *opts) opts->annotated_count = 0; } -static void opts_add_refish(merge_options *opts, const char *refish) +static void opts_add_refish(struct merge_options *opts, const char *refish) { size_t sz; @@ -61,7 +60,7 @@ static void opts_add_refish(merge_options *opts, const char *refish) opts->heads[opts->heads_count - 1] = refish; } -static void parse_options(const char **repo_path, merge_options *opts, int argc, char **argv) +static void parse_options(const char **repo_path, struct merge_options *opts, int argc, char **argv) { struct args_info args = ARGS_INFO_INIT; @@ -83,7 +82,7 @@ static void parse_options(const char **repo_path, merge_options *opts, int argc, } } -static int resolve_heads(git_repository *repo, merge_options *opts) +static int resolve_heads(git_repository *repo, struct merge_options *opts) { git_annotated_commit **annotated = calloc(opts->heads_count, sizeof(git_annotated_commit *)); size_t annotated_count = 0, i; @@ -201,7 +200,7 @@ static void output_conflicts(git_index *index) git_index_conflict_iterator_free(conflicts); } -static int create_merge_commit(git_repository *repo, git_index *index, merge_options *opts) +static int create_merge_commit(git_repository *repo, git_index *index, struct merge_options *opts) { git_oid tree_oid, commit_oid; git_tree *tree; @@ -277,7 +276,7 @@ cleanup: int lg2_merge(git_repository *repo, int argc, char **argv) { - merge_options opts; + struct merge_options opts; git_index *index; git_repository_state_t state; git_merge_analysis_t analysis; diff --git a/examples/remote.c b/examples/remote.c index 7345f82de..34d886526 100644 --- a/examples/remote.c +++ b/examples/remote.c @@ -30,7 +30,7 @@ enum subcmd { subcmd_show, }; -struct opts { +struct remote_opts { enum subcmd cmd; /* for command-specific args */ @@ -38,20 +38,20 @@ struct opts { char **argv; }; -static int cmd_add(git_repository *repo, struct opts *o); -static int cmd_remove(git_repository *repo, struct opts *o); -static int cmd_rename(git_repository *repo, struct opts *o); -static int cmd_seturl(git_repository *repo, struct opts *o); -static int cmd_show(git_repository *repo, struct opts *o); +static int cmd_add(git_repository *repo, struct remote_opts *o); +static int cmd_remove(git_repository *repo, struct remote_opts *o); +static int cmd_rename(git_repository *repo, struct remote_opts *o); +static int cmd_seturl(git_repository *repo, struct remote_opts *o); +static int cmd_show(git_repository *repo, struct remote_opts *o); static void parse_subcmd( - struct opts *opt, int argc, char **argv); + struct remote_opts *opt, int argc, char **argv); static void usage(const char *msg, const char *arg); int lg2_remote(git_repository *repo, int argc, char *argv[]) { int retval = 0; - struct opts opt = {0}; + struct remote_opts opt = {0}; parse_subcmd(&opt, argc, argv); @@ -77,7 +77,7 @@ int lg2_remote(git_repository *repo, int argc, char *argv[]) return retval; } -static int cmd_add(git_repository *repo, struct opts *o) +static int cmd_add(git_repository *repo, struct remote_opts *o) { char *name, *url; git_remote *remote = {0}; @@ -94,7 +94,7 @@ static int cmd_add(git_repository *repo, struct opts *o) return 0; } -static int cmd_remove(git_repository *repo, struct opts *o) +static int cmd_remove(git_repository *repo, struct remote_opts *o) { char *name; @@ -109,7 +109,7 @@ static int cmd_remove(git_repository *repo, struct opts *o) return 0; } -static int cmd_rename(git_repository *repo, struct opts *o) +static int cmd_rename(git_repository *repo, struct remote_opts *o) { int i, retval; char *old, *new; @@ -134,7 +134,7 @@ static int cmd_rename(git_repository *repo, struct opts *o) return retval; } -static int cmd_seturl(git_repository *repo, struct opts *o) +static int cmd_seturl(git_repository *repo, struct remote_opts *o) { int i, retval, push = 0; char *name = NULL, *url = NULL; @@ -166,7 +166,7 @@ static int cmd_seturl(git_repository *repo, struct opts *o) return 0; } -static int cmd_show(git_repository *repo, struct opts *o) +static int cmd_show(git_repository *repo, struct remote_opts *o) { int i; const char *arg, *name, *fetch, *push; @@ -213,7 +213,7 @@ static int cmd_show(git_repository *repo, struct opts *o) } static void parse_subcmd( - struct opts *opt, int argc, char **argv) + struct remote_opts *opt, int argc, char **argv) { char *arg = argv[1]; enum subcmd cmd = 0; 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; } } diff --git a/examples/show-index.c b/examples/show-index.c index 34eb41c7b..7aaa45e65 100644 --- a/examples/show-index.c +++ b/examples/show-index.c @@ -14,7 +14,7 @@ #include "common.h" -int lg2_show_index(git_repository *repo, int argc, char** argv) +int lg2_show_index(git_repository *repo, int argc, char **argv) { git_index *index; size_t i, ecount; diff --git a/examples/status.c b/examples/status.c index 979ab7c97..8cf922127 100644 --- a/examples/status.c +++ b/examples/status.c @@ -43,7 +43,7 @@ enum { #define MAX_PATHSPEC 8 -struct opts { +struct status_opts { git_status_options statusopt; char *repodir; char *pathspec[MAX_PATHSPEC]; @@ -55,7 +55,7 @@ struct opts { int repeat; }; -static void parse_opts(struct opts *o, int argc, char *argv[]); +static void parse_opts(struct status_opts *o, int argc, char *argv[]); static void show_branch(git_repository *repo, int format); static void print_long(git_status_list *status); static void print_short(git_repository *repo, git_status_list *status); @@ -64,7 +64,7 @@ static int print_submod(git_submodule *sm, const char *name, void *payload); int lg2_status(git_repository *repo, int argc, char *argv[]) { git_status_list *status; - struct opts o = { GIT_STATUS_OPTIONS_INIT, "." }; + struct status_opts o = { GIT_STATUS_OPTIONS_INIT, "." }; o.statusopt.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; o.statusopt.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | @@ -435,7 +435,7 @@ static int print_submod(git_submodule *sm, const char *name, void *payload) /** * Parse options that git's status command supports. */ -static void parse_opts(struct opts *o, int argc, char *argv[]) +static void parse_opts(struct status_opts *o, int argc, char *argv[]) { struct args_info args = ARGS_INFO_INIT; diff --git a/examples/tag.c b/examples/tag.c index 7bfb92a3e..440829419 100644 --- a/examples/tag.c +++ b/examples/tag.c @@ -31,19 +31,19 @@ */ /** tag_options represents the parsed command line options */ -typedef struct { +struct tag_options { const char *message; const char *pattern; const char *tag_name; const char *target; int num_lines; int force; -} tag_options; +}; /** tag_state represents the current program state for dragging around */ typedef struct { git_repository *repo; - tag_options *opts; + struct tag_options *opts; } tag_state; /** An action to execute based on the command line arguments */ @@ -167,7 +167,7 @@ static void action_list_tags(tag_state *state) static void action_delete_tag(tag_state *state) { - tag_options *opts = state->opts; + struct tag_options *opts = state->opts; git_object *obj; git_buf abbrev_oid = {0}; @@ -191,7 +191,7 @@ static void action_delete_tag(tag_state *state) static void action_create_lighweight_tag(tag_state *state) { git_repository *repo = state->repo; - tag_options *opts = state->opts; + struct tag_options *opts = state->opts; git_oid oid; git_object *target; @@ -213,7 +213,7 @@ static void action_create_lighweight_tag(tag_state *state) static void action_create_tag(tag_state *state) { git_repository *repo = state->repo; - tag_options *opts = state->opts; + struct tag_options *opts = state->opts; git_signature *tagger; git_oid oid; git_object *target; @@ -243,7 +243,7 @@ static void print_usage(void) } /** Parse command line arguments and choose action to run when done */ -static void parse_options(tag_action *action, tag_options *opts, int argc, char **argv) +static void parse_options(tag_action *action, struct tag_options *opts, int argc, char **argv) { args_info args = ARGS_INFO_INIT; *action = &action_list_tags; @@ -281,7 +281,7 @@ static void parse_options(tag_action *action, tag_options *opts, int argc, char } /** Initialize tag_options struct */ -static void tag_options_init(tag_options *opts) +static void tag_options_init(struct tag_options *opts) { memset(opts, 0, sizeof(*opts)); @@ -295,7 +295,7 @@ static void tag_options_init(tag_options *opts) int lg2_tag(git_repository *repo, int argc, char **argv) { - tag_options opts; + struct tag_options opts; tag_action action; tag_state state; |