mirror of
https://github.com/git/git.git
synced 2026-01-10 10:13:33 +00:00
revision: make helper for pathspec to bloom keyvec
When preparing to use bloom filters in a revision walk, Git populates a boom_keyvec with an array of bloom keys for the components of a path. Before we create the ability to map multiple pathspecs to multiple bloom_keyvecs, extract the conversion from a pathspec to a bloom_keyvec into its own helper method. This simplifies the state that persists in prepare_to_use_bloom_filter() as well as makes the future change much simpler. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Lidong Yan <502024330056@smail.nju.edu.cn> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
90d5518a7d
commit
937153dece
45
revision.c
45
revision.c
@@ -687,13 +687,37 @@ static int forbid_bloom_filters(struct pathspec *spec)
|
||||
|
||||
static void release_revisions_bloom_keyvecs(struct rev_info *revs);
|
||||
|
||||
static void prepare_to_use_bloom_filter(struct rev_info *revs)
|
||||
static int convert_pathspec_to_bloom_keyvec(struct bloom_keyvec **out,
|
||||
const struct pathspec_item *pi,
|
||||
const struct bloom_filter_settings *settings)
|
||||
{
|
||||
struct pathspec_item *pi;
|
||||
char *path_alloc = NULL;
|
||||
const char *path;
|
||||
size_t len;
|
||||
int res = 0;
|
||||
|
||||
/* remove single trailing slash from path, if needed */
|
||||
if (pi->len > 0 && pi->match[pi->len - 1] == '/') {
|
||||
path_alloc = xmemdupz(pi->match, pi->len - 1);
|
||||
path = path_alloc;
|
||||
} else
|
||||
path = pi->match;
|
||||
|
||||
len = strlen(path);
|
||||
if (!len) {
|
||||
res = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
*out = bloom_keyvec_new(path, len, settings);
|
||||
|
||||
cleanup:
|
||||
free(path_alloc);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void prepare_to_use_bloom_filter(struct rev_info *revs)
|
||||
{
|
||||
if (!revs->commits)
|
||||
return;
|
||||
|
||||
@@ -711,22 +735,12 @@ static void prepare_to_use_bloom_filter(struct rev_info *revs)
|
||||
|
||||
revs->bloom_keyvecs_nr = 1;
|
||||
CALLOC_ARRAY(revs->bloom_keyvecs, 1);
|
||||
pi = &revs->pruning.pathspec.items[0];
|
||||
|
||||
/* remove single trailing slash from path, if needed */
|
||||
if (pi->len > 0 && pi->match[pi->len - 1] == '/') {
|
||||
path_alloc = xmemdupz(pi->match, pi->len - 1);
|
||||
path = path_alloc;
|
||||
} else
|
||||
path = pi->match;
|
||||
|
||||
len = strlen(path);
|
||||
if (!len)
|
||||
if (convert_pathspec_to_bloom_keyvec(&revs->bloom_keyvecs[0],
|
||||
&revs->pruning.pathspec.items[0],
|
||||
revs->bloom_filter_settings))
|
||||
goto fail;
|
||||
|
||||
revs->bloom_keyvecs[0] =
|
||||
bloom_keyvec_new(path, len, revs->bloom_filter_settings);
|
||||
|
||||
if (trace2_is_enabled() && !bloom_filter_atexit_registered) {
|
||||
atexit(trace2_bloom_filter_statistics_atexit);
|
||||
bloom_filter_atexit_registered = 1;
|
||||
@@ -736,7 +750,6 @@ static void prepare_to_use_bloom_filter(struct rev_info *revs)
|
||||
|
||||
fail:
|
||||
revs->bloom_filter_settings = NULL;
|
||||
free(path_alloc);
|
||||
release_revisions_bloom_keyvecs(revs);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user