4 static int verify_packfile(struct packed_git
*p
,
5 struct pack_window
**w_curs
)
7 off_t index_size
= p
->index_size
;
8 void *index_base
= p
->index_base
;
10 unsigned char sha1
[20];
11 off_t offset
= 0, pack_sig
= p
->pack_size
- 20;
12 uint32_t nr_objects
, i
;
15 /* Note that the pack header checks are actually performed by
16 * use_pack when it first opens the pack file. If anything
17 * goes wrong during those checks then the call will die out
22 while (offset
< pack_sig
) {
23 unsigned int remaining
;
24 unsigned char *in
= use_pack(p
, w_curs
, offset
, &remaining
);
26 if (offset
> pack_sig
)
27 remaining
-= (unsigned int)(offset
- pack_sig
);
28 SHA1_Update(&ctx
, in
, remaining
);
30 SHA1_Final(sha1
, &ctx
);
31 if (hashcmp(sha1
, use_pack(p
, w_curs
, pack_sig
, NULL
)))
32 return error("Packfile %s SHA1 mismatch with itself",
34 if (hashcmp(sha1
, (unsigned char *)index_base
+ index_size
- 40))
35 return error("Packfile %s SHA1 mismatch with idx",
39 /* Make sure everything reachable from idx is valid. Since we
40 * have verified that nr_objects matches between idx and pack,
41 * we do not do scan-streaming check on the pack file.
43 nr_objects
= num_packed_objects(p
);
44 for (i
= 0, err
= 0; i
< nr_objects
; i
++) {
45 unsigned char sha1
[20];
47 enum object_type type
;
51 if (nth_packed_object_sha1(p
, i
, sha1
))
52 die("internal error pack-check nth-packed-object");
53 offset
= find_pack_entry_one(sha1
, p
);
55 die("internal error pack-check find-pack-entry-one");
56 data
= unpack_entry(p
, offset
, &type
, &size
);
58 err
= error("cannot unpack %s from %s",
59 sha1_to_hex(sha1
), p
->pack_name
);
62 if (check_sha1_signature(sha1
, data
, size
, typename(type
))) {
63 err
= error("packed %s from %s is corrupt",
64 sha1_to_hex(sha1
), p
->pack_name
);
77 static void show_pack_info(struct packed_git
*p
)
79 uint32_t nr_objects
, i
, chain_histogram
[MAX_CHAIN
];
81 nr_objects
= num_packed_objects(p
);
82 memset(chain_histogram
, 0, sizeof(chain_histogram
));
84 for (i
= 0; i
< nr_objects
; i
++) {
85 unsigned char sha1
[20], base_sha1
[20];
88 unsigned long store_size
;
90 unsigned int delta_chain_length
;
92 if (nth_packed_object_sha1(p
, i
, sha1
))
93 die("internal error pack-check nth-packed-object");
94 offset
= find_pack_entry_one(sha1
, p
);
96 die("internal error pack-check find-pack-entry-one");
98 type
= packed_object_info_detail(p
, offset
, &size
, &store_size
,
101 printf("%s ", sha1_to_hex(sha1
));
102 if (!delta_chain_length
)
103 printf("%-6s %lu %"PRIuMAX
"\n",
104 type
, size
, (uintmax_t)offset
);
106 printf("%-6s %lu %"PRIuMAX
" %u %s\n",
107 type
, size
, (uintmax_t)offset
,
108 delta_chain_length
, sha1_to_hex(base_sha1
));
109 if (delta_chain_length
< MAX_CHAIN
)
110 chain_histogram
[delta_chain_length
]++;
112 chain_histogram
[0]++;
116 for (i
= 0; i
< MAX_CHAIN
; i
++) {
117 if (!chain_histogram
[i
])
119 printf("chain length %s %d: %d object%s\n",
123 1 < chain_histogram
[i
] ? "s" : "");
127 int verify_pack(struct packed_git
*p
, int verbose
)
129 off_t index_size
= p
->index_size
;
130 void *index_base
= p
->index_base
;
132 unsigned char sha1
[20];
136 /* Verify SHA1 sum of the index file */
138 SHA1_Update(&ctx
, index_base
, (unsigned int)(index_size
- 20));
139 SHA1_Final(sha1
, &ctx
);
140 if (hashcmp(sha1
, (unsigned char *)index_base
+ index_size
- 20))
141 ret
= error("Packfile index for %s SHA1 mismatch",
145 /* Verify pack file */
146 struct pack_window
*w_curs
= NULL
;
147 ret
= verify_packfile(p
, &w_curs
);
153 printf("%s: bad\n", p
->pack_name
);
156 printf("%s: ok\n", p
->pack_name
);