All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shawn Pearce <spearce@spearce.org>
To: git@vger.kernel.org
Subject: Bug in merge-recursive in virtual commit corner case
Date: Thu, 7 Dec 2006 03:35:31 -0500	[thread overview]
Message-ID: <20061207083531.GA22701@spearce.org> (raw)

So I managed to create a fairly complex set of branches which are all
merged back against each other at various points in time.  Two of
them have 3 merge bases according to git-merge-base.  Tonight I
tried to merge them together, but received the following wonderful
error from git-merge-recursive:

  fatal: unable to read source tree (4b825dc642cb6eb9a060e54bf8d69288fbee4904)

For those in the know, that's the empty tree.  This particular
repository does not have the empty tree anywhere in it, which is
why we can't read the object: it doesn't exist, and shouldn't exist.

Running `git-mktree </dev/null` to create the empty tree worked;
git-merge-recursive ran through and cleanly merged the two branches.
But the empty tree still shouldn't be in my repository, so a future
git-prune is just going to whack it again.  Yes, I know, I could
anchor it with a ref (.git/refs/empty-tree) but I shouldn't need
to use git-mktree and git-update-ref just to use git-merge-recursive.

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've been unable to create an isolated test case.  I can't publish
the repository that I caused the case in either.

I'm not quite sure what the fix should be here: patch diff_tree_sha1
to know when it gets the empty tree, or create the object in
merge-recursive.c?

-- 

             reply	other threads:[~2006-12-07  8:35 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-07  8:35 Shawn Pearce [this message]
2006-12-07  9:13 ` Bug in merge-recursive in virtual commit corner case Junio C Hamano
2006-12-07 15:38 ` Johannes Schindelin
2006-12-07 19:24   ` Shawn Pearce
2006-12-08  3:03     ` Johannes Schindelin
2006-12-08  6:01     ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061207083531.GA22701@spearce.org \
    --to=spearce@spearce.org \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.