Skip to content

Commit

Permalink
Merge branch 'jc/verify-pack-stat'
Browse files Browse the repository at this point in the history
* jc/verify-pack-stat:
  verify-pack --stat-only: show histogram without verifying
  • Loading branch information
Junio C Hamano committed Aug 24, 2009
2 parents dad1a45 + 6c4f3ec commit 2e1176d
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 2e1176d

Please sign in to comment.