[JGIT PATCH 15/23] Don't unpack delta chains while converting delta to whole object

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If an object is currently a delta but we need to convert it into
a whole object we shouldn't be chasing the delta chain to get its
real type code.  We had the type code at the time we made the list
of objects to pack; so we save it in the ObjectToPack structure.

Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
---
 .../src/org/spearce/jgit/lib/PackWriter.java       |   28 ++++++++++++++-----
 1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java
index 88b2b1f..a0823c7 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java
@@ -705,14 +705,14 @@ private void writeObject(final ObjectToPack otp) throws IOException {
 	private void writeWholeObject(final ObjectToPack otp) throws IOException {
 		if (otp.hasReuseLoader()) {
 			final PackedObjectLoader loader = otp.getReuseLoader();
-			writeObjectHeader(loader.getType(), loader.getSize());
+			writeObjectHeader(otp.getType(), loader.getSize());
 			loader.copyRawData(out, buf);
 			otp.disposeLoader();
 		} else {
 			final ObjectLoader loader = db.openObject(windowCursor, otp);
 			final DeflaterOutputStream deflaterOut = new DeflaterOutputStream(
 					out, deflater);
-			writeObjectHeader(loader.getType(), loader.getSize());
+			writeObjectHeader(otp.getType(), loader.getSize());
 			deflaterOut.write(loader.getCachedBytes());
 			deflaterOut.finish();
 			deflater.reset();
@@ -833,7 +833,7 @@ public void addObject(final RevObject object)
 			return;
 		}
 
-		final ObjectToPack otp = new ObjectToPack(object);
+		final ObjectToPack otp = new ObjectToPack(object, object.getType());
 		try {
 			objectsLists[object.getType()].add(otp);
 		} catch (ArrayIndexOutOfBoundsException x) {
@@ -858,7 +858,8 @@ public void addObject(final RevObject object)
 
 		private PackedObjectLoader reuseLoader;
 
-		private int deltaDepth;
+		/** Low bits contain the objectType; higher bits the deltaDepth */
+		private int flags;
 
 		private boolean wantWrite;
 
@@ -868,9 +869,12 @@ public void addObject(final RevObject object)
 		 *
 		 * @param src
 		 *            object id of object for packing
+		 * @param type
+		 *            real type code of the object, not its in-pack type.
 		 */
-		ObjectToPack(AnyObjectId src) {
+		ObjectToPack(AnyObjectId src, final int type) {
 			super(src);
+			flags |= type;
 		}
 
 		/**
@@ -946,15 +950,23 @@ void disposeLoader() {
 			this.reuseLoader = null;
 		}
 
+		int getType() {
+			return flags & 0x7;
+		}
+
 		int getDeltaDepth() {
-			return deltaDepth;
+			return flags >>> 3;
 		}
 
 		void updateDeltaDepth() {
+			final int d;
 			if (deltaBase instanceof ObjectToPack)
-				deltaDepth = ((ObjectToPack) deltaBase).deltaDepth + 1;
+				d = ((ObjectToPack) deltaBase).getDeltaDepth() + 1;
 			else if (deltaBase != null)
-				deltaDepth = 1;
+				d = 1;
+			else
+				d = 0;
+			flags = (d << 3) | getType();
 		}
 
 		boolean wantWrite() {
-- 
1.6.1.rc4.301.g5497a

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux