int main(int argc, char **argv) { int i; int return_code = 1; int error; git_repository *repo; struct args_info args = ARGS_INFO_INIT; const char *git_dir = NULL; if (argc < 2) { fprintf(stderr, "usage: %s <cmd> [repo]\n", argv[0]); exit(EXIT_FAILURE); } git_libgit2_init(); for (args.pos = 1; args.pos < args.argc; ++args.pos) { char *a = args.argv[args.pos]; if (a[0] != '-') { /* non-arg */ break; } else if (optional_str_arg(&git_dir, &args, "--git-dir", ".git")) { continue; } else if (!strcmp(a, "--")) { /* arg separator */ break; } } /* Before running the actual command, create an instance of the local * repository and pass it to the function. */ error = git_repository_open(&repo, git_dir); if (error < 0) repo = NULL; for (i = 0; commands[i].name != NULL; ++i) { if (!strcmp(args.argv[args.pos], commands[i].name)) { return_code = run_command(commands[i].fn, repo, args); goto shutdown; } } fprintf(stderr, "Command not found: %s\n", argv[1]); shutdown: git_repository_free(repo); git_libgit2_shutdown(); return return_code; }
/** Parse command line arguments */ static void parse_options(describe_options *opts, int argc, char **argv) { args_info args = ARGS_INFO_INIT; for (args.pos = 1; args.pos < argc; ++args.pos) { const char *curr = argv[args.pos]; if (curr[0] != '-') { opts->commits = (const char **)realloc((void *)opts->commits, ++opts->commit_count); opts->commits[opts->commit_count - 1] = curr; } else if (!strcmp(curr, "--all")) { opts->describe_options.describe_strategy = GIT_DESCRIBE_ALL; } else if (!strcmp(curr, "--tags")) { opts->describe_options.describe_strategy = GIT_DESCRIBE_TAGS; } else if (!strcmp(curr, "--exact-match")) { opts->describe_options.max_candidates_tags = 0; } else if (!strcmp(curr, "--long")) { opts->format_options.always_use_long_format = 1; } else if (!strcmp(curr, "--always")) { opts->describe_options.show_commit_oid_as_fallback = 1; } else if (!strcmp(curr, "--first-parent")) { opts->describe_options.only_follow_first_parent = 1; } else if (optional_str_arg(&opts->format_options.dirty_suffix, &args, "--dirty", "-dirty")) { } else if (match_int_arg((int *)&opts->format_options.abbreviated_size, &args, "--abbrev", 0)) { } else if (match_int_arg((int *)&opts->describe_options.max_candidates_tags, &args, "--candidates", 0)) { } else if (match_str_arg(&opts->describe_options.pattern, &args, "--match")) { } } if (opts->commit_count > 0) { if (opts->format_options.dirty_suffix) fatal("--dirty is incompatible with commit-ishes", NULL); } else { if (!opts->format_options.dirty_suffix || !opts->format_options.dirty_suffix[0]) { opts->commits = (const char **)malloc(++opts->commit_count); opts->commits[0] = "HEAD"; } } }