From: Zhen Chen Date: Sat, 14 Jan 2017 06:02:37 +0000 (-0800) Subject: Skip pack header bytes in DfsPackFile X-Git-Tag: v4.7.0.201704051617-r~126 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d6b354f60f1a5fd4719908e2ae820c16022e99ce;p=jgit.git Skip pack header bytes in DfsPackFile The 12 bytes `PACK...` header is written in PackWriter before reading CachedPack files. In DfsPackFile#copyPackBypassCache, the header was not skipped when the first block is not in cache. Change-Id: Ibbe2e564d36b79922a936657f286addb1044d237 Signed-off-by: Zhen Chen --- diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java index 4eabb03163..a3d79ecb63 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java @@ -499,6 +499,7 @@ public final class DfsPackFile { rc.setReadAheadBytes(ctx.getOptions().getStreamPackBufferSize()); long position = 12; long remaining = length - (12 + 20); + boolean packHeadSkipped = false; while (0 < remaining) { DfsBlock b = cache.get(key, alignToBlock(position)); if (b != null) { @@ -508,6 +509,7 @@ public final class DfsPackFile { position += n; remaining -= n; rc.position(position); + packHeadSkipped = true; continue; } @@ -517,7 +519,14 @@ public final class DfsPackFile { throw packfileIsTruncated(); else if (n > remaining) n = (int) remaining; - out.write(buf.array(), 0, n); + + if (!packHeadSkipped) { + // Need skip the 'PACK' header for the first read + out.write(buf.array(), 12, n - 12); + packHeadSkipped = true; + } else { + out.write(buf.array(), 0, n); + } position += n; remaining -= n; }