<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test-project-packs2.tgz</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,7 @@
 Revision history for Perl module Git::PurePerl:
 
+0.33
+     - add support for version 2 pack index files
+
 0.32 Fri Nov 14 16:47:59 GMT 2008
      - initial release</diff>
      <filename>CHANGES</filename>
    </modified>
    <modified>
      <diff>@@ -12,5 +12,6 @@ README
 t/00_setup.t
 t/simple.t
 test-project-packs.tgz
+test-project-packs2.tgz
 test-project.tgz
 </diff>
      <filename>MANIFEST</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,8 @@ use IO::File;
 has 'filename' =&gt;
     ( is =&gt; 'ro', isa =&gt; 'Path::Class::File', required =&gt; 1, coerce =&gt; 1 );
 
-has 'version' =&gt; ( is =&gt; 'rw', isa =&gt; 'Int', required =&gt; 0 );
+has 'version'       =&gt; ( is =&gt; 'rw', isa =&gt; 'Int', required =&gt; 0 );
+has 'global_offset' =&gt; ( is =&gt; 'rw', isa =&gt; 'Int', required =&gt; 0 );
 
 has 'offsets' =&gt;
     ( is =&gt; 'rw', isa =&gt; 'ArrayRef[Int]', required =&gt; 0, auto_deref =&gt; 1, );
