From: "Shawn O. Pearce" <spearce@spearce.org>
To: tomi.pakarinen@iki.fi
Cc: Robin Rosenberg <robin.rosenberg@dewire.com>, git@vger.kernel.org
Subject: Re: [JGIT PATCH 8/8] Define a basic merge API, and a two-way tree merge strategy
Date: Mon, 19 Jan 2009 09:42:54 -0800 [thread overview]
Message-ID: <20090119174254.GC14053@spearce.org> (raw)
In-Reply-To: <f299b4f30901171116y216835c9jc11df2d424ee0377@mail.gmail.com>
Tomi Pakarinen <tomi.pakarinen@gmail.com> wrote:
> testTrivialTwoWay_disjointhistories() failed because merge strategy
> didn't handle missing base
> version. Am'i right?
I don't think so.
> @@ -119,13 +120,26 @@ protected boolean mergeImpl() throws IOException {
> }
>
> final int modeB = tw.getRawMode(T_BASE);
Under a missing base condition modeB == 0. So,
> - if (modeB == modeO && tw.idEqual(T_BASE, T_OURS))
> - add(T_THEIRS, DirCacheEntry.STAGE_0);
If modeB == 0 and modeO == 0 its not in the base and its not in ours.
Both SHA-1s will be 0{40} and are thus idEqual, so we should enter
this add(T_THEIRS) block. Which is what you tried to write below in
your else block, isn't it?.
> - else if (modeB == modeT && tw.idEqual(T_BASE, T_THEIRS))
> - add(T_OURS, DirCacheEntry.STAGE_0);
Again, if modeB == 0 and modeT == 0 both SHA-1s will be 0{40} and
are idEqual, so we should enter this add(T_OURS) block if both base
and theirs are missing. Which again is what you tried to write in
your else block.
If that isn't coming out right then perhaps tw.idEqual() is busted
for when FileMode is FileMode.MISSING (aka 0). Granted, doing
idEqual on FileMode.MISSING is pointless and just wastes clock
cycles, but it shouldn't harm the algorithm's correctness.
> - else {
> - conflict();
> - hasConflict = true;
> + if (!FileMode.MISSING.equals(modeB)) {
> + if (modeB == modeO && tw.idEqual(T_BASE, T_OURS))
> + add(T_THEIRS, DirCacheEntry.STAGE_0);
> + else if (modeB == modeT && tw.idEqual(T_BASE, T_THEIRS))
> + add(T_OURS, DirCacheEntry.STAGE_0);
> + else {
> + conflict();
> + hasConflict = true;
> + }
> + } else {
> + if (!FileMode.MISSING.equals(modeO)
> + && FileMode.MISSING.equals(modeT))
> + add(T_OURS, DirCacheEntry.STAGE_0);
> + else if (FileMode.MISSING.equals(modeO)
> + && !FileMode.MISSING.equals(modeT))
> + add(T_THEIRS, DirCacheEntry.STAGE_0);
> + else {
> + conflict();
> + hasConflict = true;
> + }
> }
> }
> builder.finish();
> --
> 1.6.0.4
--
Shawn.
next prev parent reply other threads:[~2009-01-19 17:44 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-13 21:10 [JGIT PATCH 0/8] Crude merge support Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 1/8] Expose the raw path for the current entry of a TreeWalk Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 2/8] Expose DirCacheEntry.getFileMode as a utility function Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 3/8] Add writeTree support to DirCache Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 4/8] Allow a DirCache to be created with no backing store file Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 5/8] Allow CanonicalTreeParsers to be created with a UTF-8 path prefix Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 6/8] Recursively load an entire tree into a DirCacheBuilder Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 7/8] Allow DirCacheEntry instances to be created with stage > 0 Shawn O. Pearce
2008-10-13 21:10 ` [JGIT PATCH 8/8] Define a basic merge API, and a two-way tree merge strategy Shawn O. Pearce
2008-10-23 21:14 ` Robin Rosenberg
2009-01-15 21:05 ` Robin Rosenberg
2009-01-15 21:09 ` Shawn O. Pearce
2009-01-17 19:16 ` Tomi Pakarinen
2009-01-18 20:21 ` Robin Rosenberg
2009-01-19 17:42 ` Shawn O. Pearce [this message]
2009-01-19 17:51 ` Shawn O. Pearce
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=20090119174254.GC14053@spearce.org \
--to=spearce@spearce.org \
--cc=git@vger.kernel.org \
--cc=robin.rosenberg@dewire.com \
--cc=tomi.pakarinen@iki.fi \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).