blob: f0180b5276b15d6567eda9984637333811fa851b [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
Nguyễn Thái Ngọc Duy7c141122018-11-10 06:49:08 +010055struct bitmap_index *prepare_bitmap_git(struct repository *r);
Jeff Kingbfbb60d2021-09-09 15:56:58 -040056struct bitmap_index *prepare_midx_bitmap_git(struct multi_pack_index *midx);
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070057void count_bitmap_commit_list(struct bitmap_index *, uint32_t *commits,
58 uint32_t *trees, uint32_t *blobs, uint32_t *tags);
59void traverse_bitmap_commit_list(struct bitmap_index *,
Jeff King4eb707e2020-02-14 13:22:27 -050060 struct rev_info *revs,
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070061 show_reachable_fn show_reachable);
Vicent Martifff42752013-12-21 09:00:01 -050062void test_bitmap_walk(struct rev_info *revs);
Taylor Blaudff5e492021-03-31 21:32:07 -040063int test_bitmap_commits(struct repository *r);
Taylor Blaua05f02b2021-09-14 18:06:02 -040064int test_bitmap_hashes(struct repository *r);
Jeff King6663ae02020-02-14 13:22:29 -050065struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
Patrick Steinhardt9cf68b22021-04-19 13:47:06 +020066 int filter_provided_objects);
Taylor Blau6d08b9d2021-09-28 21:55:20 -040067uint32_t midx_preferred_pack(struct bitmap_index *bitmap_git);
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070068int reuse_partial_packfile_from_bitmap(struct bitmap_index *,
69 struct packed_git **packfile,
Jeff Kingbb514de2019-12-18 12:25:45 +010070 uint32_t *entries,
71 struct bitmap **reuse_out);
Jonathan Tan3ae5fa02018-06-07 12:04:13 -070072int rebuild_existing_bitmaps(struct bitmap_index *, struct packing_data *mapping,
Jeff Kingd2bc62b2019-06-20 03:41:35 -040073 kh_oid_map_t *reused_bitmaps, int show_progress);
Jonathan Tanf3c23db2018-06-07 12:04:14 -070074void free_bitmap_index(struct bitmap_index *);
Jeff King40d18ff2019-12-18 12:25:39 +010075int bitmap_walk_contains(struct bitmap_index *,
76 struct bitmap *bitmap, const struct object_id *oid);
Vicent Marti7cc8f972013-12-21 09:00:16 -050077
Jeff King30cdc332018-08-21 15:07:01 -040078/*
Jeff King5476fb02018-09-01 03:44:48 -040079 * After a traversal has been performed by prepare_bitmap_walk(), this can be
Jeff King30cdc332018-08-21 15:07:01 -040080 * queried to see if a particular object was reachable from any of the
81 * objects flagged as UNINTERESTING.
82 */
brian m. carlson3c771442019-02-19 00:04:58 +000083int bitmap_has_oid_in_uninteresting(struct bitmap_index *, const struct object_id *oid);
Jeff King30cdc332018-08-21 15:07:01 -040084
Jeff King16950f82021-02-09 05:53:50 -050085off_t get_disk_usage_from_bitmap(struct bitmap_index *, struct rev_info *);
86
Vicent Marti7cc8f972013-12-21 09:00:16 -050087void bitmap_writer_show_progress(int show);
Derrick Stolee57665242022-07-19 15:26:04 +000088void bitmap_writer_set_checksum(const unsigned char *sha1);
Nguyễn Thái Ngọc Duy06af3bb2018-04-14 17:35:04 +020089void bitmap_writer_build_type_index(struct packing_data *to_pack,
90 struct pack_idx_entry **index,
91 uint32_t index_nr);
Jeff King449fa5e2020-12-08 17:04:34 -050092uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
93 struct packing_data *mapping);
94int rebuild_bitmap(const uint32_t *reposition,
95 struct ewah_bitmap *source,
96 struct bitmap *dest);
Taylor Blau98c31f32020-12-08 17:05:09 -050097struct ewah_bitmap *bitmap_for_commit(struct bitmap_index *bitmap_git,
98 struct commit *commit);
Vicent Marti7cc8f972013-12-21 09:00:16 -050099void bitmap_writer_select_commits(struct commit **indexed_commits,
100 unsigned int indexed_commits_nr, int max_bitmaps);
Taylor Blau3ba3d062021-08-24 12:15:54 -0400101int bitmap_writer_build(struct packing_data *to_pack);
Vicent Marti7cc8f972013-12-21 09:00:16 -0500102void bitmap_writer_finish(struct pack_idx_entry **index,
103 uint32_t index_nr,
Vicent Martiae4f07f2013-12-21 09:00:45 -0500104 const char *filename,
105 uint16_t options);
Taylor Blau0f533c72021-08-31 16:52:21 -0400106char *midx_bitmap_filename(struct multi_pack_index *midx);
107char *pack_bitmap_filename(struct packed_git *p);
108
109int bitmap_is_midx(struct bitmap_index *bitmap_git);
Vicent Martifff42752013-12-21 09:00:01 -0500110
Taylor Blau3f267a12021-03-31 21:32:14 -0400111const struct string_list *bitmap_preferred_tips(struct repository *r);
Taylor Blau711260f2021-08-31 16:52:16 -0400112int bitmap_is_preferred_refname(struct repository *r, const char *refname);
Taylor Blau3f267a12021-03-31 21:32:14 -0400113
Vicent Martifff42752013-12-21 09:00:01 -0500114#endif