diff options
author | Jonathan Tan <jonathantanmy@google.com> | 2018-07-12 01:42:42 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-07-18 01:47:48 +0300 |
commit | dade47c06cf849b0ca180a8e6383b55ea6f75812 (patch) | |
tree | 9e7884a642dbf92f13b874457bf21464c383b9b2 /commit-graph.c | |
parent | 8527750626f8a1b0fe641a5163760be054cc1d64 (diff) |
commit-graph: add repo arg to graph readers
Add a struct repository argument to the functions in commit-graph.h that
read the commit graph. (This commit does not affect functions that write
commit graphs.)
Because the commit graph functions can now read the commit graph of any
repository, the global variable core_commit_graph has been removed.
Instead, the config option core.commitGraph is now read on the first
time in a repository that a commit is attempted to be parsed using its
commit graph.
This commit includes a test that exercises the functionality on an
arbitrary repository that is not the_repository.
Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'commit-graph.c')
-rw-r--r-- | commit-graph.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/commit-graph.c b/commit-graph.c index b6a76a1413f..b0a55ad128f 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -183,15 +183,15 @@ cleanup_fail: exit(1); } -static void prepare_commit_graph_one(const char *obj_dir) +static void prepare_commit_graph_one(struct repository *r, const char *obj_dir) { char *graph_name; - if (the_repository->objects->commit_graph) + if (r->objects->commit_graph) return; graph_name = get_commit_graph_filename(obj_dir); - the_repository->objects->commit_graph = + r->objects->commit_graph = load_commit_graph_one(graph_name); FREE_AND_NULL(graph_name); @@ -203,26 +203,34 @@ static void prepare_commit_graph_one(const char *obj_dir) * On the first invocation, this function attemps to load the commit * graph if the_repository is configured to have one. */ -static int prepare_commit_graph(void) +static int prepare_commit_graph(struct repository *r) { struct alternate_object_database *alt; char *obj_dir; + int config_value; - if (the_repository->objects->commit_graph_attempted) - return !!the_repository->objects->commit_graph; - the_repository->objects->commit_graph_attempted = 1; + if (r->objects->commit_graph_attempted) + return !!r->objects->commit_graph; + r->objects->commit_graph_attempted = 1; - if (!core_commit_graph) + if (repo_config_get_bool(r, "core.commitgraph", &config_value) || + !config_value) + /* + * This repository is not configured to use commit graphs, so + * do not load one. (But report commit_graph_attempted anyway + * so that commit graph loading is not attempted again for this + * repository.) + */ return 0; - obj_dir = get_object_directory(); - prepare_commit_graph_one(obj_dir); - prepare_alt_odb(the_repository); - for (alt = the_repository->objects->alt_odb_list; - !the_repository->objects->commit_graph && alt; + obj_dir = r->objects->objectdir; + prepare_commit_graph_one(r, obj_dir); + prepare_alt_odb(r); + for (alt = r->objects->alt_odb_list; + !r->objects->commit_graph && alt; alt = alt->next) - prepare_commit_graph_one(alt->path); - return !!the_repository->objects->commit_graph; + prepare_commit_graph_one(r, alt->path); + return !!r->objects->commit_graph; } static void close_commit_graph(void) @@ -323,8 +331,6 @@ static int parse_commit_in_graph_one(struct commit_graph *g, struct commit *item { uint32_t pos; - if (!core_commit_graph) - return 0; if (item->object.parsed) return 1; @@ -334,20 +340,20 @@ static int parse_commit_in_graph_one(struct commit_graph *g, struct commit *item return 0; } -int parse_commit_in_graph(struct commit *item) +int parse_commit_in_graph(struct repository *r, struct commit *item) { - if (!prepare_commit_graph()) + if (!prepare_commit_graph(r)) return 0; - return parse_commit_in_graph_one(the_repository->objects->commit_graph, item); + return parse_commit_in_graph_one(r->objects->commit_graph, item); } -void load_commit_graph_info(struct commit *item) +void load_commit_graph_info(struct repository *r, struct commit *item) { uint32_t pos; - if (!prepare_commit_graph()) + if (!prepare_commit_graph(r)) return; - if (find_commit_in_graph(item, the_repository->objects->commit_graph, &pos)) - fill_commit_graph_info(item, the_repository->objects->commit_graph, pos); + if (find_commit_in_graph(item, r->objects->commit_graph, &pos)) + fill_commit_graph_info(item, r->objects->commit_graph, pos); } static struct tree *load_tree_for_commit(struct commit_graph *g, struct commit *c) @@ -373,9 +379,9 @@ static struct tree *get_commit_tree_in_graph_one(struct commit_graph *g, return load_tree_for_commit(g, (struct commit *)c); } -struct tree *get_commit_tree_in_graph(const struct commit *c) +struct tree *get_commit_tree_in_graph(struct repository *r, const struct commit *c) { - return get_commit_tree_in_graph_one(the_repository->objects->commit_graph, c); + return get_commit_tree_in_graph_one(r->objects->commit_graph, c); } static void write_graph_chunk_fanout(struct hashfile *f, @@ -691,7 +697,7 @@ void write_commit_graph(const char *obj_dir, oids.alloc = approximate_object_count() / 4; if (append) { - prepare_commit_graph_one(obj_dir); + prepare_commit_graph_one(the_repository, obj_dir); if (the_repository->objects->commit_graph) oids.alloc += the_repository->objects->commit_graph->num_commits; } |