diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/T0004_PackReader.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/T0004_PackReader.java
index f6fff52..6ffb904 100644
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/T0004_PackReader.java
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/T0004_PackReader.java
@@ -57,7 +57,6 @@ public void test003_lookupCompressedObject() throws IOException {
pr = new PackFile(db, TEST_IDX, TEST_PACK);
or = pr.get(new WindowCursor(), id);
assertNotNull(or);
- assertEquals(id, or.getId());
assertEquals(Constants.OBJ_TREE, or.getType());
assertEquals(35, or.getSize());
assertEquals(7738, or.getDataOffset());@@ -72,7 +71,6 @@ public void test004_lookupDeltifiedObject() throws IOException {
or = db.openObject(id);
assertNotNull(or);
assertTrue(or instanceof PackedObjectLoader);
- assertEquals(id, or.getId());
assertEquals(Constants.OBJ_BLOB, or.getType());
assertEquals(18009, or.getSize());
assertEquals(537, ((PackedObjectLoader) or).getDataOffset());diff --git a/org.spearce.jgit/src/org/spearce/jgit/errors/CorruptObjectException.java b/org.spearce.jgit/src/org/spearce/jgit/errors/CorruptObjectException.java
index 4eb7aa6..2b0e287 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/errors/CorruptObjectException.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/errors/CorruptObjectException.java
@@ -40,6 +40,7 @@
import java.io.IOException;
+import org.spearce.jgit.lib.AnyObjectId;
import org.spearce.jgit.lib.ObjectId;
/**
@@ -55,6 +56,17 @@
* @param id
* @param why
*/
+ public CorruptObjectException(final AnyObjectId id, final String why) {
+ this(id.toObjectId(), why);
+ }
+
+ /**
+ * Construct a CorruptObjectException for reporting a problem specified
+ * object id
+ *
+ * @param id
+ * @param why
+ */
public CorruptObjectException(final ObjectId id, final String why) {
super("Object " + id.name() + " is corrupt: " + why);
}diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Constants.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Constants.java
index 9613d07..8f093d6 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/Constants.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Constants.java
@@ -311,7 +311,7 @@ public static String typeString(final int typeCode) {
* @throws CorruptObjectException
* there is no valid type identified by <code>typeString</code>.
*/
- public static int decodeTypeString(final ObjectId id,
+ public static int decodeTypeString(final AnyObjectId id,
final byte[] typeString, final byte endMark,
final MutableInteger offset) throws CorruptObjectException {
try {diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/DeltaPackedObjectLoader.java b/org.spearce.jgit/src/org/spearce/jgit/lib/DeltaPackedObjectLoader.java
index e73f8e5..85f2bda 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/DeltaPackedObjectLoader.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/DeltaPackedObjectLoader.java
@@ -92,7 +92,8 @@ public long getSize() throws IOException {
return data;
} catch (DataFormatException dfe) {
final CorruptObjectException coe;
- coe = new CorruptObjectException(getId(), "bad stream");
+ coe = new CorruptObjectException("Object at " + dataOffset + " in "
+ + pack.getPackFile() + " has bad zlib stream");
coe.initCause(dfe);
throw coe;
}diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectLoader.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectLoader.java
index 8d745dd..5485d8d 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectLoader.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectLoader.java
@@ -39,50 +39,12 @@
package org.spearce.jgit.lib;
import java.io.IOException;
-import java.security.MessageDigest;
/**
* Base class for a set of loaders for different representations of Git objects.
* New loaders are constructed for every object.
*/
public abstract class ObjectLoader {
- private ObjectId objectId;
-
- /**
- * @return the id of this object, possibly computed on demand
- * @throws IOException
- */
- public ObjectId getId() throws IOException {
- if (objectId == null) {
- final MessageDigest md = Constants.newMessageDigest();
- md.update(Constants.encodedTypeString(getType()));
- md.update((byte) ' ');
- md.update(Constants.encodeASCII(getSize()));
- md.update((byte) 0);
- md.update(getCachedBytes());
- objectId = ObjectId.fromRaw(md.digest());
- }
- return objectId;
- }
-
- /**
- * @return true if id of loaded object is already known, false otherwise.
- */
- protected boolean hasComputedId() {
- return objectId != null;
- }
-
- /**
- * Set the SHA-1 id of the object handled by this loader
- *
- * @param id
- */
- protected void setId(final ObjectId id) {
- if (objectId != null)
- throw new IllegalStateException("Id already set.");
- objectId = id;
- }
-
/**
* @return Git in pack object type, see {@link Constants}.
* @throws IOExceptiondiff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
index cd17bd4..3cdca8f 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackFile.java
@@ -129,11 +129,7 @@ public boolean hasObject(final AnyObjectId id) {
public PackedObjectLoader get(final WindowCursor curs, final AnyObjectId id)
throws IOException {
final long offset = idx.findOffset(id);
- if (offset == -1)
- return null;
- final PackedObjectLoader objReader = reader(curs, offset);
- objReader.setId(id.toObjectId());
- return objReader;
+ return 0 < offset ? reader(curs, offset) : null;
}
/**@@ -219,11 +215,7 @@ final void copyRawData(final PackedObjectLoader loader,
pack.copyToStream(dataOffset, buf, cnt, crcOut, curs);
final long computed = crc.getValue();
- ObjectId id;
- if (loader.hasComputedId())
- id = loader.getId();
- else
- id = findObjectForOffset(objectOffset);
+ final ObjectId id = findObjectForOffset(objectOffset);
final long expected = idx.findCRC32(id);
if (computed != expected)
throw new CorruptObjectException(id,
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
index 8f6e96e..02f8103 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
@@ -317,7 +317,7 @@ public ObjectLoader openObject(final WindowCursor curs, final AnyObjectId id)
} while (k > 0);
}
try {
- return new UnpackedObjectLoader(this, id.toObjectId());
+ return new UnpackedObjectLoader(this, id);
} catch (FileNotFoundException fnfe) {
return null;
}diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/UnpackedObjectLoader.java b/org.spearce.jgit/src/org/spearce/jgit/lib/UnpackedObjectLoader.java
index 3ad273f..0560c3a 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/UnpackedObjectLoader.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/UnpackedObjectLoader.java
@@ -67,13 +67,13 @@
* SHA-1
* @throws IOException
*/
- public UnpackedObjectLoader(final Repository db, final ObjectId id)
+ public UnpackedObjectLoader(final Repository db, final AnyObjectId id)
throws IOException {
this(readCompressed(db, id), id);
}
- private static byte[] readCompressed(final Repository db, final ObjectId id)
- throws FileNotFoundException, IOException {
+ private static byte[] readCompressed(final Repository db,
+ final AnyObjectId id) throws FileNotFoundException, IOException {
final FileInputStream objStream = new FileInputStream(db.toFile(id));
final byte[] compressed;
try {@@ -101,10 +101,8 @@ public UnpackedObjectLoader(final byte[] compressed)
this(compressed, null);
}
- private UnpackedObjectLoader(final byte[] compressed, final ObjectId id)
+ private UnpackedObjectLoader(final byte[] compressed, final AnyObjectId id)
throws CorruptObjectException {
- setId(id);
-
// Try to determine if this is a legacy format loose object or
// a new style loose object. The legacy format was completely
// compressed with zlib so the first byte must be 0x78 (15-bit@@ -177,7 +175,7 @@ private UnpackedObjectLoader(final byte[] compressed, final ObjectId id)
}
}
- private void decompress(final ObjectId id, final Inflater inf, int p)
+ private void decompress(final AnyObjectId id, final Inflater inf, int p)
throws CorruptObjectException {
try {
while (!inf.finished())diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/WholePackedObjectLoader.java b/org.spearce.jgit/src/org/spearce/jgit/lib/WholePackedObjectLoader.java
index 7185df5..3b4f90d 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/WholePackedObjectLoader.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/WholePackedObjectLoader.java
@@ -72,7 +72,8 @@ WholePackedObjectLoader(final WindowCursor curs, final PackFile pr,
return data;
} catch (DataFormatException dfe) {
final CorruptObjectException coe;
- coe = new CorruptObjectException(getId(), "bad stream");
+ coe = new CorruptObjectException("Object at " + dataOffset + " in "
+ + pack.getPackFile() + " has bad zlib stream");
coe.initCause(dfe);
throw coe;
}diff --git a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java
index b1571ab..dfb34d9 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java
@@ -687,23 +687,23 @@ public RevObject parseAny(final AnyObjectId id)
final int type = ldr.getType();
switch (type) {
case Constants.OBJ_COMMIT: {
- final RevCommit c = createCommit(ldr.getId());
+ final RevCommit c = createCommit(id);
c.parseCanonical(this, data);
r = c;
break;
}
case Constants.OBJ_TREE: {
- r = new RevTree(ldr.getId());
+ r = new RevTree(id);
r.flags |= PARSED;
break;
}
case Constants.OBJ_BLOB: {
- r = new RevBlob(ldr.getId());
+ r = new RevBlob(id);
r.flags |= PARSED;
break;
}
case Constants.OBJ_TAG: {
- final RevTag t = new RevTag(ldr.getId());
+ final RevTag t = new RevTag(id);
t.parseCanonical(this, data);
r = t;
break;diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/WalkFetchConnection.java b/org.spearce.jgit/src/org/spearce/jgit/transport/WalkFetchConnection.java
index 5d0c6bc..93b5bd2 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/transport/WalkFetchConnection.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/WalkFetchConnection.java
@@ -42,6 +42,7 @@
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -155,6 +156,8 @@
private final MutableObjectId idBuffer = new MutableObjectId();
+ private final MessageDigest objectDigest = Constants.newMessageDigest();
+
/**
* Errors received while trying to obtain an object.
* <p>
@@ -573,9 +576,17 @@ private void verifyLooseObject(final AnyObjectId id, final byte[] compressed)
throw e;
}
- if (!AnyObjectId.equals(id, uol.getId())) {
+ objectDigest.reset();
+ objectDigest.update(Constants.encodedTypeString(uol.getType()));
+ objectDigest.update((byte) ' ');
+ objectDigest.update(Constants.encodeASCII(uol.getSize()));
+ objectDigest.update((byte) 0);
+ objectDigest.update(uol.getCachedBytes());
+ idBuffer.fromRaw(objectDigest.digest(), 0);
+
+ if (!AnyObjectId.equals(id, idBuffer)) {
throw new TransportException("Incorrect hash for " + id.name()
- + "; computed " + uol.getId().name() + " as a "
+ + "; computed " + idBuffer.name() + " as a "
+ Constants.encodedTypeString(uol.getType()) + " from "
+ compressed.length + " bytes.");
}--
1.6.1.rc4.301.g5497a