Git 2.47-rc0
[git.git] / t / helper / test-read-midx.c
blob438fb9fc6197fc465f79d9a65b719ae315fed373
1 #define USE_THE_REPOSITORY_VARIABLE
3 #include "test-tool.h"
4 #include "hex.h"
5 #include "midx.h"
6 #include "repository.h"
7 #include "object-store-ll.h"
8 #include "pack-bitmap.h"
9 #include "packfile.h"
10 #include "setup.h"
11 #include "gettext.h"
12 #include "pack-revindex.h"
14 static int read_midx_file(const char *object_dir, const char *checksum,
15 int show_objects)
17 uint32_t i;
18 struct multi_pack_index *m;
20 setup_git_directory();
21 m = load_multi_pack_index(object_dir, 1);
23 if (!m)
24 return 1;
26 if (checksum) {
27 while (m && strcmp(hash_to_hex(get_midx_checksum(m)), checksum))
28 m = m->base_midx;
29 if (!m)
30 return 1;
33 printf("header: %08x %d %d %d %d\n",
34 m->signature,
35 m->version,
36 m->hash_len,
37 m->num_chunks,
38 m->num_packs);
40 printf("chunks:");
42 if (m->chunk_pack_names)
43 printf(" pack-names");
44 if (m->chunk_oid_fanout)
45 printf(" oid-fanout");
46 if (m->chunk_oid_lookup)
47 printf(" oid-lookup");
48 if (m->chunk_object_offsets)
49 printf(" object-offsets");
50 if (m->chunk_large_offsets)
51 printf(" large-offsets");
53 printf("\nnum_objects: %d\n", m->num_objects);
55 printf("packs:\n");
56 for (i = 0; i < m->num_packs; i++)
57 printf("%s\n", m->pack_names[i]);
59 printf("object-dir: %s\n", m->object_dir);
61 if (show_objects) {
62 struct object_id oid;
63 struct pack_entry e;
65 for (i = 0; i < m->num_objects; i++) {
66 nth_midxed_object_oid(&oid, m,
67 i + m->num_objects_in_base);
68 fill_midx_entry(the_repository, &oid, &e, m);
70 printf("%s %"PRIu64"\t%s\n",
71 oid_to_hex(&oid), e.offset, e.p->pack_name);
75 close_midx(m);
77 return 0;
80 static int read_midx_checksum(const char *object_dir)
82 struct multi_pack_index *m;
84 setup_git_directory();
85 m = load_multi_pack_index(object_dir, 1);
86 if (!m)
87 return 1;
88 printf("%s\n", hash_to_hex(get_midx_checksum(m)));
90 close_midx(m);
91 return 0;
94 static int read_midx_preferred_pack(const char *object_dir)
96 struct multi_pack_index *midx = NULL;
97 uint32_t preferred_pack;
99 setup_git_directory();
101 midx = load_multi_pack_index(object_dir, 1);
102 if (!midx)
103 return 1;
105 if (midx_preferred_pack(midx, &preferred_pack) < 0) {
106 warning(_("could not determine MIDX preferred pack"));
107 close_midx(midx);
108 return 1;
111 printf("%s\n", midx->pack_names[preferred_pack]);
112 close_midx(midx);
113 return 0;
116 static int read_midx_bitmapped_packs(const char *object_dir)
118 struct multi_pack_index *midx = NULL;
119 struct bitmapped_pack pack;
120 uint32_t i;
122 setup_git_directory();
124 midx = load_multi_pack_index(object_dir, 1);
125 if (!midx)
126 return 1;
128 for (i = 0; i < midx->num_packs + midx->num_packs_in_base; i++) {
129 if (nth_bitmapped_pack(the_repository, midx, &pack, i) < 0) {
130 close_midx(midx);
131 return 1;
134 printf("%s\n", pack_basename(pack.p));
135 printf(" bitmap_pos: %"PRIuMAX"\n", (uintmax_t)pack.bitmap_pos);
136 printf(" bitmap_nr: %"PRIuMAX"\n", (uintmax_t)pack.bitmap_nr);
139 close_midx(midx);
141 return 0;
144 int cmd__read_midx(int argc, const char **argv)
146 if (!(argc == 2 || argc == 3 || argc == 4))
147 usage("read-midx [--show-objects|--checksum|--preferred-pack|--bitmap] <object-dir> <checksum>");
149 if (!strcmp(argv[1], "--show-objects"))
150 return read_midx_file(argv[2], argv[3], 1);
151 else if (!strcmp(argv[1], "--checksum"))
152 return read_midx_checksum(argv[2]);
153 else if (!strcmp(argv[1], "--preferred-pack"))
154 return read_midx_preferred_pack(argv[2]);
155 else if (!strcmp(argv[1], "--bitmap"))
156 return read_midx_bitmapped_packs(argv[2]);
157 return read_midx_file(argv[1], argv[2], 0);