]> source.dussan.org Git - jgit.git/commitdiff
Skip pack header bytes in DfsPackFile 92/88692/1
authorZhen Chen <czhen@google.com>
Sat, 14 Jan 2017 06:02:37 +0000 (22:02 -0800)
committerZhen Chen <czhen@google.com>
Sat, 14 Jan 2017 06:10:42 +0000 (22:10 -0800)
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 <czhen@google.com>
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java

index 4eabb031637d54b8808e9e45dd516f4ab4c84b64..a3d79ecb63ce742578b6c49205a7d9d44d036c08 100644 (file)
@@ -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;
                        }