commit-graph: not compatible with replace objects
Create new method commit_graph_compatible(r) to check if a given repository r is compatible with the commit-graph feature. Fill the method with a check to see if replace-objects exist. Test this interaction succeeds, including ignoring an existing commit-graph and failing to write a new commit-graph. However, we do ensure that we write a new commit-graph by setting read_replace_refs to 0, thereby ignoring the replace refs. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
b775896342
commit
d6538246d3
@ -120,6 +120,8 @@ static int graph_read(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern int read_replace_refs;
|
||||
|
||||
static int graph_write(int argc, const char **argv)
|
||||
{
|
||||
struct string_list *pack_indexes = NULL;
|
||||
@ -150,6 +152,8 @@ static int graph_write(int argc, const char **argv)
|
||||
if (!opts.obj_dir)
|
||||
opts.obj_dir = get_object_directory();
|
||||
|
||||
read_replace_refs = 0;
|
||||
|
||||
if (opts.reachable) {
|
||||
write_commit_graph_reachable(opts.obj_dir, opts.append);
|
||||
return 0;
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include "commit-graph.h"
|
||||
#include "object-store.h"
|
||||
#include "alloc.h"
|
||||
#include "hashmap.h"
|
||||
#include "replace-object.h"
|
||||
|
||||
#define GRAPH_SIGNATURE 0x43475048 /* "CGPH" */
|
||||
#define GRAPH_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
|
||||
@ -56,6 +58,19 @@ static struct commit_graph *alloc_commit_graph(void)
|
||||
return g;
|
||||
}
|
||||
|
||||
extern int read_replace_refs;
|
||||
|
||||
static int commit_graph_compatible(struct repository *r)
|
||||
{
|
||||
if (read_replace_refs) {
|
||||
prepare_replace_object(r);
|
||||
if (hashmap_get_size(&r->objects->replace_map->map))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct commit_graph *load_commit_graph_one(const char *graph_file)
|
||||
{
|
||||
void *graph_map;
|
||||
@ -223,6 +238,9 @@ static int prepare_commit_graph(struct repository *r)
|
||||
*/
|
||||
return 0;
|
||||
|
||||
if (!commit_graph_compatible(r))
|
||||
return 0;
|
||||
|
||||
obj_dir = r->objects->objectdir;
|
||||
prepare_commit_graph_one(r, obj_dir);
|
||||
prepare_alt_odb(r);
|
||||
@ -693,6 +711,9 @@ void write_commit_graph(const char *obj_dir,
|
||||
int num_extra_edges;
|
||||
struct commit_list *parent;
|
||||
|
||||
if (!commit_graph_compatible(the_repository))
|
||||
return;
|
||||
|
||||
oids.nr = 0;
|
||||
oids.alloc = approximate_object_count() / 4;
|
||||
|
||||
|
@ -32,7 +32,7 @@ static int register_replace_ref(struct repository *r,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void prepare_replace_object(struct repository *r)
|
||||
void prepare_replace_object(struct repository *r)
|
||||
{
|
||||
if (r->objects->replace_map)
|
||||
return;
|
||||
|
@ -10,6 +10,8 @@ struct replace_object {
|
||||
struct object_id replacement;
|
||||
};
|
||||
|
||||
void prepare_replace_object(struct repository *r);
|
||||
|
||||
/*
|
||||
* This internal function is only declared here for the benefit of
|
||||
* lookup_replace_object(). Please do not call it directly.
|
||||
|
@ -259,6 +259,28 @@ test_expect_success 'check that gc computes commit-graph' '
|
||||
test_cmp commit-graph-after-gc $objdir/info/commit-graph
|
||||
'
|
||||
|
||||
test_expect_success 'replace-objects invalidates commit-graph' '
|
||||
cd "$TRASH_DIRECTORY" &&
|
||||
test_when_finished rm -rf replace &&
|
||||
git clone full replace &&
|
||||
(
|
||||
cd replace &&
|
||||
git commit-graph write --reachable &&
|
||||
test_path_is_file .git/objects/info/commit-graph &&
|
||||
git replace HEAD~1 HEAD~2 &&
|
||||
git -c core.commitGraph=false log >expect &&
|
||||
git -c core.commitGraph=true log >actual &&
|
||||
test_cmp expect actual &&
|
||||
git commit-graph write --reachable &&
|
||||
git -c core.commitGraph=false --no-replace-objects log >expect &&
|
||||
git -c core.commitGraph=true --no-replace-objects log >actual &&
|
||||
test_cmp expect actual &&
|
||||
rm -rf .git/objects/info/commit-graph &&
|
||||
git commit-graph write --reachable &&
|
||||
test_path_is_file .git/objects/info/commit-graph
|
||||
)
|
||||
'
|
||||
|
||||
# the verify tests below expect the commit-graph to contain
|
||||
# exactly the commits reachable from the commits/8 branch.
|
||||
# If the file changes the set of commits in the list, then the
|
||||
|
Loading…
Reference in New Issue
Block a user