diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-28 15:20:10 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-28 15:20:10 -0700 |
commit | fead2836a16829fba427635f92d7df9acf771a55 (patch) | |
tree | 0c3d06b55308b094e8486ab8a4d02b381472a834 /fsck-cache.c | |
parent | [PATCH] Bugfix: initialize pack_base to NULL. (diff) | |
parent | [PATCH] Update fsck-cache (take 2) (diff) | |
download | tgif-fead2836a16829fba427635f92d7df9acf771a55.tar.xz |
Merge fighting fsck-cache updates from Junio
It's just easier to let git help out with the merge than it is to try to
fix up the diffs.
Diffstat (limited to 'fsck-cache.c')
-rw-r--r-- | fsck-cache.c | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/fsck-cache.c b/fsck-cache.c index 49c606f87f..eae73cc18b 100644 --- a/fsck-cache.c +++ b/fsck-cache.c @@ -13,6 +13,7 @@ static int show_root = 0; static int show_tags = 0; static int show_unreachable = 0; static int standalone = 0; +static int check_full = 0; static int keep_cache_objects = 0; static unsigned char head_sha1[20]; @@ -374,10 +375,20 @@ static void get_default_heads(void) die("No default references"); } +static void fsck_object_dir(const char *path) +{ + int i; + for (i = 0; i < 256; i++) { + static char dir[4096]; + sprintf(dir, "%s/%02x", path, i); + fsck_dir(i, dir); + } + fsck_sha1_list(); +} + int main(int argc, char **argv) { int i, heads; - char *sha1_dir; for (i = 1; i < argc; i++) { const char *arg = argv[i]; @@ -402,17 +413,41 @@ int main(int argc, char **argv) standalone = 1; continue; } + if (!strcmp(arg, "--full")) { + check_full = 1; + continue; + } if (*arg == '-') - usage("git-fsck-cache [--tags] [[--unreachable] [--cache] <head-sha1>*]"); + usage("git-fsck-cache [--tags] [[--unreachable] [--cache] [--standalone | --full] <head-sha1>*]"); } - sha1_dir = get_object_directory(); - for (i = 0; i < 256; i++) { - static char dir[4096]; - sprintf(dir, "%s/%02x", sha1_dir, i); - fsck_dir(i, dir); + if (standalone && check_full) + die("Only one of --standalone or --full can be used."); + if (standalone) + unsetenv("GIT_ALTERNATE_OBJECT_DIRECTORIES"); + + fsck_object_dir(get_object_directory()); + if (check_full) { + int j; + struct packed_git *p; + prepare_alt_odb(); + for (j = 0; alt_odb[j].base; j++) { + alt_odb[j].name[-1] = 0; /* was slash */ + fsck_object_dir(alt_odb[j].base); + alt_odb[j].name[-1] = '/'; + } + prepare_packed_git(); + for (p = packed_git; p; p = p->next) { + int num = num_packed_objects(p); + for (i = 0; i < num; i++) { + unsigned char sha1[20]; + nth_packed_object_sha1(p, i, sha1); + if (fsck_sha1(sha1) < 0) + fprintf(stderr, "bad sha1 entry '%s'\n", sha1_to_hex(sha1)); + + } + } } - fsck_sha1_list(); heads = 0; for (i = 1; i < argc; i++) { |