summaryrefslogtreecommitdiff
path: root/examples/ls-files.c
diff options
context:
space:
mode:
authorCarson Howard <cjhoward92@gmail.com>2017-10-22 20:43:22 -0700
committerCarson Howard <tylerw+systemtest@axosoft.com>2018-03-27 07:18:31 -0700
commitcd39273dbb62d9abf16a08ea4e86efe17ae22b41 (patch)
treeb05083a3d9b867c0aa1a47552cae23b355eab4e6 /examples/ls-files.c
parent52d83dde97a266aa8d17d75b9ed31ac0a112874c (diff)
downloadlibgit2-cd39273dbb62d9abf16a08ea4e86efe17ae22b41.tar.gz
examples: ls-files: fix style and refactor
Diffstat (limited to 'examples/ls-files.c')
-rw-r--r--examples/ls-files.c135
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;
+}