Index: Documentation/git-fsck-cache.txt =================================================================== --- 85ec256656a7839ca7a2067792b828c9b63c8711/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 Index: fsck-cache.c =================================================================== --- 85ec256656a7839ca7a2067792b828c9b63c8711/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 unreachable objects"}, + {"tags", 't', 0, 0, "Show revision tags"}, + {"root", 'r', 0, 0, "Show root objects, ie. those without parents"}, + {"delta-depth", 'd', 0, 0, "Show length of longest delta chain"}, + {"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 == '-')