X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-verify-pack.c;h=25a29f11a4b9642c1bd367b81779d8f09ae04604;hb=52e8370bc7a71366b664ece0a9ec0b79d673a356;hp=4e31c273f48e3983aaf99dc6525982d34b6fed06;hpb=6e863d6d129a1b6a13c66d0bb03f3d43db6c51fe;p=git.git diff --git a/builtin-verify-pack.c b/builtin-verify-pack.c index 4e31c273f..25a29f11a 100644 --- a/builtin-verify-pack.c +++ b/builtin-verify-pack.c @@ -1,6 +1,58 @@ #include "builtin.h" #include "cache.h" #include "pack.h" +#include "pack-revindex.h" + +#define MAX_CHAIN 50 + +static void show_pack_info(struct packed_git *p) +{ + uint32_t nr_objects, i, chain_histogram[MAX_CHAIN+1]; + + nr_objects = p->num_objects; + memset(chain_histogram, 0, sizeof(chain_histogram)); + + for (i = 0; i < nr_objects; i++) { + const unsigned char *sha1; + unsigned char base_sha1[20]; + const char *type; + unsigned long size; + unsigned long store_size; + off_t offset; + unsigned int delta_chain_length; + + sha1 = nth_packed_object_sha1(p, i); + if (!sha1) + die("internal error pack-check nth-packed-object"); + offset = nth_packed_object_offset(p, i); + type = packed_object_info_detail(p, offset, &size, &store_size, + &delta_chain_length, + base_sha1); + printf("%s ", sha1_to_hex(sha1)); + if (!delta_chain_length) + printf("%-6s %lu %lu %"PRIuMAX"\n", + type, size, store_size, (uintmax_t)offset); + else { + printf("%-6s %lu %lu %"PRIuMAX" %u %s\n", + type, size, store_size, (uintmax_t)offset, + delta_chain_length, sha1_to_hex(base_sha1)); + if (delta_chain_length <= MAX_CHAIN) + chain_histogram[delta_chain_length]++; + else + chain_histogram[0]++; + } + } + + for (i = 0; i <= MAX_CHAIN; i++) { + if (!chain_histogram[i]) + continue; + printf("chain length = %"PRIu32": %"PRIu32" object%s\n", i, + chain_histogram[i], chain_histogram[i] > 1 ? "s" : ""); + } + if (chain_histogram[0]) + printf("chain length > %d: %"PRIu32" object%s\n", MAX_CHAIN, + chain_histogram[0], chain_histogram[0] > 1 ? "s" : ""); +} static int verify_one_pack(const char *path, int verbose) { @@ -40,8 +92,17 @@ static int verify_one_pack(const char *path, int verbose) if (!pack) return error("packfile %s not found.", arg); - err = verify_pack(pack, verbose); - free(pack); + install_packed_git(pack); + err = verify_pack(pack); + + if (verbose) { + if (err) + printf("%s: bad\n", pack->pack_name); + else { + show_pack_info(pack); + printf("%s: ok\n", pack->pack_name); + } + } return err; } @@ -55,7 +116,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix) int no_more_options = 0; int nothing_done = 1; - git_config(git_default_config); + git_config(git_default_config, NULL); while (1 < argc) { if (!no_more_options && argv[1][0] == '-') { if (!strcmp("-v", argv[1])) @@ -68,6 +129,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix) else { if (verify_one_pack(argv[1], verbose)) err = 1; + discard_revindex(); nothing_done = 0; } argc--; argv++;