2024-05-24 05:26:26 +08:00
|
|
|
#ifndef PSEUDO_MERGE_H
|
|
|
|
#define PSEUDO_MERGE_H
|
|
|
|
|
|
|
|
#include "git-compat-util.h"
|
2024-05-24 05:26:42 +08:00
|
|
|
#include "strmap.h"
|
|
|
|
#include "khash.h"
|
|
|
|
#include "ewah/ewok.h"
|
|
|
|
|
|
|
|
struct commit;
|
|
|
|
struct string_list;
|
|
|
|
struct bitmap_index;
|
|
|
|
struct bitmap_writer;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A pseudo-merge group tracks the set of non-bitmapped reference tips
|
|
|
|
* that match the given pattern.
|
|
|
|
*
|
|
|
|
* Within those matches, they are further segmented by separating
|
|
|
|
* consecutive capture groups with '-' dash character capture groups
|
|
|
|
* with '-' dash characters.
|
|
|
|
*
|
|
|
|
* Those groups are then ordered by committer date and partitioned
|
|
|
|
* into individual pseudo-merge(s) according to the decay, max_merges,
|
|
|
|
* sample_rate, and threshold parameters.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge_group {
|
|
|
|
regex_t *pattern;
|
|
|
|
|
|
|
|
/* capture group(s) -> struct pseudo_merge_matches */
|
|
|
|
struct strmap matches;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The individual pseudo-merge(s) that are generated from the
|
|
|
|
* above array of matches, partitioned according to the below
|
|
|
|
* parameters.
|
|
|
|
*/
|
|
|
|
struct commit **merges;
|
|
|
|
size_t merges_nr;
|
|
|
|
size_t merges_alloc;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Pseudo-merge grouping parameters. See git-config(1) for
|
|
|
|
* more information.
|
|
|
|
*/
|
|
|
|
double decay;
|
|
|
|
int max_merges;
|
|
|
|
double sample_rate;
|
|
|
|
int stable_size;
|
|
|
|
timestamp_t threshold;
|
|
|
|
timestamp_t stable_threshold;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct pseudo_merge_matches {
|
|
|
|
struct commit **stable;
|
|
|
|
struct commit **unstable;
|
|
|
|
size_t stable_nr, stable_alloc;
|
|
|
|
size_t unstable_nr, unstable_alloc;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Read the repository's configuration:
|
|
|
|
*
|
|
|
|
* - bitmapPseudoMerge.<name>.pattern
|
|
|
|
* - bitmapPseudoMerge.<name>.decay
|
|
|
|
* - bitmapPseudoMerge.<name>.sampleRate
|
|
|
|
* - bitmapPseudoMerge.<name>.threshold
|
|
|
|
* - bitmapPseudoMerge.<name>.maxMerges
|
|
|
|
* - bitmapPseudoMerge.<name>.stableThreshold
|
|
|
|
* - bitmapPseudoMerge.<name>.stableSize
|
|
|
|
*
|
|
|
|
* and populates the given `list` with pseudo-merge groups. String
|
|
|
|
* entry keys are the pseudo-merge group names, and the values are
|
|
|
|
* pointers to the pseudo_merge_group structure itself.
|
|
|
|
*/
|
|
|
|
void load_pseudo_merges_from_config(struct string_list *list);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* A pseudo-merge commit index (pseudo_merge_commit_idx) maps a
|
|
|
|
* particular (non-pseudo-merge) commit to the list of pseudo-merge(s)
|
|
|
|
* it appears in.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge_commit_idx {
|
|
|
|
uint32_t *pseudo_merge;
|
|
|
|
size_t nr, alloc;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Selects pseudo-merges from a list of commits, populating the given
|
|
|
|
* string_list of pseudo-merge groups.
|
|
|
|
*
|
|
|
|
* Populates the pseudo_merge_commits map with a commit_idx
|
|
|
|
* corresponding to each commit in the list. Counts the total number
|
|
|
|
* of pseudo-merges generated.
|
|
|
|
*
|
|
|
|
* Optionally shows a progress meter.
|
|
|
|
*/
|
|
|
|
void select_pseudo_merges(struct bitmap_writer *writer,
|
|
|
|
struct commit **commits, size_t commits_nr);
|
2024-05-24 05:26:26 +08:00
|
|
|
|
pseudo-merge: scaffolding for reads
Implement scaffolding within the new pseudo-merge compilation unit
necessary to use the pseudo-merge API from within the pack-bitmap.c
machinery.
The core of this scaffolding is two-fold:
- The `pseudo_merge` structure itself, which represents an individual
pseudo-merge bitmap. It has fields for both bitmaps, as well as
metadata about its position within the memory-mapped region, and
a few extra bits indicating whether or not it is satisfied, and
which bitmaps(s, if any) have been read, since they are initialized
lazily.
- The `pseudo_merge_map` structure, which holds an array of
pseudo_merges, as well as a pointer to the memory-mapped region
containing the pseudo-merge serialization from within a .bitmap
file.
Note that the `bitmap_index` structure is defined statically within the
pack-bitmap.o compilation unit, so we can't take in a `struct
bitmap_index *`. Instead, wrap the primary components necessary to read
the pseudo-merges in this new structure to avoid exposing the
implementation details of the `bitmap_index` structure.
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-05-24 05:26:52 +08:00
|
|
|
/*
|
|
|
|
* Represents a serialized view of a file containing pseudo-merge(s)
|
|
|
|
* (see Documentation/technical/bitmap-format.txt for a specification
|
|
|
|
* of the format).
|
|
|
|
*/
|
|
|
|
struct pseudo_merge_map {
|
|
|
|
/*
|
|
|
|
* An array of pseudo-merge(s), lazily loaded from the .bitmap
|
|
|
|
* file.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge *v;
|
|
|
|
size_t nr;
|
|
|
|
size_t commits_nr;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Pointers into a memory-mapped view of the .bitmap file:
|
|
|
|
*
|
|
|
|
* - map: the beginning of the .bitmap file
|
|
|
|
* - commits: the beginning of the pseudo-merge commit index
|
|
|
|
* - map_size: the size of the .bitmap file
|
|
|
|
*/
|
|
|
|
const unsigned char *map;
|
|
|
|
const unsigned char *commits;
|
|
|
|
|
|
|
|
size_t map_size;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* An individual pseudo-merge, storing a pair of lazily-loaded
|
|
|
|
* bitmaps:
|
|
|
|
*
|
|
|
|
* - commits: the set of commit(s) that are part of the pseudo-merge
|
|
|
|
* - bitmap: the set of object(s) reachable from the above set of
|
|
|
|
* commits.
|
|
|
|
*
|
|
|
|
* The `at` and `bitmap_at` fields are used to store the locations of
|
|
|
|
* each of the above bitmaps in the .bitmap file.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge {
|
|
|
|
struct ewah_bitmap *commits;
|
|
|
|
struct ewah_bitmap *bitmap;
|
|
|
|
|
|
|
|
off_t at;
|
|
|
|
off_t bitmap_at;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* `satisfied` indicates whether the given pseudo-merge has been
|
|
|
|
* used.
|
|
|
|
*
|
|
|
|
* `loaded_commits` and `loaded_bitmap` indicate whether the
|
|
|
|
* respective bitmaps have been loaded and read from the
|
|
|
|
* .bitmap file.
|
|
|
|
*/
|
|
|
|
unsigned satisfied : 1,
|
|
|
|
loaded_commits : 1,
|
|
|
|
loaded_bitmap : 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Frees the given pseudo-merge map, releasing any memory held by (a)
|
|
|
|
* parsed EWAH bitmaps, or (b) the array of pseudo-merges itself. Does
|
|
|
|
* not free the memory-mapped view of the .bitmap file.
|
|
|
|
*/
|
|
|
|
void free_pseudo_merge_map(struct pseudo_merge_map *pm);
|
|
|
|
|
2024-05-24 05:26:58 +08:00
|
|
|
/*
|
|
|
|
* Loads the bitmap corresponding to the given pseudo-merge from the
|
|
|
|
* map, if it has not already been loaded.
|
|
|
|
*/
|
|
|
|
struct ewah_bitmap *pseudo_merge_bitmap(const struct pseudo_merge_map *pm,
|
|
|
|
struct pseudo_merge *merge);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Loads the pseudo-merge and its commits bitmap from the given
|
|
|
|
* pseudo-merge map, if it has not already been loaded.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge *use_pseudo_merge(const struct pseudo_merge_map *pm,
|
|
|
|
struct pseudo_merge *merge);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Applies pseudo-merge(s) containing the given commit to the bitmap
|
|
|
|
* "result".
|
|
|
|
*
|
|
|
|
* If any pseudo-merge(s) were satisfied, returns the number
|
|
|
|
* satisfied, otherwise returns 0. If any were satisfied, the
|
|
|
|
* remaining unsatisfied pseudo-merges are cascaded (see below).
|
|
|
|
*/
|
|
|
|
int apply_pseudo_merges_for_commit(const struct pseudo_merge_map *pm,
|
|
|
|
struct bitmap *result,
|
|
|
|
struct commit *commit, uint32_t commit_pos);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Applies pseudo-merge(s) which are satisfied according to the
|
|
|
|
* current bitmap in result (or roots, see below). If any
|
|
|
|
* pseudo-merges were satisfied, repeat the process over unsatisfied
|
|
|
|
* pseudo-merge commits until no more pseudo-merges are satisfied.
|
|
|
|
*
|
|
|
|
* Result is the bitmap to which the pseudo-merge(s) are applied.
|
|
|
|
* Roots (if given) is a bitmap of the traversal tip(s) for either
|
|
|
|
* side of a reachability traversal.
|
|
|
|
*
|
|
|
|
* Roots may given instead of a populated results bitmap at the
|
|
|
|
* beginning of a traversal on either side where the reachability
|
|
|
|
* closure over tips is not yet known.
|
|
|
|
*/
|
|
|
|
int cascade_pseudo_merges(const struct pseudo_merge_map *pm,
|
|
|
|
struct bitmap *result,
|
|
|
|
struct bitmap *roots);
|
|
|
|
|
2024-05-24 05:27:21 +08:00
|
|
|
/*
|
|
|
|
* Returns a pseudo-merge which contains the exact set of commits
|
|
|
|
* listed in the "parents" bitamp, or NULL if none could be found.
|
|
|
|
*/
|
|
|
|
struct pseudo_merge *pseudo_merge_for_parents(const struct pseudo_merge_map *pm,
|
|
|
|
struct bitmap *parents);
|
|
|
|
|
2024-05-24 05:26:26 +08:00
|
|
|
#endif
|