Skip to content

Commit

Permalink
verify-pack --stat-only: show histogram without verifying
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Aug 8, 2009
1 parent 7ecc9b1 commit 6c4f3ec
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 17 deletions.
8 changes: 7 additions & 1 deletion Documentation/git-verify-pack.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ OPTIONS
-v::
--verbose::
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.

Expand Down
49 changes: 33 additions & 16 deletions builtin-verify-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@

#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;
int cnt;
int stat_only = flags & VERIFY_PACK_STAT_ONLY;
unsigned long chain_histogram[MAX_CHAIN+1], baseobjects;

nr_objects = p->num_objects;
Expand All @@ -32,16 +36,19 @@ static void show_pack_info(struct packed_git *p)
type = packed_object_info_detail(p, offset, &size, &store_size,
&delta_chain_length,
base_sha1);
printf("%s ", sha1_to_hex(sha1));
if (!stat_only)
printf("%s ", sha1_to_hex(sha1));
if (!delta_chain_length) {
printf("%-6s %lu %lu %"PRIuMAX"\n",
type, size, store_size, (uintmax_t)offset);
if (!stat_only)
printf("%-6s %lu %lu %"PRIuMAX"\n",
type, size, store_size, (uintmax_t)offset);
baseobjects++;
}
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 (!stat_only)
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
Expand All @@ -66,10 +73,12 @@ static void show_pack_info(struct packed_git *p)
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];
int len;
int verbose = flags & VERIFY_PACK_VERBOSE;
int stat_only = flags & VERIFY_PACK_STAT_ONLY;
struct packed_git *pack;
int err;

Expand Down Expand Up @@ -105,32 +114,40 @@ static int verify_one_pack(const char *path, int verbose)
return error("packfile %s not found.", arg);

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)
printf("%s: bad\n", pack->pack_name);
else {
show_pack_info(pack);
printf("%s: ok\n", pack->pack_name);
show_pack_info(pack, flags);
if (!stat_only)
printf("%s: ok\n", pack->pack_name);
}
}

return err;
}

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

int cmd_verify_pack(int argc, const char **argv, const char *prefix)
{
int err = 0;
int verbose = 0;
unsigned int flags = 0;
int i;
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()
};

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

0 comments on commit 6c4f3ec

Please sign in to comment.