Show 79 quoted lines
> 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@microsoft.com>
> ---
> 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);