From 2f93a09dd10696b6388a0fcb4099341ccef05169 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 8 Jul 2010 17:14:45 -0700 Subject: [PATCH] Save object path hash codes during packing We need to remember these so we can later cluster objects that have similar file paths near each other as we search for deltas between them. Change-Id: I52cb1e4ca15c9c267a2dbf51dd0d795f885f4cf8 Signed-off-by: Shawn O. Pearce --- .../jgit/storage/pack/ObjectToPack.java | 11 +++++++++ .../eclipse/jgit/storage/pack/PackWriter.java | 24 +++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) 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) {