Browse Source

verify-pack --stat-only: show histogram without verifying

When this option is given, the command does not verify the pack contents,
but shows the delta chain histogram.  If used with --verbose, the usual
list of objects is also shown.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 16 years ago
parent
commit
6c4f3ec9b4
  1. 8
      Documentation/git-verify-pack.txt
  2. 49
      builtin-verify-pack.c

8
Documentation/git-verify-pack.txt

@ -25,7 +25,13 @@ OPTIONS
-v:: -v::
--verbose:: --verbose::
After verifying the pack, show list of objects contained After verifying the pack, show list of objects contained
in the pack. in the pack and a histogram of delta chain length.

-s::
--stat-only::
Do not verify the pack contents; only show the histogram of delta
chain length. With `--verbose`, list of objects is also shown.

\--:: \--::
Do not interpret any more arguments as options. Do not interpret any more arguments as options.



49
builtin-verify-pack.c

@ -6,10 +6,14 @@


#define MAX_CHAIN 50 #define MAX_CHAIN 50


static void show_pack_info(struct packed_git *p) #define VERIFY_PACK_VERBOSE 01
#define VERIFY_PACK_STAT_ONLY 02

static void show_pack_info(struct packed_git *p, unsigned int flags)
{ {
uint32_t nr_objects, i; uint32_t nr_objects, i;
int cnt; int cnt;
int stat_only = flags & VERIFY_PACK_STAT_ONLY;
unsigned long chain_histogram[MAX_CHAIN+1], baseobjects; unsigned long chain_histogram[MAX_CHAIN+1], baseobjects;


nr_objects = p->num_objects; nr_objects = p->num_objects;
@ -32,16 +36,19 @@ static void show_pack_info(struct packed_git *p)
type = packed_object_info_detail(p, offset, &size, &store_size, type = packed_object_info_detail(p, offset, &size, &store_size,
&delta_chain_length, &delta_chain_length,
base_sha1); base_sha1);
printf("%s ", sha1_to_hex(sha1)); if (!stat_only)
printf("%s ", sha1_to_hex(sha1));
if (!delta_chain_length) { if (!delta_chain_length) {
printf("%-6s %lu %lu %"PRIuMAX"\n", if (!stat_only)
type, size, store_size, (uintmax_t)offset); printf("%-6s %lu %lu %"PRIuMAX"\n",
type, size, store_size, (uintmax_t)offset);
baseobjects++; baseobjects++;
} }
else { else {
printf("%-6s %lu %lu %"PRIuMAX" %u %s\n", if (!stat_only)
type, size, store_size, (uintmax_t)offset, printf("%-6s %lu %lu %"PRIuMAX" %u %s\n",
delta_chain_length, sha1_to_hex(base_sha1)); type, size, store_size, (uintmax_t)offset,
delta_chain_length, sha1_to_hex(base_sha1));
if (delta_chain_length <= MAX_CHAIN) if (delta_chain_length <= MAX_CHAIN)
chain_histogram[delta_chain_length]++; chain_histogram[delta_chain_length]++;
else else
@ -66,10 +73,12 @@ static void show_pack_info(struct packed_git *p)
chain_histogram[0] > 1 ? "s" : ""); chain_histogram[0] > 1 ? "s" : "");
} }


static int verify_one_pack(const char *path, int verbose) static int verify_one_pack(const char *path, unsigned int flags)
{ {
char arg[PATH_MAX]; char arg[PATH_MAX];
int len; int len;
int verbose = flags & VERIFY_PACK_VERBOSE;
int stat_only = flags & VERIFY_PACK_STAT_ONLY;
struct packed_git *pack; struct packed_git *pack;
int err; int err;


@ -105,14 +114,19 @@ static int verify_one_pack(const char *path, int verbose)
return error("packfile %s not found.", arg); return error("packfile %s not found.", arg);


install_packed_git(pack); install_packed_git(pack);
err = verify_pack(pack);


if (verbose) { if (!stat_only)
err = verify_pack(pack);
else
err = open_pack_index(pack);

if (verbose || stat_only) {
if (err) if (err)
printf("%s: bad\n", pack->pack_name); printf("%s: bad\n", pack->pack_name);
else { else {
show_pack_info(pack); show_pack_info(pack, flags);
printf("%s: ok\n", pack->pack_name); if (!stat_only)
printf("%s: ok\n", pack->pack_name);
} }
} }


@ -120,17 +134,20 @@ static int verify_one_pack(const char *path, int verbose)
} }


static const char * const verify_pack_usage[] = { static const char * const verify_pack_usage[] = {
"git verify-pack [-v|--verbose] <pack>...", "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>...",
NULL NULL
}; };


int cmd_verify_pack(int argc, const char **argv, const char *prefix) int cmd_verify_pack(int argc, const char **argv, const char *prefix)
{ {
int err = 0; int err = 0;
int verbose = 0; unsigned int flags = 0;
int i; int i;
const struct option verify_pack_options[] = { const struct option verify_pack_options[] = {
OPT__VERBOSE(&verbose), OPT_BIT('v', "verbose", &flags, "verbose",
VERIFY_PACK_VERBOSE),
OPT_BIT('s', "stat-only", &flags, "show statistics only",
VERIFY_PACK_STAT_ONLY),
OPT_END() OPT_END()
}; };


@ -140,7 +157,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)
if (argc < 1) if (argc < 1)
usage_with_options(verify_pack_usage, verify_pack_options); usage_with_options(verify_pack_usage, verify_pack_options);
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
if (verify_one_pack(argv[i], verbose)) if (verify_one_pack(argv[i], flags))
err = 1; err = 1;
discard_revindex(); discard_revindex();
} }

Loading…
Cancel
Save