67b25db34badb60744dfdc673cafbd0b080cd5e9
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / Git / PurePerl / Pack / WithIndex.pm
1 package Git::PurePerl::Pack::WithIndex;
2 use Moose;
3 use MooseX::StrictConstructor;
4 use namespace::autoclean;
5
6 extends 'Git::PurePerl::Pack';
7
8 has 'index_filename' =>
9     ( is => 'rw', isa => 'Path::Class::File', required => 0, coerce => 1 );
10 has 'index' =>
11     ( is => 'rw', isa => 'Git::PurePerl::PackIndex', required => 0 );
12
13 sub BUILD {
14     my $self = shift;
15     my $index_filename = $self->filename;
16     $index_filename =~ s/\.pack/.idx/;
17     $self->index_filename($index_filename);
18
19     my $index_fh = IO::File->new($index_filename) || confess($!);
20     $index_fh->binmode();
21     $index_fh->read( my $signature, 4 );
22     $index_fh->read( my $version,   4 );
23     $version = unpack( 'N', $version );
24     $index_fh->close;
25
26     if ( $signature eq "\377tOc" ) {
27         if ( $version == 2 ) {
28             $self->index(
29                 Git::PurePerl::PackIndex::Version2->new(
30                     filename => $index_filename
31                 )
32             );
33         } else {
34             confess("Unknown version");
35         }
36     } else {
37         $self->index(
38             Git::PurePerl::PackIndex::Version1->new(
39                 filename => $index_filename
40             )
41         );
42     }
43 }
44
45 sub get_object {
46     my ( $self, $want_sha1 ) = @_;
47     my $offset = $self->index->get_object_offset($want_sha1);
48     return unless $offset;
49     return $self->unpack_object($offset);
50 }
51
52 __PACKAGE__->meta->make_immutable;
53