@ -305,15 +305,21 @@ static int graph_read_oid_lookup(const unsigned char *chunk_start,
@@ -305,15 +305,21 @@ static int graph_read_oid_lookup(const unsigned char *chunk_start,
return 0;
}
struct graph_read_bloom_data_data {
struct commit_graph *g;
int commit_graph_changed_paths_version;
};
static int graph_read_bloom_data(const unsigned char *chunk_start,
size_t chunk_size, void *data)
{
struct commit_graph *g = data;
struct graph_read_bloom_data_data *d = data;
struct commit_graph *g = d->g;
uint32_t hash_version;
g->chunk_bloom_data = chunk_start;
hash_version = get_be32(chunk_start);
if (hash_version != 1)
if (hash_version != d->commit_graph_changed_paths_version)
return 0;
g->bloom_filter_settings = xmalloc(sizeof(struct bloom_filter_settings));
@ -402,11 +408,16 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
@@ -402,11 +408,16 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
graph->read_generation_data = 1;
}
if (s->commit_graph_read_changed_paths) {
if (s->commit_graph_changed_paths_version == 1
|| s->commit_graph_changed_paths_version == 2) {
struct graph_read_bloom_data_data data = {
.g = graph,
.commit_graph_changed_paths_version = s->commit_graph_changed_paths_version
};
pair_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
&graph->chunk_bloom_indexes);
read_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
graph_read_bloom_data, graph);
graph_read_bloom_data, &data);
}
if (graph->chunk_bloom_indexes && graph->chunk_bloom_data) {
@ -2372,6 +2383,14 @@ int write_commit_graph(struct object_directory *odb,
@@ -2372,6 +2383,14 @@ int write_commit_graph(struct object_directory *odb,
ctx->write_generation_data = (get_configured_generation_version(r) == 2);
ctx->num_generation_data_overflows = 0;
if (r->settings.commit_graph_changed_paths_version < 0
|| r->settings.commit_graph_changed_paths_version > 2) {
warning(_("attempting to write a commit-graph, but 'commitgraph.changedPathsVersion' (%d) is not supported"),
r->settings.commit_graph_changed_paths_version);
return 0;
}
bloom_settings.hash_version = r->settings.commit_graph_changed_paths_version == 2
? 2 : 1;
bloom_settings.bits_per_entry = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_BITS_PER_ENTRY",
bloom_settings.bits_per_entry);
bloom_settings.num_hashes = git_env_ulong("GIT_TEST_BLOOM_SETTINGS_NUM_HASHES",
@ -2401,7 +2420,7 @@ int write_commit_graph(struct object_directory *odb,
@@ -2401,7 +2420,7 @@ int write_commit_graph(struct object_directory *odb,
g = ctx->r->objects->commit_graph;
/* We have changed-paths already. Keep them in the next graph */
if (g && g->chunk_bloom_data) {
if (g && g->bloom_filter_settings) {
ctx->changed_paths = 1;
ctx->bloom_settings = g->bloom_filter_settings;
}