Add built local::lib
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / Git / PurePerl / PackIndex / Version1.pm
1 package Git::PurePerl::PackIndex::Version1;
2 use Moose;
3 use MooseX::StrictConstructor;
4 use namespace::autoclean;
5
6 extends 'Git::PurePerl::PackIndex';
7
8 my $FanOutCount   = 256;
9 my $SHA1Size      = 20;
10 my $IdxOffsetSize = 4;
11 my $OffsetSize    = 4;
12 my $CrcSize       = 4;
13 my $OffsetStart   = $FanOutCount * $IdxOffsetSize;
14 my $SHA1Start     = $OffsetStart + $OffsetSize;
15 my $EntrySize     = $OffsetSize + $SHA1Size;
16 my $EntrySizeV2   = $SHA1Size + $CrcSize + $OffsetSize;
17
18 sub global_offset {
19     return 0;
20 }
21
22 sub all_sha1s {
23     my ( $self, $want_sha1 ) = @_;
24     my $fh = $self->fh;
25     my @sha1s;
26
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 );
34         push @sha1s, $sha1;
35         $pos += $EntrySize;
36     }
37     return @sha1s;
38 }
39
40 sub get_object_offset {
41     my ( $self, $want_sha1 ) = @_;
42     my @offsets = $self->offsets;
43     my $fh      = $self->fh;
44
45     my $slot = unpack( 'C', pack( 'H*', $want_sha1 ) );
46     return unless defined $slot;
47
48     my ( $first, $last ) = @offsets[ $slot, $slot + 1 ];
49
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 ) {
56             $first = $mid + 1;
57         } elsif ( $midsha1 gt $want_sha1 ) {
58             $last = $mid;
59         } else {
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 );
64             return $offset;
65         }
66     }
67
68     return;
69 }
70
71 __PACKAGE__->meta->make_immutable;
72