examples: ls-files: fix style and refactor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
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;
+}