Commit cd39273d by Carson Howard Committed by Carson Howard

examples: ls-files: fix style and refactor

parent 52d83dde
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
*/ */
#include "common.h" #include "common.h"
#include "array.h"
/** /**
* This example demonstrates the libgit2 index APIs to roughly * This example demonstrates the libgit2 index APIs to roughly
...@@ -31,66 +32,12 @@ ...@@ -31,66 +32,12 @@
* *
*/ */
#define MAX_FILES 64 typedef struct {
typedef struct ls_options {
int error_unmatch; int error_unmatch;
char *files[MAX_FILES]; char **files;
int file_count; int file_count;
} ls_options; } 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. */ /* Print a usage message for the program. */
static void usage(const char *message, const char *arg) static void usage(const char *message, const char *arg)
{ {
...@@ -102,13 +49,13 @@ static void usage(const char *message, const char *arg) ...@@ -102,13 +49,13 @@ static void usage(const char *message, const char *arg)
exit(1); 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; int parsing_files = 0;
struct args_info args = ARGS_INFO_INIT; struct args_info args = ARGS_INFO_INIT;
git_array_t(char *) files = GIT_ARRAY_INIT;
memset(opts, 0, sizeof(ls_options)); memset(opts, 0, sizeof(ls_options));
opts->error_unmatch = 0;
opts->file_count = 0;
if (argc < 2) if (argc < 2)
return; return;
...@@ -117,22 +64,25 @@ void parse_options(ls_options *opts, int argc, char *argv[]) { ...@@ -117,22 +64,25 @@ void parse_options(ls_options *opts, int argc, char *argv[]) {
char *a = argv[args.pos]; char *a = argv[args.pos];
/* if it doesn't start with a '-' or is after the '--' then it is a file */ /* if it doesn't start with a '-' or is after the '--' then it is a file */
if (a[0] != '-' || !strcmp(a, "--")) { if (a[0] != '-') {
if (parsing_files) { parsing_files = 1;
opts->files = git_array_alloc(files);
GITERR_CHECK_ALLOC(opts->files);
opts->files[opts->file_count++] = a; opts->files[opts->file_count++] = a;
} else { } else if (!strcmp(a, "--")) {
parsing_files = 1; parsing_files = 1;
} } else if (!strcmp(a, "--error-unmatch") && !parsing_files) {
} else if (!strcmp(a, "--error-unmatch")) {
opts->error_unmatch = 1; opts->error_unmatch = 1;
parsing_files = 1;
} else { } else {
usage("Unsupported argument", a); 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; int i;
const git_index_entry *entry; const git_index_entry *entry;
...@@ -141,7 +91,7 @@ int print_error_unmatch(ls_options *opts, git_index *index) { ...@@ -141,7 +91,7 @@ int print_error_unmatch(ls_options *opts, git_index *index) {
const char *path = opts->files[i]; const char *path = opts->files[i];
entry = git_index_get_bypath(index, path, GIT_INDEX_STAGE_NORMAL); 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("error: pathspec '%s' did not match any file(s) known to git.\n", path);
printf("Did you forget to 'git add'?\n"); printf("Did you forget to 'git add'?\n");
return -1; return -1;
...@@ -149,5 +99,50 @@ int print_error_unmatch(ls_options *opts, git_index *index) { ...@@ -149,5 +99,50 @@ int print_error_unmatch(ls_options *opts, git_index *index) {
printf("%s\n", path); printf("%s\n", path);
} }
return 0; 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment