1 package Git::PurePerl::PackIndex::Version1;
3 use MooseX::StrictConstructor;
4 use namespace::autoclean;
6 extends 'Git::PurePerl::PackIndex';
10 my $IdxOffsetSize = 4;
13 my $OffsetStart = $FanOutCount * $IdxOffsetSize;
14 my $SHA1Start = $OffsetStart + $OffsetSize;
15 my $EntrySize = $OffsetSize + $SHA1Size;
16 my $EntrySizeV2 = $SHA1Size + $CrcSize + $OffsetSize;
23 my ( $self, $want_sha1 ) = @_;
27 my $pos = $OffsetStart;
28 $fh->seek( $pos, 0 ) || die $!;
29 foreach my $i ( 1 .. $self->size ) {
30 $fh->read( my $data, $OffsetSize ) || die $!;
31 my $offset = unpack( 'N', $data );
32 $fh->read( $data, $SHA1Size ) || die $!;
33 my $sha1 = unpack( 'H*', $data );
40 sub get_object_offset {
41 my ( $self, $want_sha1 ) = @_;
42 my @offsets = $self->offsets;
45 my $slot = unpack( 'C', pack( 'H*', $want_sha1 ) );
46 return unless defined $slot;
48 my ( $first, $last ) = @offsets[ $slot, $slot + 1 ];
50 while ( $first < $last ) {
51 my $mid = int( ( $first + $last ) / 2 );
52 $fh->seek( $SHA1Start + $mid * $EntrySize, 0 ) || die $!;
53 $fh->read( my $data, $SHA1Size ) || die $!;
54 my $midsha1 = unpack( 'H*', $data );
55 if ( $midsha1 lt $want_sha1 ) {
57 } elsif ( $midsha1 gt $want_sha1 ) {
60 my $pos = $OffsetStart + $mid * $EntrySize;
61 $fh->seek( $pos, 0 ) || die $!;
62 $fh->read( my $data, $OffsetSize ) || die $!;
63 my $offset = unpack( 'N', $data );
71 __PACKAGE__->meta->make_immutable;