]> source.dussan.org Git - jgit.git/commitdiff
Save object path hash codes during packing 03/1103/1
authorShawn O. Pearce <spearce@spearce.org>
Fri, 9 Jul 2010 00:14:45 +0000 (17:14 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 9 Jul 2010 22:17:26 +0000 (15:17 -0700)
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 <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/ObjectToPack.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackWriter.java

index 773ce44fd5abde38155051a57b3c49de02af94c6..cad3aaeec7129cf2a0c0b8abd3fe0e98aab593d4 100644 (file)
@@ -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.
         * <p>
index 2fecc6875832ab895fcb0e7c9b3f9c7d10dd2b94..5ecef832a97a046ca651498380b3b4f38359f849 100644 (file)
@@ -181,7 +181,7 @@ public class PackWriter {
        private final ObjectIdSubclassMap<ObjectToPack> objectsMap = new ObjectIdSubclassMap<ObjectToPack>();
 
        // edge objects for thin packs
-       private final ObjectIdSubclassMap<ObjectId> edgeObjects = new ObjectIdSubclassMap<ObjectId>();
+       private final ObjectIdSubclassMap<ObjectToPack> edgeObjects = new ObjectIdSubclassMap<ObjectToPack>();
 
        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) {