blob: c7dea13217a00ef544d16a45d0f78de8f0e8ebc0 [file] [log] [blame]
Vicent Martifff42752013-12-21 09:00:01 -05001#ifndef PACK_BITMAP_H
2#define PACK_BITMAP_H
3
4#include "ewah/ewok.h"
5#include "khash.h"
Jeff King40d18ff2019-12-18 12:25:39 +01006#include "pack.h"
Vicent Marti7cc8f972013-12-21 09:00:16 -05007#include "pack-objects.h"
Taylor Blau3f267a12021-03-31 21:32:14 -04008#include "string-list.h"
Vicent Martifff42752013-12-21 09:00:01 -05009
Elijah Newrenef3ca952018-08-15 10:54:05 -070010struct commit;
Nguyễn Thái Ngọc Duy7c141122018-11-10 06:49:08 +010011struct repository;
Elijah Newrenef3ca952018-08-15 10:54:05 -070012struct rev_info;
13
Denton Liuaf26e2a2019-09-25 01:20:59 -070014static const char BITMAP_IDX_SIGNATURE[] = {'B', 'I', 'T', 'M'};
15
Vicent Martifff42752013-12-21 09:00:01 -050016struct bitmap_disk_header {
Denton Liuaf26e2a2019-09-25 01:20:59 -070017 char magic[ARRAY_SIZE(BITMAP_IDX_SIGNATURE)];
Vicent Martifff42752013-12-21 09:00:01 -050018 uint16_t version;
19 uint16_t options;
20 uint32_t entry_count;
brian m. carlson0f4d6ca2019-02-19 00:04:54 +000021 unsigned char checksum[GIT_MAX_RAWSZ];
Vicent Martifff42752013-12-21 09:00:01 -050022};
23
Vicent Marti7cc8f972013-12-21 09:00:16 -050024#define NEEDS_BITMAP (1u<<22)
25
Abhradeep Chakraborty28cd7302022-08-14 16:55:10 +000026/*
27 * The width in bytes of a single triplet in the lookup table
28 * extension:
29 * (commit_pos, offset, xor_row)
30 *
31 * whose fields ar 32-, 64-, 32- bits wide, respectively.
32 */
33#define BITMAP_LOOKUP_TABLE_TRIPLET_WIDTH (16)
34
Vicent Martifff42752013-12-21 09:00:01 -050035enum pack_bitmap_opts {
Abhradeep Chakraborty93eb41e2022-08-14 16:55:08 +000036 BITMAP_OPT_FULL_DAG = 0x1,
37 BITMAP_OPT_HASH_CACHE = 0x4,
38 BITMAP_OPT_LOOKUP_TABLE = 0x10,
Vicent Martifff42752013-12-21 09:00:01 -050039};
40
Vicent Marti7cc8f972013-12-21 09:00:16 -050041enum pack_bitmap_flags {
42 BITMAP_FLAG_REUSE = 0x1
43};
44
Vicent Martifff42752013-12-21 09:00:01 -050045typedef int (*show_reachable_fn)(
brian m. carlson20664962017-10-15 22:07:00 +000046 const struct object_id *oid,
Vicent Martifff42752013-12-21 09:00:01 -050047 enum object_type type,
48 int flags,
49 uint32_t hash,
50 struct packed_git *found_pack,
51 off_t found_offset);
52
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070053struct bitmap_index;
54
Taylor Blau5f5ccd92023-12-14 17:23:51 -050055struct bitmapped_pack {
56 struct packed_git *p;
57
58 uint32_t bitmap_pos;
59 uint32_t bitmap_nr;
60
61 uint32_t pack_int_id; /* MIDX only */
62};
63
Nguyễn Thái Ngọc Duy7c141122018-11-10 06:49:08 +010064struct bitmap_index *prepare_bitmap_git(struct repository *r);
Jeff Kingbfbb60d2021-09-09 15:56:58 -040065struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx);
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070066void count_bitmap_commit_list(struct bitmap_index *, uint32_t *commits,
67 uint32_t *trees, uint32_t *blobs, uint32_t *tags);
68void traverse_bitmap_commit_list(struct bitmap_index *,
Jeff King4eb707e2020-02-14 13:22:27 -050069 struct rev_info *revs,
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070070 show_reachable_fn show_reachable);
Vicent Martifff42752013-12-21 09:00:01 -050071void test_bitmap_walk(struct rev_info *revs);
Taylor Blaudff5e492021-03-31 21:32:07 -040072int test_bitmap_commits(struct repository *r);
Taylor Blaua05f02b2021-09-14 18:06:02 -040073int test_bitmap_hashes(struct repository *r);
Taylor Blaub0afdce2023-05-08 13:38:12 -040074
75#define GIT_TEST_PACK_USE_BITMAP_BOUNDARY_TRAVERSAL \
76 "GIT_TEST_PACK_USE_BITMAP_BOUNDARY_TRAVERSAL"
77
Jeff King6663ae02020-02-14 13:22:29 -050078struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
Patrick Steinhardt9cf68b22021-04-19 13:47:06 +020079 int filter_provided_objects);
Taylor Blau83296d22023-12-14 17:24:04 -050080void reuse_partial_packfile_from_bitmap(struct bitmap_index *bitmap_git,
81 struct bitmapped_pack **packs_out,
82 size_t *packs_nr_out,
Taylor Blauaf626ac2023-12-14 17:24:44 -050083 struct bitmap **reuse_out,
84 int multi_pack_reuse);
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070085int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping,
Jeff Kingd2bc62b2019-06-20 03:41:35 -040086 kh_oid_map_t *reused_bitmaps, int show_progress);
Jonathan Tanf3c23db2018-06-07 12:04:14 -070087void free_bitmap_index(struct bitmap_index *);
Jeff King40d18ff2019-12-18 12:25:39 +010088int bitmap_walk_contains(struct bitmap_index *,
89 struct bitmap *bitmap, const struct object_id *oid);
Vicent Marti7cc8f972013-12-21 09:00:16 -050090
Jeff King30cdc332018-08-21 15:07:01 -040091/*
Jeff King5476fb02018-09-01 03:44:48 -040092 * After a traversal has been performed by prepare_bitmap_walk(), this can be
Jeff King30cdc332018-08-21 15:07:01 -040093 * queried to see if a particular object was reachable from any of the
94 * objects flagged as UNINTERESTING.
95 */
brian m. carlson3c771442019-02-19 00:04:58 +000096int bitmap_has_oid_in_uninteresting(struct bitmap_index *, const struct object_id *oid);
Jeff King30cdc332018-08-21 15:07:01 -040097
Jeff King16950f82021-02-09 05:53:50 -050098off_t get_disk_usage_from_bitmap(struct bitmap_index *, struct rev_info *);
99
Vicent Marti7cc8f972013-12-21 09:00:16 -0500100void bitmap_writer_show_progress(int show);
Derrick Stolee57665242022-07-19 15:26:04 +0000101void bitmap_writer_set_checksum(const unsigned char *sha1);
Nguyễn Thái Ngọc Duy06af3bb2018-04-14 17:35:04 +0200102void bitmap_writer_build_type_index(struct packing_data *to_pack,
103 struct pack_idx_entry **index,
104 uint32_t index_nr);
Jeff King449fa5e2020-12-08 17:04:34 -0500105uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
106 struct packing_data *mapping);
107int rebuild_bitmap(const uint32_t *reposition,
108 struct ewah_bitmap *source,
109 struct bitmap *dest);
Taylor Blau98c31f32020-12-08 17:05:09 -0500110struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
111 struct commit *commit);
Vicent Marti7cc8f972013-12-21 09:00:16 -0500112void bitmap_writer_select_commits(struct commit **indexed_commits,
113 unsigned int indexed_commits_nr, int max_bitmaps);
Taylor Blau3ba3d062021-08-24 12:15:54 -0400114int bitmap_writer_build(struct packing_data *to_pack);
Vicent Marti7cc8f972013-12-21 09:00:16 -0500115void bitmap_writer_finish(struct pack_idx_entry **index,
116 uint32_t index_nr,
Vicent Martiae4f07f2013-12-21 09:00:45 -0500117 const char *filename,
118 uint16_t options);
Taylor Blau0f533c72021-08-31 16:52:21 -0400119char *midx_bitmap_filename(struct multi_pack_index *midx);
120char *pack_bitmap_filename(struct packed_git *p);
121
122int bitmap_is_midx(struct bitmap_index *bitmap_git);
Vicent Martifff42752013-12-21 09:00:01 -0500123
Taylor Blau3f267a12021-03-31 21:32:14 -0400124const struct string_list *bitmap_preferred_tips(struct repository *r);
Taylor Blau711260f2021-08-31 16:52:16 -0400125int bitmap_is_preferred_refname(struct repository *r, const char *refname);
Taylor Blau3f267a12021-03-31 21:32:14 -0400126
Derrick Stolee756f1bc2023-05-02 13:27:21 +0000127int verify_bitmap_files(struct repository *r);
128
Vicent Martifff42752013-12-21 09:00:01 -0500129#endif