"Derrick Stolee via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > > Make close_commit_graph() work for arbitrary repositories. The first line (above) does not match the rest of the commit message. > Call close_commit_graph() when about to start a rev-list walk that > includes shallow commits. This is necessary in code paths that "fake" > shallow commits for the sake of fetch. Specifically, test 351 in > t5500-fetch-pack.sh runs > > git fetch --shallow-exclude one origin > > with a file-based transfer. When the "remote" has a commit-graph, we do > not prevent the commit-graph from being loaded, but then the commits are > intended to be dynamically transferred into shallow commits during > get_shallow_commits_by_rev_list(). By closing the commit-graph before > this call, we prevent this interaction. > > Signed-off-by: Derrick Stolee <dstolee@xxxxxxxxxxxxx> > --- > commit-graph.c | 8 ++++---- > commit-graph.h | 1 + > upload-pack.c | 2 ++ > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/commit-graph.c b/commit-graph.c > index 233958e10..237d4e7d1 100644 > --- a/commit-graph.c > +++ b/commit-graph.c > @@ -256,10 +256,10 @@ static int prepare_commit_graph(struct repository *r) > return !!r->objects->commit_graph; > } > > -static void close_commit_graph(void) > +void close_commit_graph(struct repository *r) > { > - free_commit_graph(the_repository->objects->commit_graph); > - the_repository->objects->commit_graph = NULL; > + free_commit_graph(r->objects->commit_graph); > + r->objects->commit_graph = NULL; > } > > static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos) > @@ -871,7 +871,7 @@ void write_commit_graph(const char *obj_dir, > write_graph_chunk_data(f, GRAPH_OID_LEN, commits.list, commits.nr); > write_graph_chunk_large_edges(f, commits.list, commits.nr); > > - close_commit_graph(); > + close_commit_graph(the_repository); > finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_FSYNC); > commit_lock_file(&lk); > > diff --git a/commit-graph.h b/commit-graph.h > index 76e098934..13d736cdd 100644 > --- a/commit-graph.h > +++ b/commit-graph.h > @@ -59,6 +59,7 @@ void write_commit_graph(const char *obj_dir, > > int verify_commit_graph(struct repository *r, struct commit_graph *g); > > +void close_commit_graph(struct repository *); > void free_commit_graph(struct commit_graph *); > > #endif > diff --git a/upload-pack.c b/upload-pack.c > index 4ca052d0b..52ad6c8e5 100644 > --- a/upload-pack.c > +++ b/upload-pack.c > @@ -24,6 +24,7 @@ > #include "quote.h" > #include "upload-pack.h" > #include "serve.h" > +#include "commit-graph.h" > > /* Remember to update object flag allocation in object.h */ > #define THEY_HAVE (1u << 11) > @@ -739,6 +740,7 @@ static void deepen_by_rev_list(int ac, const char **av, > { > struct commit_list *result; > > + close_commit_graph(the_repository); > result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW); > send_shallow(result); > free_commit_list(result);