File Coverage

blib/lib/Git/PurePerl/Loose.pm
Criterion Covered Total %
statement 39 39 100.0
branch 2 4 50.0
condition n/a
subroutine 10 10 100.0
pod 0 3 0.0
total 51 56 91.0


line stmt bran cond sub pod time code
1             package Git::PurePerl::Loose;
2 4     4   17 use Moose;
  4         6  
  4         24  
3 4     4   17467 use MooseX::StrictConstructor;
  4         8  
  4         26  
4 4     4   7609 use MooseX::Types::Path::Class;
  4         5  
  4         41  
5 4     4   2473 use Compress::Zlib qw(compress uncompress);
  4         7  
  4         242  
6 4     4   13 use Path::Class;
  4         4  
  4         162  
7 4     4   14 use namespace::autoclean;
  4         5  
  4         24  
8              
9             has 'directory' => (
10             is => 'ro',
11             isa => 'Path::Class::Dir',
12             required => 1,
13             coerce => 1
14             );
15              
16             sub get_object {
17 68     68 0 78 my ( $self, $sha1 ) = @_;
18              
19 68         1543 my $filename
20             = file( $self->directory, substr( $sha1, 0, 2 ), substr( $sha1, 2 ) );
21 68 50       4197 return unless -f $filename;
22              
23 68         2663 my $compressed = $filename->slurp( iomode => '<:raw' );
24 68         9058 my $data = uncompress($compressed);
25 68         2843 my ( $kind, $size, $content ) = $data =~ /^(\w+) (\d+)\0(.*)$/s;
26 68         362 return ( $kind, $size, $content );
27             }
28              
29             sub put_object {
30 14     14 0 14 my ( $self, $object ) = @_;
31              
32 14         314 my $filename = file(
33             $self->directory,
34             substr( $object->sha1, 0, 2 ),
35             substr( $object->sha1, 2 )
36             );
37 14         890 $filename->parent->mkpath;
38 14         1966 my $compressed = compress( $object->raw );
39 14         2734 my $fh = $filename->openw;
40 14         2110 binmode($fh); #important for Win32
41 14 50       45 $fh->print($compressed) || die "Error writing to $filename: $!";
42             }
43              
44             sub all_sha1s {
45 20     20 0 23 my $self = shift;
46 20         477 my $files = Data::Stream::Bulk::Path::Class->new(
47             dir => $self->directory,
48             only_files => 1,
49             );
50             return Data::Stream::Bulk::Filter->new(
51             filter => sub {
52 62         237 [ map { m{([a-z0-9]{2})[/\\]([a-z0-9]{38})}; $1 . $2 }
  62         1216  
53 16     16   35917 grep {m{[/\\][a-z0-9]{2}[/\\]}} @$_
  78         1223  
54             ];
55             },
56 20         2315 stream => $files,
57             );
58             }
59              
60             __PACKAGE__->meta->make_immutable;
61