Skip to content

Commit

Permalink
merge-ort: avoid repeating fill_tree_descriptor() on the same tree
Browse files Browse the repository at this point in the history
Three-way merges, by their nature, are going to often have two or more
trees match at a given subdirectory.  We can avoid calling
fill_tree_descriptor() on the same tree by checking when these trees
match.  Noting when various oids match will also be useful in other
calculations and optimizations as well.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
newren authored and gitster committed Dec 13, 2020
1 parent d2bc199 commit 885f006
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions merge-ort.c
Expand Up @@ -223,6 +223,15 @@ static int collect_merge_info_callback(int n,
unsigned mbase_null = !(mask & 1);
unsigned side1_null = !(mask & 2);
unsigned side2_null = !(mask & 4);
unsigned side1_matches_mbase = (!side1_null && !mbase_null &&
names[0].mode == names[1].mode &&
oideq(&names[0].oid, &names[1].oid));
unsigned side2_matches_mbase = (!side2_null && !mbase_null &&
names[0].mode == names[2].mode &&
oideq(&names[0].oid, &names[2].oid));
unsigned sides_match = (!side1_null && !side2_null &&
names[1].mode == names[2].mode &&
oideq(&names[1].oid, &names[2].oid));

/* n = 3 is a fundamental assumption. */
if (n != 3)
Expand Down Expand Up @@ -275,10 +284,19 @@ static int collect_merge_info_callback(int n,
newinfo.pathlen = st_add3(newinfo.pathlen, p->pathlen, 1);

for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
const struct object_id *oid = NULL;
if (dirmask & 1)
oid = &names[i].oid;
buf[i] = fill_tree_descriptor(opt->repo, t + i, oid);
if (i == 1 && side1_matches_mbase)
t[1] = t[0];
else if (i == 2 && side2_matches_mbase)
t[2] = t[0];
else if (i == 2 && sides_match)
t[2] = t[1];
else {
const struct object_id *oid = NULL;
if (dirmask & 1)
oid = &names[i].oid;
buf[i] = fill_tree_descriptor(opt->repo,
t + i, oid);
}
dirmask >>= 1;
}

Expand Down

0 comments on commit 885f006

Please sign in to comment.