From: Sean Date: Sat, 21 May 2005 18:32:51 GMT Subject: [PATCH 2/3] - Convert git-fsck-cache to argp Message-ID: <2236.10.10.10.24.1116700371.squirrel@linux1> First in a series of patches to convert git commands to use "argp" for argument processing as suggested by Jeff Garzik. This patch converts git-fsck-cache. It improves the usage message, adds a --version option, and allows options to be combined together with a single leading dash. Signed-off-by: Sean Estabrooks Acked-by: "Jeff Garzik" Acked-by: "Junio C Hamano" Documentation/git-fsck-cache.txt | 6 +++ fsck-cache.c | 60 ++++++++++++++++++++++----------------- 2 files changed, 39 insertions(+), 27 deletions(-) Index: fsck-cache.c =================================================================== --- 58741c69570705801db4b785681790d636475695/fsck-cache.c (mode:100644) +++ uncommitted/fsck-cache.c (mode:100644) @@ -1,5 +1,7 @@ #include #include +#include +const char *argp_program_version = VERSION; #include "cache.h" #include "commit.h" @@ -407,36 +409,42 @@ find_file_objects(git_dir, "refs"); } +static const char doc[] = "Perform repository consistency check"; + +static struct argp_option options[] = { + {"unreachable", 'u', 0, 0, "Show missing objects or deltas"}, + {"tags", 't', 0, 0, "Show revision tags"}, + {"root", 'r', 0, 0, "Show root objects, ie. those without parents"}, + {"delta-depth", 'd', 0, 0, "Show the maximum length of delta chains"}, + {"cache", 'c', 0, 0, "Mark all objects referenced by cache as reachable"}, + { } +}; + +static error_t parse_opt (int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'u': show_unreachable = 1; break; + case 't': show_tags = 1; break; + case 'r': show_root = 1; break; + case 'd': show_max_delta_depth = 1; break; + case 'c': keep_cache_objects = 1; break; + default: return ARGP_ERR_UNKNOWN; + } + return 0; +} + +static const struct argp argp = { options, parse_opt, "[HEAD-SHA1...]", doc }; + int main(int argc, char **argv) { int i, heads; char *sha1_dir; + int idx; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; - - if (!strcmp(arg, "--unreachable")) { - show_unreachable = 1; - continue; - } - if (!strcmp(arg, "--tags")) { - show_tags = 1; - continue; - } - if (!strcmp(arg, "--root")) { - show_root = 1; - continue; - } - if (!strcmp(arg, "--delta-depth")) { - show_max_delta_depth = 1; - continue; - } - if (!strcmp(arg, "--cache")) { - keep_cache_objects = 1; - continue; - } - if (*arg == '-') - usage("git-fsck-cache [--tags] [[--unreachable] [--cache] *]"); + error_t rc = argp_parse(&argp, argc, argv, 0, &idx, NULL); + if (rc) { + fprintf(stderr, "argument failed: %s\n", strerror(rc)); + return 1; } sha1_dir = get_object_directory(); @@ -450,7 +458,7 @@ expand_deltas(); heads = 0; - for (i = 1; i < argc; i++) { + for (i = idx; i < argc; i++) { const char *arg = argv[i]; if (*arg == '-') Index: Documentation/git-fsck-cache.txt =================================================================== --- 4708925e3e3b955ffcb417fc4acdbb0aafdf8dc0/Documentation/git-fsck-cache.txt (mode:100644) +++ uncommitted/Documentation/git-fsck-cache.txt (mode:100644) @@ -9,7 +9,8 @@ SYNOPSIS -------- -'git-fsck-cache' [--tags] [--root] [[--unreachable] [--cache] \*] +'git-fsck-cache' [--tags] [--root] [--delta-depth] + [[--unreachable] [--cache] \*] DESCRIPTION ----------- @@ -34,6 +35,9 @@ Consider any object recorded in the cache also as a head node for an unreachability trace. +--delta-depth:: + Show length of longest delta chain. + It tests SHA1 and general object sanity, and it does full tracking of the resulting reachability and everything else. It prints out any corruption it finds (missing or bad objects), and if you use the