diff options
5 files changed, 35 insertions, 23 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java index 0b73e6a694..ea6781495d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackOutputStream.java @@ -47,7 +47,6 @@ package org.eclipse.jgit.internal.storage.pack; import java.io.IOException; import java.io.OutputStream; import java.security.MessageDigest; -import java.util.zip.CRC32; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.Constants; @@ -64,8 +63,6 @@ public final class PackOutputStream extends OutputStream { private final PackWriter packWriter; - private final CRC32 crc = new CRC32(); - private final MessageDigest md = Constants.newMessageDigest(); private long count; @@ -102,7 +99,6 @@ public final class PackOutputStream extends OutputStream { public void write(final int b) throws IOException { count++; out.write(b); - crc.update(b); md.update((byte) b); } @@ -122,7 +118,6 @@ public final class PackOutputStream extends OutputStream { } out.write(b, off, n); - crc.update(b, off, n); md.update(b, off, n); off += n; @@ -235,16 +230,6 @@ public final class PackOutputStream extends OutputStream { return count; } - /** @return obtain the current CRC32 register. */ - int getCRC32() { - return (int) crc.getValue(); - } - - /** Reinitialize the CRC32 register for a new region. */ - void resetCRC32() { - crc.reset(); - } - /** @return obtain the current SHA-1 digest. */ byte[] getDigest() { return md.digest(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 6577cec839..2e6812c1c7 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -75,6 +75,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.zip.CRC32; +import java.util.zip.CheckedOutputStream; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; @@ -275,12 +277,16 @@ public class PackWriter { private boolean canBuildBitmaps; + private boolean indexDisabled; + private int depth; private Collection<? extends ObjectId> unshallowObjects; private PackBitmapIndexBuilder writeBitmaps; + private CRC32 crc32; + /** * Create writer for specified repository. * <p> @@ -471,6 +477,19 @@ public class PackWriter { this.useBitmaps = useBitmaps; } + /** @return true if the index file cannot be created by this PackWriter. */ + public boolean isIndexDisabled() { + return indexDisabled || !cachedPacks.isEmpty(); + } + + /** + * @param noIndex + * true to disable creation of the index file. + */ + public void setIndexDisabled(boolean noIndex) { + this.indexDisabled = noIndex; + } + /** * @return true to ignore objects that are uninteresting and also not found * on local disk; false to throw a {@link MissingObjectException} @@ -855,7 +874,7 @@ public class PackWriter { * the index data could not be written to the supplied stream. */ public void writeIndex(final OutputStream indexStream) throws IOException { - if (!cachedPacks.isEmpty()) + if (isIndexDisabled()) throw new IOException(JGitText.get().cachedPacksPreventsIndexCreation); long writeStart = System.currentTimeMillis(); @@ -996,8 +1015,13 @@ public class PackWriter { if (config.isDeltaCompress()) searchForDeltas(compressMonitor); - final PackOutputStream out = new PackOutputStream(writeMonitor, - packStream, this); + crc32 = new CRC32(); + final PackOutputStream out = new PackOutputStream( + writeMonitor, + isIndexDisabled() + ? packStream + : new CheckedOutputStream(packStream, crc32), + this); long objCnt = getObjectCount(); stats.totalObjects = objCnt; @@ -1484,12 +1508,12 @@ public class PackWriter { if (otp.isWritten()) return; // Delta chain cycle caused this to write already. - out.resetCRC32(); + crc32.reset(); otp.setOffset(out.length()); try { reuseSupport.copyObjectAsIs(out, otp, reuseValidate); out.endObject(); - otp.setCRC(out.getCRC32()); + otp.setCRC((int) crc32.getValue()); typeStats.reusedObjects++; if (otp.isDeltaRepresentation()) { typeStats.reusedDeltas++; @@ -1523,7 +1547,7 @@ public class PackWriter { else writeWholeObjectDeflate(out, otp); out.endObject(); - otp.setCRC(out.getCRC32()); + otp.setCRC((int) crc32.getValue()); } private void writeBase(PackOutputStream out, ObjectToPack base) @@ -1537,7 +1561,7 @@ public class PackWriter { final Deflater deflater = deflater(); final ObjectLoader ldr = reader.open(otp, otp.getType()); - out.resetCRC32(); + crc32.reset(); otp.setOffset(out.length()); out.writeHeader(otp, ldr.getSize()); @@ -1551,7 +1575,7 @@ public class PackWriter { final ObjectToPack otp) throws IOException { writeBase(out, otp.getDeltaBase()); - out.resetCRC32(); + crc32.reset(); otp.setOffset(out.length()); DeltaCache.Ref ref = otp.popCachedDelta(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java index 60985e7c28..22b458c92f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BasePackPushConnection.java @@ -291,6 +291,7 @@ public abstract class BasePackPushConnection extends BasePackConnection implemen newObjects.add(r.getNewObjectId()); } + writer.setIndexDisabled(true); writer.setUseCachedPacks(true); writer.setUseBitmaps(true); writer.setThin(thinPack); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java index 54c8bf9045..4f5cda7abd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/BundleWriter.java @@ -200,6 +200,7 @@ public class BundleWriter { inc.addAll(include.values()); for (final RevCommit r : assume) exc.add(r.getId()); + packWriter.setIndexDisabled(true); packWriter.setDeltaBaseAsOffset(true); packWriter.setThin(exc.size() > 0); packWriter.setReuseValidatingObjects(false); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index 1377a37cd8..5347eb713c 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -1116,6 +1116,7 @@ public class UploadPack { cfg = new PackConfig(db); final PackWriter pw = new PackWriter(cfg, walk.getObjectReader()); try { + pw.setIndexDisabled(true); pw.setUseCachedPacks(true); pw.setUseBitmaps(true); pw.setReuseDeltaCommits(true); |