diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDirectory.java index a8d6dda06..8f96ef5f0 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectDirectory.java @@ -416,10 +416,11 @@ public class ObjectDirectory extends ObjectDatabase { // This should never occur. It should be impossible for us // to have two pack files with the same name, as all of them // came out of the same directory. If it does, we promised to - // close any PackFiles we did not reuse, so close the one we - // just evicted out of the reuse map. + // close any PackFiles we did not reuse, so close the second, + // readers are likely to be actively using the first. // - prior.close(); + forReuse.put(prior.getPackFile().getName(), prior); + p.close(); } } return forReuse; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackWriter.java index b30e5f7c2..0c8210f64 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/PackWriter.java @@ -718,12 +718,11 @@ public class PackWriter { final PackedObjectLoader reuse = open(otp); if (reuse != null) { try { - if (otp.isDeltaRepresentation()) { - writeDeltaObjectReuse(otp, reuse); - } else { + if (otp.isDeltaRepresentation()) + writeDeltaObjectHeader(otp, reuse); + else writeObjectHeader(otp.getType(), reuse.getSize()); - reuse.copyRawData(out, buf, windowCursor); - } + reuse.copyRawData(out, buf, windowCursor); } finally { reuse.endCopyRawData(); } @@ -773,7 +772,7 @@ public class PackWriter { } while (!deflater.finished()); } - private void writeDeltaObjectReuse(final ObjectToPack otp, + private void writeDeltaObjectHeader(final ObjectToPack otp, final PackedObjectLoader reuse) throws IOException { if (deltaBaseAsOffset && otp.getDeltaBase() != null) { writeObjectHeader(Constants.OBJ_OFS_DELTA, reuse.getRawSize()); @@ -792,7 +791,6 @@ public class PackWriter { otp.getDeltaBaseId().copyRawTo(buf, 0); out.write(buf, 0, Constants.OBJECT_ID_LENGTH); } - reuse.copyRawData(out, buf, windowCursor); } private void writeObjectHeader(final int objectType, long dataLength)