Re: Bug in merge-recursive in virtual commit corner case
From: Junio C Hamano <hidden>
Date: 2016-08-11 20:38:39
Shawn Pearce [off-list ref] writes:
I found the above error message in tree-diff.c's diff_tree_sha1
function. I threw in debugging and found that the new tree was
the root tree of one branch and the base was the root tree of some
other revision.
Apparently the empty tree is being created in merge-recursive.c:
1219 if (merged_common_ancestors == NULL) {
1220 /* if there is no common ancestor, make an empty tree */
1221 struct tree *tree = xcalloc(1, sizeof(struct tree));
1222
1223 tree->object.parsed = 1;
1224 tree->object.type = OBJ_TREE;
1225 hash_sha1_file(NULL, 0, tree_type, tree->object.sha1);
1226 merged_common_ancestors = make_virtual_commit(tree, "ancestor");
1227 }
So basically this code crashes if its ever used in a repository
that hasn't had a need for the empty tree before. :-(I hit the same issue when I integrated Johannes's in-core merge; I originally used hash_sha1_file() but that results in objects that are supposed to be in the virtual parent unreadable when merging the real children. The key is to use write_sha1_file() to actually create the needed objects, and trust later prune to remove them. Replace it with write_sha1_file() and you should be fine, I think.