Skip to content

Commit 7d38849

Browse files
newrengitster
authored andcommitted
merge-recursive: when comparing files, don't include trees
get_renames() would look up stage data that already existed (populated in get_unmerged(), taken from whatever unpack_trees() created), and if it didn't exist, would call insert_stage_data() to create the necessary entry for the given file. The insert_stage_data() fallback becomes much more important for directory rename detection, because that creates a mechanism to have a file in the resulting merge that didn't exist on either side of history. However, insert_stage_data(), due to calling get_tree_entry() loaded up trees as readily as files. We aren't interested in comparing trees to files; the D/F conflict handling is done elsewhere. This code is just concerned with what entries existed for a given path on the different sides of the merge, so create a get_tree_entry_if_blob() helper function and use it. Reviewed-by: Stefan Beller <[email protected]> Signed-off-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 79d49b7 commit 7d38849

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

merge-recursive.c

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,21 @@ static void get_files_dirs(struct merge_options *o, struct tree *tree)
421421
read_tree_recursive(tree, "", 0, 0, &match_all, save_files_dirs, o);
422422
}
423423

424+
static int get_tree_entry_if_blob(const unsigned char *tree,
425+
const char *path,
426+
unsigned char *hashy,
427+
unsigned int *mode_o)
428+
{
429+
int ret;
430+
431+
ret = get_tree_entry(tree, path, hashy, mode_o);
432+
if (S_ISDIR(*mode_o)) {
433+
hashcpy(hashy, null_sha1);
434+
*mode_o = 0;
435+
}
436+
return ret;
437+
}
438+
424439
/*
425440
* Returns an index_entry instance which doesn't have to correspond to
426441
* a real cache entry in Git's index.
@@ -431,12 +446,12 @@ static struct stage_data *insert_stage_data(const char *path,
431446
{
432447
struct string_list_item *item;
433448
struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
434-
get_tree_entry(o->object.oid.hash, path,
435-
e->stages[1].oid.hash, &e->stages[1].mode);
436-
get_tree_entry(a->object.oid.hash, path,
437-
e->stages[2].oid.hash, &e->stages[2].mode);
438-
get_tree_entry(b->object.oid.hash, path,
439-
e->stages[3].oid.hash, &e->stages[3].mode);
449+
get_tree_entry_if_blob(o->object.oid.hash, path,
450+
e->stages[1].oid.hash, &e->stages[1].mode);
451+
get_tree_entry_if_blob(a->object.oid.hash, path,
452+
e->stages[2].oid.hash, &e->stages[2].mode);
453+
get_tree_entry_if_blob(b->object.oid.hash, path,
454+
e->stages[3].oid.hash, &e->stages[3].mode);
440455
item = string_list_insert(entries, path);
441456
item->util = e;
442457
return e;

0 commit comments

Comments
 (0)