Add built local::lib
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / Git / PurePerl / Loose.pm
CommitLineData
3fea05b9 1package Git::PurePerl::Loose;
2use Moose;
3use MooseX::StrictConstructor;
4use MooseX::Types::Path::Class;
5use Compress::Zlib qw(compress uncompress);
6use Path::Class;
7use namespace::autoclean;
8
9has 'directory' => (
10 is => 'ro',
11 isa => 'Path::Class::Dir',
12 required => 1,
13 coerce => 1
14);
15
16sub get_object {
17 my ( $self, $sha1 ) = @_;
18
19 my $filename
20 = file( $self->directory, substr( $sha1, 0, 2 ), substr( $sha1, 2 ) );
21 return unless -f $filename;
22
23 my $compressed = $filename->slurp;
24 my $data = uncompress($compressed);
25 my ( $kind, $size, $content ) = $data =~ /^(\w+) (\d+)\0(.+)$/s;
26 return ( $kind, $size, $content );
27}
28
29sub put_object {
30 my ( $self, $object ) = @_;
31
32 my $filename = file(
33 $self->directory,
34 substr( $object->sha1, 0, 2 ),
35 substr( $object->sha1, 2 )
36 );
37 $filename->parent->mkpath;
38 my $compressed = compress( $object->raw );
39 my $fh = $filename->openw;
40 binmode($fh); #important for Win32
41 $fh->print($compressed) || die "Error writing to $filename: $!";
42}
43
44sub all_sha1s {
45 my $self = shift;
46 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 [ map { m{([a-z0-9]{2})[/\\]([a-z0-9]{38})}; $1 . $2 }
53 grep {m{[/\\][a-z0-9]{2}[/\\]}} @$_
54 ];
55 },
56 stream => $files,
57 );
58}
59
60__PACKAGE__->meta->make_immutable;
61