diff options
author | Carson Howard <cjhoward92@gmail.com> | 2017-10-22 20:43:22 -0700 |
---|---|---|
committer | Carson Howard <tylerw+systemtest@axosoft.com> | 2018-03-27 07:18:31 -0700 |
commit | cd39273dbb62d9abf16a08ea4e86efe17ae22b41 (patch) | |
tree | b05083a3d9b867c0aa1a47552cae23b355eab4e6 /examples/ls-files.c | |
parent | 52d83dde97a266aa8d17d75b9ed31ac0a112874c (diff) | |
download | libgit2-cd39273dbb62d9abf16a08ea4e86efe17ae22b41.tar.gz |
examples: ls-files: fix style and refactor
Diffstat (limited to 'examples/ls-files.c')
-rw-r--r-- | examples/ls-files.c | 135 |
1 files changed, 65 insertions, 70 deletions
diff --git a/examples/ls-files.c b/examples/ls-files.c index 823114ddd..eee6842cb 100644 --- a/examples/ls-files.c +++ b/examples/ls-files.c @@ -13,6 +13,7 @@ */ #include "common.h" +#include "array.h" /** * This example demonstrates the libgit2 index APIs to roughly @@ -31,66 +32,12 @@ * */ -#define MAX_FILES 64 - -typedef struct ls_options { +typedef struct { int error_unmatch; - char *files[MAX_FILES]; + char **files; int file_count; } ls_options; -static void usage(const char *message, const char *arg); -void parse_options(ls_options *opts, int argc, char *argv[]); -int print_error_unmatch(ls_options *opts, git_index *index); - -int main(int argc, char *argv[]) { - ls_options opts; - git_repository *repo; - git_index *index; - const git_index_entry *entry; - size_t entry_count; - size_t i = 0; - int error; - - parse_options(&opts, argc, argv); - - /* we need to initialize libgit2 */ - git_libgit2_init(); - - /* we need to open the repo */ - if ((error = git_repository_open_ext(&repo, ".", 0, NULL)) != 0) - goto cleanup; - - /* we need to load the repo's index */ - if ((error = git_repository_index(&index, repo)) != 0) - goto cleanup; - - /* if the error_unmatch flag is set, we need to print it differently */ - if (opts.error_unmatch) { - error = print_error_unmatch(&opts, index); - goto cleanup; - } - - /* we need to know how many entries exist in the index */ - entry_count = git_index_entrycount(index); - - /* loop through the entries by index and display their pathes */ - for (i = 0; i < entry_count; i++) { - entry = git_index_get_byindex(index, i); - printf("%s\n", entry->path); - } - -cleanup: - /* free our allocated resources */ - git_index_free(index); - git_repository_free(repo); - - /* we need to shutdown libgit2 */ - git_libgit2_shutdown(); - - return error; -} - /* Print a usage message for the program. */ static void usage(const char *message, const char *arg) { @@ -102,13 +49,13 @@ static void usage(const char *message, const char *arg) exit(1); } -void parse_options(ls_options *opts, int argc, char *argv[]) { +static void parse_options(ls_options *opts, int argc, char *argv[]) +{ int parsing_files = 0; struct args_info args = ARGS_INFO_INIT; - + git_array_t(char *) files = GIT_ARRAY_INIT; + memset(opts, 0, sizeof(ls_options)); - opts->error_unmatch = 0; - opts->file_count = 0; if (argc < 2) return; @@ -117,22 +64,25 @@ void parse_options(ls_options *opts, int argc, char *argv[]) { char *a = argv[args.pos]; /* if it doesn't start with a '-' or is after the '--' then it is a file */ - if (a[0] != '-' || !strcmp(a, "--")) { - if (parsing_files) { - opts->files[opts->file_count++] = a; - } else { - parsing_files = 1; - } - } else if (!strcmp(a, "--error-unmatch")) { - opts->error_unmatch = 1; + if (a[0] != '-') { parsing_files = 1; + + opts->files = git_array_alloc(files); + GITERR_CHECK_ALLOC(opts->files); + + opts->files[opts->file_count++] = a; + } else if (!strcmp(a, "--")) { + parsing_files = 1; + } else if (!strcmp(a, "--error-unmatch") && !parsing_files) { + opts->error_unmatch = 1; } else { usage("Unsupported argument", a); } } } -int print_error_unmatch(ls_options *opts, git_index *index) { +static int print_paths(ls_options *opts, git_index *index) +{ int i; const git_index_entry *entry; @@ -141,7 +91,7 @@ int print_error_unmatch(ls_options *opts, git_index *index) { const char *path = opts->files[i]; entry = git_index_get_bypath(index, path, GIT_INDEX_STAGE_NORMAL); - if (!entry) { + if (!entry && opts->error_unmatch) { printf("error: pathspec '%s' did not match any file(s) known to git.\n", path); printf("Did you forget to 'git add'?\n"); return -1; @@ -149,5 +99,50 @@ int print_error_unmatch(ls_options *opts, git_index *index) { printf("%s\n", path); } + return 0; } + +int main(int argc, char *argv[]) +{ + ls_options opts; + git_repository *repo; + git_index *index; + const git_index_entry *entry; + size_t entry_count; + size_t i = 0; + int error; + + parse_options(&opts, argc, argv); + + git_libgit2_init(); + + if ((error = git_repository_open_ext(&repo, ".", 0, NULL)) != 0) + goto cleanup; + + if ((error = git_repository_index(&index, repo)) != 0) + goto cleanup; + + /* if there are files explicitly listed by the user, we need to treat this command differently */ + if (opts.file_count > 0) { + error = print_paths(&opts, index); + goto cleanup; + } + + /* we need to know how many entries exist in the index */ + entry_count = git_index_entrycount(index); + + /* loop through the entries by index and display their pathes */ + for (i = 0; i < entry_count; i++) { + entry = git_index_get_byindex(index, i); + printf("%s\n", entry->path); + } + +cleanup: + /* free our allocated resources */ + git_index_free(index); + git_repository_free(repo); + git_libgit2_shutdown(); + + return error; +} |