File Coverage

blib/lib/Git/Database/DirectoryEntry.pm
Criterion Covered Total %
statement 19 19 100.0
branch 2 2 100.0
condition n/a
subroutine 10 10 100.0
pod 7 7 100.0
total 38 38 100.0


line stmt bran cond sub pod time code
1             package Git::Database::DirectoryEntry;
2             $Git::Database::DirectoryEntry::VERSION = '0.011';
3 8     8   164753 use Sub::Quote;
  8         4727  
  8         526  
4              
5 8     8   561 use Moo;
  8         11120  
  8         44  
6 8     8   4245 use namespace::clean;
  8         11483  
  8         61  
7              
8             # Git only uses the following (octal) modes:
9             # - 040000 for subdirectory (tree)
10             # - 100644 for file (blob)
11             # - 100755 for executable (blob)
12             # - 120000 for a blob that specifies the path of a symlink
13             # - 160000 for submodule (commit)
14             #
15             # See also: cache.h in git.git
16             has mode => (
17             is => 'ro',
18             required => 1,
19             );
20              
21             has filename => (
22             is => 'ro',
23             );
24              
25             has digest => (
26             is => 'ro',
27             isa => quote_sub(
28             q{ die "Not a SHA-1 digest" unless $_[0] =~ /^[0-9a-f]{40}/; }),
29             required => 1,
30             );
31              
32             sub as_content {
33 285     285 1 5483 my ($self) = @_;
34             return
35 285         6550 $self->mode . ' '
36             . $self->filename . "\0"
37             . pack( 'H*', $self->digest );
38             }
39              
40             sub as_string {
41 376     376 1 2688 my ($self) = @_;
42 376         1735 my $mode = oct( '0' . $self->mode );
43 376 100       5147 return sprintf "%06o %s %s\t%s\n", $mode,
44             $mode & 0100000 ? 'blob' : 'tree',
45             $self->digest, $self->filename;
46             }
47              
48             # some helper methods
49 10     10 1 4376 sub is_tree { !( oct( '0' . $_[0]->mode ) & 0100000 ) }
50 5     5 1 2947 sub is_blob { !!( oct( '0' . $_[0]->mode ) & 0100000 ) }
51 5     5 1 2982 sub is_executable { !!( oct( '0' . $_[0]->mode ) & 0100 ) }
52 5     5 1 2922 sub is_link { $_[0]->mode eq '120000' }
53 5     5 1 2688 sub is_submodule { $_[0]->mode eq '160000' }
54              
55             1;
56              
57             __END__
58              
59             =pod
60              
61             =head1 NAME
62              
63             Git::Database::DirectoryEntry - A directory entry in Git
64              
65             =head1 VERSION
66              
67             version 0.011
68              
69             =head1 SYNOPSIS
70              
71             my $hello = Git::Database::DirectoryEntry->new(
72             mode => '100644',
73             filename => 'hello',
74             digest => 'b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0'
75             );
76              
77             my $tree = Git::Database::Object::Tree->new( directory_entries => [$hello] );
78              
79             =head1 DESCRIPTION
80              
81             Git::Database::DirectoryEntry represents a directory entry in a C<tree>
82             object obtained via L<Git::Database> from a Git object database.
83              
84             =head1 ATTRIBUTES
85              
86             =head2 mode
87              
88             The mode of the directory entry, as a string (octal representation):
89              
90             =over 4
91              
92             =item C<040000>
93              
94             a subdirectory (tree)
95              
96             =item C<100644>
97              
98             a file (blob)
99              
100             =item C<100755>
101              
102             an executable file for executable (blob)
103              
104             =item C<120000>
105              
106             a symbolic link (the blob contains the path to the target file)
107              
108             =item C<160000>
109              
110             a submodule (commit)
111              
112             =back
113              
114             =head2 digest
115              
116             The 40 character digest of the Git object pointed by the directory entry.
117              
118             =head2 filename
119              
120             The name of the directory entry.
121              
122             =head1 METHODS
123              
124             =head2 as_content
125              
126             Return a string representing the directory entry in the format used
127             for the content of tree object.
128              
129             =head2 as_string
130              
131             Return a string representing the directory entry in the same format as
132             C<git ls-tree>.
133              
134             =head2 is_tree
135              
136             Return a boolean value indicating whether the directory entry points to a
137             tree object.
138              
139             =head2 is_blob
140              
141             Return a boolean value indicating whether the directory entry points to a
142             blob object.
143              
144             =head2 is_executable
145              
146             Return a boolean value indicating whether the directory entry has the
147             executable switched.
148              
149             =head2 is_link
150              
151             Return a boolean value indicating whether the directory entry points to a
152             a link. Note: a link is a blob.
153              
154             =head2 is_submodule
155              
156             Return a boolean value indicating whether the directory entry points to a
157             a submodule. Note: a submodule is a blob.
158              
159             =head1 SEE ALSO
160              
161             L<Git::Database>,
162             L<Git::Database::Object::Tree>.
163              
164             =head1 AUTHOR
165              
166             Philippe Bruhat (BooK) <book@cpan.org>.
167              
168             =head1 COPYRIGHT
169              
170             Copyright 2013-2016 Philippe Bruhat (BooK), all rights reserved.
171              
172             =head1 LICENSE
173              
174             This program is free software; you can redistribute it and/or modify it
175             under the same terms as Perl itself.
176              
177             =cut