@@ -39,6 +40,7 @@ sub BUILD {
     my $fh   = $self-&gt;open_index;
     $fh-&gt;read( my $signature, 4 );
     $fh-&gt;read( my $version,   4 );
+    $version = unpack( 'N', $version );
 
     if ( $signature eq &quot;\377tOc&quot; ) {
         confess(&quot;Unknown version&quot;) if $version != 2;
@@ -46,20 +48,28 @@ sub BUILD {
         $version = 1;
     }
     $self-&gt;version($version);
+
+    if ( $version == 1 ) {
+        $self-&gt;global_offset(0);
+    } else {
+        $self-&gt;global_offset(8);
+    }
+
     my @offsets = (0);
     foreach my $i ( 0 .. $FanOutCount - 1 ) {
-        $fh-&gt;seek( $i * $IdxOffsetSize, 0 );
+        $fh-&gt;seek( ( $i * $IdxOffsetSize ) + $self-&gt;global_offset, 0 );
         $fh-&gt;read( my $data, $IdxOffsetSize );
         my $offset = unpack( 'N', $data );
         confess(&quot;pack has discontinuous index&quot;) if $offset &lt; $offsets[-1];
         push @offsets, $offset;
     }
+
     $self-&gt;size( $offsets[-1] );
 }
 
 sub open_index {
-    my $self     = shift;
-    my $filename = $self-&gt;filename;
+    my $self           = shift;
+    my $filename       = $self-&gt;filename;
     my $index_filename = $filename;
     $index_filename =~ s/\.pack/.idx/;
     my $fh = IO::File-&gt;new($index_filename) || confess($!);
@@ -75,20 +85,56 @@ sub open_pack {
 
 sub get_object {
     my ( $self, $want_sha1 ) = @_;
-    my $fh  = $self-&gt;open_index;
-    my $pos = $OffsetStart;
-    foreach my $i ( 1 .. $self-&gt;size ) {
-        $fh-&gt;seek( $pos, 0 ) || die $!;
-        $fh-&gt;read( my $data, $OffsetSize ) || die $!;
-        my $offset = unpack( 'N', $data );
-        $fh-&gt;read( $data, $SHA1Size ) || die $!;
-        my $sha1 = unpack( 'H*', $data );
-        if ( $sha1 eq $want_sha1 ) {
-            return $self-&gt;unpack_object($offset);
+
+    if ( $self-&gt;version == 1 ) {
+        my $fh  = $self-&gt;open_index;
+        my $pos = $OffsetStart;
+        foreach my $i ( 1 .. $self-&gt;size ) {
+            $fh-&gt;seek( $pos, 0 ) || die $!;
+            $fh-&gt;read( my $data, $OffsetSize ) || die $!;
+            my $offset = unpack( 'N', $data );
+            $fh-&gt;read( $data, $SHA1Size ) || die $!;
+            my $sha1 = unpack( 'H*', $data );
+            if ( $sha1 eq $want_sha1 ) {
+                return $self-&gt;unpack_object($offset);
+            }
+            $pos += $EntrySize;
         }
-        $pos += $EntrySize;
+        return;
+
+    } else {
+
+        my $fh = $self-&gt;open_index;
+        my @data;
+        my $pos = $OffsetStart;
+        foreach my $i ( 0 .. $self-&gt;size - 1 ) {
+            $fh-&gt;seek( $pos + $self-&gt;global_offset, 0 ) || die $!;
+            $fh-&gt;read( my $sha1, $SHA1Size ) || die $!;
+            $data[$i] = [ unpack( 'H*', $sha1 ), 0, 0 ];
+            $pos += $SHA1Size;
+        }
+        foreach my $i ( 0 .. $self-&gt;size - 1 ) {
+            $fh-&gt;seek( $pos + $self-&gt;global_offset, 0 ) || die $!;
+            $fh-&gt;read( my $crc, $CrcSize ) || die $!;
+            $data[$i]-&gt;[1] = unpack( 'H*', $crc );
+            $pos += $CrcSize;
+        }
+        foreach my $i ( 0 .. $self-&gt;size - 1 ) {
+            $fh-&gt;seek( $pos + $self-&gt;global_offset, 0 ) || die $!;
+            $fh-&gt;read( my $offset, $OffsetSize ) || die $!;
+            $data[$i]-&gt;[2] = unpack( 'N', $offset );
+            $pos += $OffsetSize;
+        }
+
+        foreach my $data (@data) {
+            my ( $sha1, $crc, $offset ) = @$data;
+            if ( $sha1 eq $want_sha1 ) {
+                return $self-&gt;unpack_object($offset);
+            }
+        }
+        return;
+
     }
-    return;
 }
 
 sub unpack_object {</diff>
      <filename>lib/Git/PurePerl/Pack.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ use warnings;
 use Test::More tests =&gt; 1;
 use Archive::Extract;
 
-foreach my $name qw(test-project test-project-packs) {
+foreach my $name qw(test-project test-project-packs test-project-packs2) {
     next if -d $name;
     my $ae = Archive::Extract-&gt;new( archive =&gt; &quot;$name.tgz&quot; );
     $ae-&gt;extract;
@@ -13,7 +13,7 @@ ok(1, 'extracted');
 
 =for shell
 
-How to create test-project and test-project-packs:
+# How to create test-project and test-project-packs:
 
 mkdir test-project
 cd test-project
@@ -37,4 +37,7 @@ mv test-project test-project-packs
 tar fvzc test-project-packs.tgz test-project-packs
 rm -rf test-project-packs
 
+# and likewise but on a recent git for test-project-packs2
+tar fvzc test-project-packs2.tgz test-project-packs2
+
 =cut </diff>
      <filename>t/00_setup.t</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,18 @@
 #!perl
 use strict;
 use warnings;
-use Test::More tests =&gt; 34;
+use Test::More tests =&gt; 51;
 use Git::PurePerl;
 
-foreach my $directory qw(test-project test-project-packs) {
+foreach my $directory qw(test-project test-project-packs test-project-packs2) {
     my $git = Git::PurePerl-&gt;new( directory =&gt; $directory );
     my $master = $git-&gt;master;
-    is( $master-&gt;kind,   'commit' );
-    is( $master-&gt;size,   256 );
-    is( $master-&gt;sha1,   'd60f7006a71288b70601fa6057fd3727842a74a0' );
-    is( $master-&gt;tree,   '37b4fcd62571f07408e830f455268891f95cecf5' );
-    is( $master-&gt;parent, 'bb99a61fd2035d672d075ea4b72d17ac0d1c193e' );
+
+    is( $master-&gt;kind, 'commit' );
+    is( $master-&gt;size, 256 );
+    like( $master-&gt;sha1, qr/^[a-z0-9]{40}$/ );
+    is( $master-&gt;tree, '37b4fcd62571f07408e830f455268891f95cecf5' );
+    like( $master-&gt;parent, qr/^[a-z0-9]{40}$/ );
     like( $master-&gt;author,
         qr/^Your Name Comes Here &lt;you\@yourdomain.example.com&gt;/ );
     like( $master-&gt;committer,</diff>
      <filename>t/simple.t</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>5069f21b4f49bcc810938c5463f084839f880c10</id>
    </parent>
  </parents>
  <author>
    <name>Leon Brocard</name>
    <email>acme@astray.com</email>
  </author>
  <url>http://github.com/acme/git-pureperl/commit/d7dc95750fbb4f2cb82ee9791863559ebf05542e</url>
  <id>d7dc95750fbb4f2cb82ee9791863559ebf05542e</id>
  <committed-date>2008-11-19T10:58:39-08:00</committed-date>
  <authored-date>2008-11-19T10:58:39-08:00</authored-date>
  <message>add support for version 2 pack index files</message>
  <tree>e57eec2f65ea48395f894f2b4d135186f48e3574</tree>
  <committer>
    <name>Leon Brocard</name>
    <email>acme@astray.com</email>
  </committer>
</commit>
