Commit | Line | Data |
3fea05b9 |
1 | package Git::PurePerl::PackIndex; |
2 | use Moose; |
3 | use MooseX::StrictConstructor; |
4 | use IO::File; |
5 | use namespace::autoclean; |
6 | |
7 | has 'filename' => |
8 | ( is => 'ro', isa => 'Path::Class::File', required => 1, coerce => 1 ); |
9 | |
10 | has 'fh' => ( is => 'rw', isa => 'IO::File', required => 0 ); |
11 | |
12 | has 'offsets' => |
13 | ( is => 'rw', isa => 'ArrayRef[Int]', required => 0, auto_deref => 1, ); |
14 | has 'size' => ( is => 'rw', isa => 'Int', required => 0 ); |
15 | |
16 | my $FanOutCount = 256; |
17 | my $SHA1Size = 20; |
18 | my $IdxOffsetSize = 4; |
19 | my $OffsetSize = 4; |
20 | my $CrcSize = 4; |
21 | my $OffsetStart = $FanOutCount * $IdxOffsetSize; |
22 | my $SHA1Start = $OffsetStart + $OffsetSize; |
23 | my $EntrySize = $OffsetSize + $SHA1Size; |
24 | my $EntrySizeV2 = $SHA1Size + $CrcSize + $OffsetSize; |
25 | |
26 | sub BUILD { |
27 | my $self = shift; |
28 | my $filename = $self->filename; |
29 | |
30 | my $fh = IO::File->new($filename) || confess($!); |
31 | $self->fh($fh); |
32 | |
33 | my @offsets = (0); |
34 | $fh->seek( $self->global_offset, 0 ); |
35 | foreach my $i ( 0 .. $FanOutCount - 1 ) { |
36 | $fh->read( my $data, $IdxOffsetSize ); |
37 | my $offset = unpack( 'N', $data ); |
38 | confess("pack has discontinuous index") if $offset < $offsets[-1]; |
39 | push @offsets, $offset; |
40 | } |
41 | $self->offsets( \@offsets ); |
42 | $self->size( $offsets[-1] ); |
43 | } |
44 | |
45 | __PACKAGE__->meta->make_immutable; |
46 | |