commit-graph: close_commit_graph before shallow walk

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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2018-08-20 18:24:34 +00:00 committed by Junio C Hamano
parent 5cef295f28
commit 829a321569
3 changed files with 7 additions and 4 deletions

View File

@ -260,10 +260,10 @@ static int prepare_commit_graph(struct repository *r)
return !!r->objects->commit_graph; 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); free_commit_graph(r->objects->commit_graph);
the_repository->objects->commit_graph = NULL; r->objects->commit_graph = NULL;
} }
static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos) static int bsearch_graph(struct commit_graph *g, struct object_id *oid, uint32_t *pos)
@ -875,7 +875,7 @@ void write_commit_graph(const char *obj_dir,
write_graph_chunk_data(f, GRAPH_OID_LEN, commits.list, commits.nr); write_graph_chunk_data(f, GRAPH_OID_LEN, commits.list, commits.nr);
write_graph_chunk_large_edges(f, 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); finalize_hashfile(f, NULL, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
commit_lock_file(&lk); commit_lock_file(&lk);

View File

@ -59,6 +59,7 @@ void write_commit_graph(const char *obj_dir,
int verify_commit_graph(struct repository *r, struct commit_graph *g); int verify_commit_graph(struct repository *r, struct commit_graph *g);
void close_commit_graph(struct repository *);
void free_commit_graph(struct commit_graph *); void free_commit_graph(struct commit_graph *);
#endif #endif

View File

@ -24,6 +24,7 @@
#include "quote.h" #include "quote.h"
#include "upload-pack.h" #include "upload-pack.h"
#include "serve.h" #include "serve.h"
#include "commit-graph.h"
/* Remember to update object flag allocation in object.h */ /* Remember to update object flag allocation in object.h */
#define THEY_HAVE (1u << 11) #define THEY_HAVE (1u << 11)
@ -740,6 +741,7 @@ static void deepen_by_rev_list(int ac, const char **av,
{ {
struct commit_list *result; struct commit_list *result;
close_commit_graph(the_repository);
result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW); result = get_shallow_commits_by_rev_list(ac, av, SHALLOW, NOT_SHALLOW);
send_shallow(result); send_shallow(result);
free_commit_list(result); free_commit_list(result);