Git fork
at reftables-rust 138 lines 5.0 kB view raw
1#ifndef MIDX_H 2#define MIDX_H 3 4#include "string-list.h" 5 6struct object_id; 7struct pack_entry; 8struct repository; 9struct bitmapped_pack; 10struct git_hash_algo; 11struct odb_source; 12 13#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */ 14#define MIDX_VERSION 1 15#define MIDX_BYTE_FILE_VERSION 4 16#define MIDX_BYTE_HASH_VERSION 5 17#define MIDX_BYTE_NUM_CHUNKS 6 18#define MIDX_BYTE_NUM_PACKS 8 19#define MIDX_HEADER_SIZE 12 20 21#define MIDX_CHUNK_ALIGNMENT 4 22#define MIDX_CHUNKID_PACKNAMES 0x504e414d /* "PNAM" */ 23#define MIDX_CHUNKID_BITMAPPEDPACKS 0x42544d50 /* "BTMP" */ 24#define MIDX_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */ 25#define MIDX_CHUNKID_OIDLOOKUP 0x4f49444c /* "OIDL" */ 26#define MIDX_CHUNKID_OBJECTOFFSETS 0x4f4f4646 /* "OOFF" */ 27#define MIDX_CHUNKID_LARGEOFFSETS 0x4c4f4646 /* "LOFF" */ 28#define MIDX_CHUNKID_REVINDEX 0x52494458 /* "RIDX" */ 29#define MIDX_CHUNKID_BASE 0x42415345 /* "BASE" */ 30#define MIDX_CHUNK_OFFSET_WIDTH (2 * sizeof(uint32_t)) 31#define MIDX_LARGE_OFFSET_NEEDED 0x80000000 32 33#define GIT_TEST_MULTI_PACK_INDEX "GIT_TEST_MULTI_PACK_INDEX" 34#define GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL \ 35 "GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL" 36 37struct multi_pack_index { 38 struct odb_source *source; 39 40 const unsigned char *data; 41 size_t data_len; 42 43 const uint32_t *revindex_data; 44 const uint32_t *revindex_map; 45 size_t revindex_len; 46 47 uint32_t signature; 48 unsigned char version; 49 unsigned char hash_len; 50 unsigned char num_chunks; 51 uint32_t num_packs; 52 uint32_t num_objects; 53 int preferred_pack_idx; 54 55 int has_chain; 56 57 const unsigned char *chunk_pack_names; 58 size_t chunk_pack_names_len; 59 const uint32_t *chunk_bitmapped_packs; 60 size_t chunk_bitmapped_packs_len; 61 const uint32_t *chunk_oid_fanout; 62 const unsigned char *chunk_oid_lookup; 63 const unsigned char *chunk_object_offsets; 64 const unsigned char *chunk_large_offsets; 65 size_t chunk_large_offsets_len; 66 const unsigned char *chunk_revindex; 67 size_t chunk_revindex_len; 68 69 struct multi_pack_index *base_midx; 70 uint32_t num_objects_in_base; 71 uint32_t num_packs_in_base; 72 73 const char **pack_names; 74 struct packed_git **packs; 75}; 76 77#define MIDX_PROGRESS (1 << 0) 78#define MIDX_WRITE_REV_INDEX (1 << 1) 79#define MIDX_WRITE_BITMAP (1 << 2) 80#define MIDX_WRITE_BITMAP_HASH_CACHE (1 << 3) 81#define MIDX_WRITE_BITMAP_LOOKUP_TABLE (1 << 4) 82#define MIDX_WRITE_INCREMENTAL (1 << 5) 83 84#define MIDX_EXT_REV "rev" 85#define MIDX_EXT_BITMAP "bitmap" 86#define MIDX_EXT_MIDX "midx" 87 88const unsigned char *get_midx_checksum(struct multi_pack_index *m); 89void get_midx_filename(struct odb_source *source, struct strbuf *out); 90void get_midx_filename_ext(struct odb_source *source, struct strbuf *out, 91 const unsigned char *hash, const char *ext); 92void get_midx_chain_dirname(struct odb_source *source, struct strbuf *out); 93void get_midx_chain_filename(struct odb_source *source, struct strbuf *out); 94void get_split_midx_filename_ext(struct odb_source *source, struct strbuf *buf, 95 const unsigned char *hash, const char *ext); 96 97struct multi_pack_index *get_multi_pack_index(struct odb_source *source); 98struct multi_pack_index *load_multi_pack_index(struct odb_source *source); 99int prepare_midx_pack(struct multi_pack_index *m, uint32_t pack_int_id); 100struct packed_git *nth_midxed_pack(struct multi_pack_index *m, 101 uint32_t pack_int_id); 102int nth_bitmapped_pack(struct multi_pack_index *m, 103 struct bitmapped_pack *bp, uint32_t pack_int_id); 104int bsearch_one_midx(const struct object_id *oid, struct multi_pack_index *m, 105 uint32_t *result); 106int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, 107 uint32_t *result); 108int midx_has_oid(struct multi_pack_index *m, const struct object_id *oid); 109off_t nth_midxed_offset(struct multi_pack_index *m, uint32_t pos); 110uint32_t nth_midxed_pack_int_id(struct multi_pack_index *m, uint32_t pos); 111struct object_id *nth_midxed_object_oid(struct object_id *oid, 112 struct multi_pack_index *m, 113 uint32_t n); 114int fill_midx_entry(struct multi_pack_index *m, const struct object_id *oid, struct pack_entry *e); 115int midx_contains_pack(struct multi_pack_index *m, 116 const char *idx_or_pack_name); 117int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id); 118int prepare_multi_pack_index_one(struct odb_source *source); 119 120/* 121 * Variant of write_midx_file which writes a MIDX containing only the packs 122 * specified in packs_to_include. 123 */ 124int write_midx_file(struct odb_source *source, 125 const char *preferred_pack_name, const char *refs_snapshot, 126 unsigned flags); 127int write_midx_file_only(struct odb_source *source, 128 struct string_list *packs_to_include, 129 const char *preferred_pack_name, 130 const char *refs_snapshot, unsigned flags); 131void clear_midx_file(struct repository *r); 132int verify_midx_file(struct odb_source *source, unsigned flags); 133int expire_midx_packs(struct odb_source *source, unsigned flags); 134int midx_repack(struct odb_source *source, size_t batch_size, unsigned flags); 135 136void close_midx(struct multi_pack_index *m); 137 138#endif