|
1 | 1 | #include "builtin.h"
|
2 | 2 | #include "cache.h"
|
3 |
| -#include "pack.h" |
4 |
| -#include "pack-revindex.h" |
| 3 | +#include "run-command.h" |
5 | 4 | #include "parse-options.h"
|
6 | 5 |
|
7 |
| -#define MAX_CHAIN 50 |
8 |
| - |
9 | 6 | #define VERIFY_PACK_VERBOSE 01
|
10 | 7 | #define VERIFY_PACK_STAT_ONLY 02
|
11 | 8 |
|
12 |
| -static void show_pack_info(struct packed_git *p, unsigned int flags) |
13 |
| -{ |
14 |
| - uint32_t nr_objects, i; |
15 |
| - int cnt; |
16 |
| - int stat_only = flags & VERIFY_PACK_STAT_ONLY; |
17 |
| - unsigned long chain_histogram[MAX_CHAIN+1], baseobjects; |
18 |
| - |
19 |
| - nr_objects = p->num_objects; |
20 |
| - memset(chain_histogram, 0, sizeof(chain_histogram)); |
21 |
| - baseobjects = 0; |
22 |
| - |
23 |
| - for (i = 0; i < nr_objects; i++) { |
24 |
| - const unsigned char *sha1; |
25 |
| - unsigned char base_sha1[20]; |
26 |
| - const char *type; |
27 |
| - unsigned long size; |
28 |
| - unsigned long store_size; |
29 |
| - off_t offset; |
30 |
| - unsigned int delta_chain_length; |
31 |
| - |
32 |
| - sha1 = nth_packed_object_sha1(p, i); |
33 |
| - if (!sha1) |
34 |
| - die("internal error pack-check nth-packed-object"); |
35 |
| - offset = nth_packed_object_offset(p, i); |
36 |
| - type = packed_object_info_detail(p, offset, &size, &store_size, |
37 |
| - &delta_chain_length, |
38 |
| - base_sha1); |
39 |
| - if (!stat_only) |
40 |
| - printf("%s ", sha1_to_hex(sha1)); |
41 |
| - if (!delta_chain_length) { |
42 |
| - if (!stat_only) |
43 |
| - printf("%-6s %lu %lu %"PRIuMAX"\n", |
44 |
| - type, size, store_size, (uintmax_t)offset); |
45 |
| - baseobjects++; |
46 |
| - } |
47 |
| - else { |
48 |
| - if (!stat_only) |
49 |
| - printf("%-6s %lu %lu %"PRIuMAX" %u %s\n", |
50 |
| - type, size, store_size, (uintmax_t)offset, |
51 |
| - delta_chain_length, sha1_to_hex(base_sha1)); |
52 |
| - if (delta_chain_length <= MAX_CHAIN) |
53 |
| - chain_histogram[delta_chain_length]++; |
54 |
| - else |
55 |
| - chain_histogram[0]++; |
56 |
| - } |
57 |
| - } |
58 |
| - |
59 |
| - if (baseobjects) |
60 |
| - printf("non delta: %lu object%s\n", |
61 |
| - baseobjects, baseobjects > 1 ? "s" : ""); |
62 |
| - |
63 |
| - for (cnt = 1; cnt <= MAX_CHAIN; cnt++) { |
64 |
| - if (!chain_histogram[cnt]) |
65 |
| - continue; |
66 |
| - printf("chain length = %d: %lu object%s\n", cnt, |
67 |
| - chain_histogram[cnt], |
68 |
| - chain_histogram[cnt] > 1 ? "s" : ""); |
69 |
| - } |
70 |
| - if (chain_histogram[0]) |
71 |
| - printf("chain length > %d: %lu object%s\n", MAX_CHAIN, |
72 |
| - chain_histogram[0], |
73 |
| - chain_histogram[0] > 1 ? "s" : ""); |
74 |
| -} |
75 |
| - |
76 | 9 | static int verify_one_pack(const char *path, unsigned int flags)
|
77 | 10 | {
|
78 |
| - char arg[PATH_MAX]; |
79 |
| - int len; |
| 11 | + struct child_process index_pack; |
| 12 | + const char *argv[] = {"index-pack", NULL, NULL, NULL }; |
| 13 | + struct strbuf arg = STRBUF_INIT; |
80 | 14 | int verbose = flags & VERIFY_PACK_VERBOSE;
|
81 | 15 | int stat_only = flags & VERIFY_PACK_STAT_ONLY;
|
82 |
| - struct packed_git *pack; |
83 | 16 | int err;
|
84 | 17 |
|
85 |
| - len = strlcpy(arg, path, PATH_MAX); |
86 |
| - if (len >= PATH_MAX) |
87 |
| - return error("name too long: %s", path); |
88 |
| - |
89 |
| - /* |
90 |
| - * In addition to "foo.idx" we accept "foo.pack" and "foo"; |
91 |
| - * normalize these forms to "foo.idx" for add_packed_git(). |
92 |
| - */ |
93 |
| - if (has_extension(arg, ".pack")) { |
94 |
| - strcpy(arg + len - 5, ".idx"); |
95 |
| - len--; |
96 |
| - } else if (!has_extension(arg, ".idx")) { |
97 |
| - if (len + 4 >= PATH_MAX) |
98 |
| - return error("name too long: %s.idx", arg); |
99 |
| - strcpy(arg + len, ".idx"); |
100 |
| - len += 4; |
101 |
| - } |
| 18 | + if (stat_only) |
| 19 | + argv[1] = "--verify-stat-only"; |
| 20 | + else if (verbose) |
| 21 | + argv[1] = "--verify-stat"; |
| 22 | + else |
| 23 | + argv[1] = "--verify"; |
102 | 24 |
|
103 | 25 | /*
|
104 |
| - * add_packed_git() uses our buffer (containing "foo.idx") to |
105 |
| - * build the pack filename ("foo.pack"). Make sure it fits. |
| 26 | + * In addition to "foo.pack" we accept "foo.idx" and "foo"; |
| 27 | + * normalize these forms to "foo.pack" for "index-pack --verify". |
106 | 28 | */
|
107 |
| - if (len + 1 >= PATH_MAX) { |
108 |
| - arg[len - 4] = '\0'; |
109 |
| - return error("name too long: %s.pack", arg); |
110 |
| - } |
111 |
| - |
112 |
| - pack = add_packed_git(arg, len, 1); |
113 |
| - if (!pack) |
114 |
| - return error("packfile %s not found.", arg); |
| 29 | + strbuf_addstr(&arg, path); |
| 30 | + if (has_extension(arg.buf, ".idx")) |
| 31 | + strbuf_splice(&arg, arg.len - 3, 3, "pack", 4); |
| 32 | + else if (!has_extension(arg.buf, ".pack")) |
| 33 | + strbuf_add(&arg, ".pack", 5); |
| 34 | + argv[2] = arg.buf; |
115 | 35 |
|
116 |
| - install_packed_git(pack); |
| 36 | + memset(&index_pack, 0, sizeof(index_pack)); |
| 37 | + index_pack.argv = argv; |
| 38 | + index_pack.git_cmd = 1; |
117 | 39 |
|
118 |
| - if (!stat_only) |
119 |
| - err = verify_pack(pack); |
120 |
| - else |
121 |
| - err = open_pack_index(pack); |
| 40 | + err = run_command(&index_pack); |
122 | 41 |
|
123 | 42 | if (verbose || stat_only) {
|
124 | 43 | if (err)
|
125 |
| - printf("%s: bad\n", pack->pack_name); |
| 44 | + printf("%s: bad\n", arg.buf); |
126 | 45 | else {
|
127 |
| - show_pack_info(pack, flags); |
128 | 46 | if (!stat_only)
|
129 |
| - printf("%s: ok\n", pack->pack_name); |
| 47 | + printf("%s: ok\n", arg.buf); |
130 | 48 | }
|
131 | 49 | }
|
| 50 | + strbuf_release(&arg); |
132 | 51 |
|
133 | 52 | return err;
|
134 | 53 | }
|
@@ -159,7 +78,6 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)
|
159 | 78 | for (i = 0; i < argc; i++) {
|
160 | 79 | if (verify_one_pack(argv[i], flags))
|
161 | 80 | err = 1;
|
162 |
| - discard_revindex(); |
163 | 81 | }
|
164 | 82 |
|
165 | 83 | return err;
|
|
0 commit comments