Fix ObjectWalk to handle single-entry subtrees correctly
commit11996eeb6a5861f639b6ac71c08f206ba7ac6a11
authorShawn O. Pearce <spearce@spearce.org>
Fri, 13 Mar 2009 18:11:51 +0000 (13 11:11 -0700)
committerRobin Rosenberg <robin.rosenberg@dewire.com>
Sun, 15 Mar 2009 11:48:40 +0000 (15 12:48 +0100)
tree19af79bfe08ca5b0c37296fdbac1ddf388f0c9bf
parent25aa5e7e9f3f9181962e070a0d03b21460f59b85
Fix ObjectWalk to handle single-entry subtrees correctly

"jgit push" has been pushing more objects than necessary
for a while now, due to ObjectWalk failing to mark a subtree
uninteresting if it contains exactly one subtree child, such as
"org.spearce.egit.core/src" which has only one child, "org".

The bug was caused by the child iterator being advanced past the
first item before we even evaluated it, as the for loop always
invoked treeWalk.next() at the end of each iteration.  However,
a new subtree iterator is positioned on the first item and must
not call next() until after we have handled that first entry.

While debugging this I also noticed strange behavior from the
ObjectWalk evaulating a subtree again, after we had exited it.
This was because the parent iterator was never advanced past the
child when we entered into it.  We now advance the parent whenever
we leave the child.

Note that its important we do the parent advance *after* we exit the
child, as they share the same path buffer.  Advancing the parent
before we enter into the child would cause the child to corrupt
the parent's next item path.

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/ObjectWalk.java
org.spearce.jgit/src/org/spearce/jgit/treewalk/CanonicalTreeParser.java