diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java index 773ce44fd..cad3aaeec 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java @@ -83,6 +83,9 @@ public class ObjectToPack extends PackedObjectInfo { */ private int flags; + /** Hash of the object's tree path. */ + private int pathHash; + /** * Construct for the specified object id. * @@ -222,6 +225,14 @@ public class ObjectToPack extends PackedObjectInfo { setCRC(weight); } + int getPathHash() { + return pathHash; + } + + void setPathHash(int hc) { + pathHash = hc; + } + /** * Remember a specific representation for reuse at a later time. *

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java index 2fecc6875..5ecef832a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java @@ -181,7 +181,7 @@ public class PackWriter { private final ObjectIdSubclassMap objectsMap = new ObjectIdSubclassMap(); // edge objects for thin packs - private final ObjectIdSubclassMap edgeObjects = new ObjectIdSubclassMap(); + private final ObjectIdSubclassMap edgeObjects = new ObjectIdSubclassMap(); private int compressionLevel; @@ -813,11 +813,11 @@ public class PackWriter { RevObject o; while ((o = walker.next()) != null) { - addObject(o); + addObject(o, 0); countingMonitor.update(1); } while ((o = walker.nextObject()) != null) { - addObject(o); + addObject(o, walker.getPathHashCode()); countingMonitor.update(1); } countingMonitor.endTask(); @@ -837,9 +837,21 @@ public class PackWriter { */ public void addObject(final RevObject object) throws IncorrectObjectTypeException { + addObject(object, 0); + } + + private void addObject(final RevObject object, final int pathHashCode) + throws IncorrectObjectTypeException { if (object.has(RevFlag.UNINTERESTING)) { - edgeObjects.add(object); - thin = true; + switch (object.getType()) { + case Constants.OBJ_TREE: + case Constants.OBJ_BLOB: + ObjectToPack otp = new ObjectToPack(object); + otp.setPathHash(pathHashCode); + edgeObjects.add(otp); + thin = true; + break; + } return; } @@ -848,6 +860,8 @@ public class PackWriter { otp = reuseSupport.newObjectToPack(object); else otp = new ObjectToPack(object); + otp.setPathHash(pathHashCode); + try { objectsLists[object.getType()].add(otp); } catch (ArrayIndexOutOfBoundsException x) {