Commit cd39273dbb62d9abf16a08ea4e86efe17ae22b41

Carson Howard 2017-10-22T20:43:22

examples: ls-files: fix style and refactor

diff --git a/examples/ls-files.c b/examples/ls-files.c
index 823114d..eee6842 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;
+}