]> source.dussan.org Git - jgit.git/commitdiff
ObjectWalk: Fix reset for non-commit objects 81/2381/1
authorShawn O. Pearce <spearce@spearce.org>
Sun, 30 Jan 2011 22:43:49 +0000 (14:43 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Mon, 31 Jan 2011 20:31:52 +0000 (12:31 -0800)
Non-commits are added to a pending queue, but duplicates are
removed by checking a flag.  During a reset that flag must be
stripped off the old roots, otherwise the caller cannot reuse
the old roots after the reset.

RevWalk already does this correctly for commits, but ObjectWalk
failed to handle the non-commit case itself.

Change-Id: I99e1832bf204eac5a424fdb04f327792e8cded4a
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java

index 3df5a468f6bd7cc9ddde83da0e1209ecaa22595c..aeba3160dc1d1b98d34fa830c438433fd84bba4e 100644 (file)
@@ -45,6 +45,8 @@ package org.eclipse.jgit.revwalk;
 
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.jgit.JGitText;
 import org.eclipse.jgit.errors.CorruptObjectException;
@@ -85,6 +87,8 @@ public class ObjectWalk extends RevWalk {
 
        private CanonicalTreeParser treeWalk;
 
+       private List<RevObject> rootObjects;
+
        private BlockObjQueue pendingObjects;
 
        private RevTree currentTree;
@@ -115,6 +119,7 @@ public class ObjectWalk extends RevWalk {
         */
        public ObjectWalk(ObjectReader or) {
                super(or);
+               rootObjects = new ArrayList<RevObject>();
                pendingObjects = new BlockObjQueue();
                treeWalk = new CanonicalTreeParser();
        }
@@ -425,6 +430,11 @@ public class ObjectWalk extends RevWalk {
        @Override
        protected void reset(final int retainFlags) {
                super.reset(retainFlags);
+
+               for (RevObject obj : rootObjects)
+                       obj.flags &= ~IN_PENDING;
+
+               rootObjects = new ArrayList<RevObject>();
                pendingObjects = new BlockObjQueue();
                treeWalk = new CanonicalTreeParser();
                currentTree = null;
@@ -436,6 +446,7 @@ public class ObjectWalk extends RevWalk {
        private void addObject(final RevObject o) {
                if ((o.flags & IN_PENDING) == 0) {
                        o.flags |= IN_PENDING;
+                       rootObjects.add(o);
                        pendingObjects.add(o);
                }
        }