blob: 5578cd7b835e2b396e502e8abaf4560ab765c850 [file] [log] [blame]
Ramsay Jones0009d352018-10-17 23:13:26 +01001#ifndef MIDX_H
2#define MIDX_H
Derrick Stoleea3407732018-07-12 15:39:21 -04003
Derrick Stoleec4d25222018-07-12 15:39:33 -04004#include "repository.h"
Taylor Blau56d863e2021-09-28 21:55:01 -04005#include "string-list.h"
Derrick Stoleec4d25222018-07-12 15:39:33 -04006
Ramsay Jones642e5702018-09-19 01:13:36 +01007struct object_id;
8struct pack_entry;
Derrick Stolee64404a22019-04-29 09:18:55 -07009struct repository;
Ramsay Jones642e5702018-09-19 01:13:36 +010010
Derrick Stolee0465a502018-10-12 10:34:20 -070011#define GIT_TEST_MULTI_PACK_INDEX "GIT_TEST_MULTI_PACK_INDEX"
Taylor Blauff1e6532021-08-31 16:52:43 -040012#define GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP \
13 "GIT_TEST_MULTI_PACK_INDEX_WRITE_BITMAP"
Derrick Stolee0465a502018-10-12 10:34:20 -070014
Derrick Stolee4d805602018-07-12 15:39:23 -040015struct multi_pack_index {
Derrick Stoleec4d25222018-07-12 15:39:33 -040016 struct multi_pack_index *next;
17
Derrick Stolee4d805602018-07-12 15:39:23 -040018 const unsigned char *data;
19 size_t data_len;
20
Taylor Blauf8940812021-03-30 11:04:26 -040021 const uint32_t *revindex_data;
22 const uint32_t *revindex_map;
23 size_t revindex_len;
24
Derrick Stolee4d805602018-07-12 15:39:23 -040025 uint32_t signature;
26 unsigned char version;
27 unsigned char hash_len;
28 unsigned char num_chunks;
29 uint32_t num_packs;
30 uint32_t num_objects;
31
Derrick Stolee2cf489a2018-08-20 16:51:55 +000032 int local;
33
Derrick Stolee32f3c542018-07-12 15:39:27 -040034 const unsigned char *chunk_pack_names;
Derrick Stoleed7cacf22018-07-12 15:39:31 -040035 const uint32_t *chunk_oid_fanout;
Derrick Stolee0d5b3a52018-07-12 15:39:30 -040036 const unsigned char *chunk_oid_lookup;
Derrick Stolee662148c2018-07-12 15:39:32 -040037 const unsigned char *chunk_object_offsets;
38 const unsigned char *chunk_large_offsets;
Taylor Blau7f514b72022-01-25 17:41:17 -050039 const unsigned char *chunk_revindex;
Derrick Stolee32f3c542018-07-12 15:39:27 -040040
Derrick Stolee32275652018-07-12 15:39:28 -040041 const char **pack_names;
Derrick Stolee3715a632018-07-12 15:39:34 -040042 struct packed_git **packs;
Derrick Stolee4d805602018-07-12 15:39:23 -040043 char object_dir[FLEX_ARRAY];
44};
45
William Bakerefbc3ae2019-10-21 18:39:58 +000046#define MIDX_PROGRESS (1 << 0)
Taylor Blau38ff7ca2021-03-30 11:04:32 -040047#define MIDX_WRITE_REV_INDEX (1 << 1)
Taylor Blauc528e172021-08-31 16:52:24 -040048#define MIDX_WRITE_BITMAP (1 << 2)
Taylor Blaucaca3c92021-09-14 18:06:06 -040049#define MIDX_WRITE_BITMAP_HASH_CACHE (1 << 3)
Abhradeep Chakraborty76f14b72022-08-14 16:55:09 +000050#define MIDX_WRITE_BITMAP_LOOKUP_TABLE (1 << 4)
William Bakerefbc3ae2019-10-21 18:39:58 +000051
Taylor Blau0f533c72021-08-31 16:52:21 -040052const unsigned char *get_midx_checksum(struct multi_pack_index *m);
Taylor Blau60980ae2021-10-26 17:01:21 -040053void get_midx_filename(struct strbuf *out, const char *object_dir);
54void get_midx_rev_filename(struct strbuf *out, struct multi_pack_index *m);
Taylor Blauf8940812021-03-30 11:04:26 -040055
Derrick Stolee2cf489a2018-08-20 16:51:55 +000056struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local);
Derrick Stolee64404a22019-04-29 09:18:55 -070057int prepare_midx_pack(struct repository *r, struct multi_pack_index *m, uint32_t pack_int_id);
Derrick Stolee3715a632018-07-12 15:39:34 -040058int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
Taylor Blau62f2c1b2021-03-30 11:04:20 -040059off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos);
60uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos);
Derrick Stolee8aac67a2018-07-12 15:39:35 -040061struct object_id *nth_midxed_object_oid(struct object_id *oid,
62 struct multi_pack_index *m,
63 uint32_t n);
Derrick Stolee64404a22019-04-29 09:18:55 -070064int fill_midx_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e, struct multi_pack_index *m);
Jeff King013fd7a2019-04-05 14:06:04 -040065int midx_contains_pack(struct multi_pack_index *m, const char *idx_or_pack_name);
Derrick Stolee2cf489a2018-08-20 16:51:55 +000066int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local);
Derrick Stolee4d805602018-07-12 15:39:23 -040067
Taylor Blau56d863e2021-09-28 21:55:01 -040068/*
69 * Variant of write_midx_file which writes a MIDX containing only the packs
70 * specified in packs_to_include.
71 */
Taylor Blau08944d12021-09-28 21:55:07 -040072int write_midx_file(const char *object_dir,
73 const char *preferred_pack_name,
74 const char *refs_snapshot,
75 unsigned flags);
Taylor Blau56d863e2021-09-28 21:55:01 -040076int write_midx_file_only(const char *object_dir,
77 struct string_list *packs_to_include,
78 const char *preferred_pack_name,
Taylor Blau08944d12021-09-28 21:55:07 -040079 const char *refs_snapshot,
Taylor Blau56d863e2021-09-28 21:55:01 -040080 unsigned flags);
Derrick Stolee1dcd9f22018-10-12 10:34:19 -070081void clear_midx_file(struct repository *r);
William Bakerefbc3ae2019-10-21 18:39:58 +000082int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags);
83int expire_midx_packs(struct repository *r, const char *object_dir, unsigned flags);
84int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags);
Derrick Stoleea3407732018-07-12 15:39:21 -040085
Derrick Stolee1dcd9f22018-10-12 10:34:19 -070086void close_midx(struct multi_pack_index *m);
Derrick Stoleea3407732018-07-12 15:39:21 -040087
88#endif