Fix RevWalk with Linus Torvald's occasional bad commit date hack
commitce820cc79f656c4d3da16955683836e5faec3ebd
authorShawn O. Pearce <spearce@spearce.org>
Sat, 14 Mar 2009 00:54:42 +0000 (13 17:54 -0700)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Sun, 15 Mar 2009 11:48:39 +0000 (15 12:48 +0100)
tree51ae57fb8ccc0027ac09e08f1ff2f9f54f0a8254
parent4cbdf0f79c2e90027e3bff02974b278e5cf452c1
Fix RevWalk with Linus Torvald's occasional bad commit date hack

In git-core commit 7d004199d134c9d465e013064f72dbc04507f6c0 Linus
describes a hack he created to improve the handling of cases where
commit dates are out of order, such as a child commit having a date
older than its parent.  These cases can show up when there is bad
imported data, or significant clock skew between distributed peers.

The original git-core bug report identified a failure in:

  git rev-list A..B C

where commits contained in both A and B were reported, due to out
of order commit dates.

We keep running until the most recent commit in the pending queue
is more recent than the last commit sent to the caller.  If the
pending queue suddenly goes "backwards" due to one of our parent's
having a more recent commit date, this new check ensures we will
keep processing the graph until we see a more consistent cut.

We process an extra OVER_SCAN commits after we decide that all
remaining commits are UNINTERESTING.  Processing these extra
commits ensures flags are carried back further in the graph,
increasing the chances that we correctly mark relevant nodes.

As a result of this hack, we may produce a commit to our caller,
but then later mark it UNINTERESTING if we discover date skew.
To handle such cases, callers could buffer produced commits and
filter out those that are UNINTERESTING, but this somewhat costly
and may not always be necessary.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
org.spearce.jgit/src/org/spearce/jgit/revwalk/PendingGenerator.java