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>
This commit is contained in:
Junio C Hamano 2009-08-07 15:45:30 -07:00
Родитель 7ecc9b153c
Коммит 6c4f3ec9b4
2 изменённых файлов: 40 добавлений и 17 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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;
@ -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
@ -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;
@ -105,14 +114,19 @@ 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);
}
}
@ -120,17 +134,20 @@ static int verify_one_pack(const char *path, int verbose)
}
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()
};
@ -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();
}