File Coverage

blib/lib/Parse/Debian/PackageDesc.pm
Criterion Covered Total %
statement 83 85 97.6
branch 6 8 75.0
condition 2 2 100.0
subroutine 31 33 93.9
pod 18 26 69.2
total 140 154 90.9


line stmt bran cond sub pod time code
1             package Parse::Debian::PackageDesc;
2              
3 3     3   550139 use strict;
  3         14  
  3         135  
4 3     3   19 use warnings;
  3         7  
  3         185  
5             our $VERSION = 0.15;
6 3     3   89 use 5.00800;
  3         17  
  3         137  
7              
8 3     3   14 use Carp qw(carp croak); # NEVER USE warn OR die !
  3         12  
  3         324  
9 3     3   3272 use English qw(-no_match_vars);
  3         27839  
  3         40  
10 3     3   2207 use File::Basename;
  3         6  
  3         299  
11 3     3   2218 use Encode;
  3         29084  
  3         3875  
12              
13              
14             sub new {
15 7     7 1 1624 my ($class, $path, %user_opts) = @_;
16              
17 7         77 my $self = bless {
18             path => $path,
19             options => { %user_opts },
20             }, $class;
21 7 100       458 if (-r $path) {
22 5         217 open F, $path;
23 5         304 $self->{contents} = decode('utf-8', join("", ));
24 5         1143 close F;
25             }
26             else {
27 2         160 croak "Can't read file '$path'";
28             }
29              
30 5         56 return $self;
31             }
32              
33 5     5 1 446 sub path { $_[0]->{path} }
34              
35             sub get_line_attr {
36 13     13 0 23 my ($self, $attr) = @_;
37              
38 13         276 $self->{contents} =~ /^$attr: (.*)/m;
39 13         80 return $1;
40             }
41              
42             sub get_block_attr {
43 3     3 0 6 my ($self, $attr) = @_;
44              
45             # Collect lines that start with space
46 3         80 $self->{contents} =~ /^$attr:\s*\n(( [^\n]+\n)+)/m;
47 3         36 return $1;
48             }
49              
50             sub date {
51 1     1 1 4 $_[0]->get_line_attr("Date");
52             }
53              
54             sub name {
55 2     2 1 10 $_[0]->source;
56             }
57              
58             # This is special because we have to cover the binNMU case (we get lines like:
59             # "Source: libparse-debian-packagedesc-perl (0.12-1)" but we have to return
60             # just "libparse-debian-packagedesc-perl")
61             sub source {
62 4     4 1 17 my $source_value = $_[0]->get_line_attr("Source");
63 4         100 $source_value =~ s/ .*//;
64 4         27 return $source_value;
65             }
66              
67             sub architecture {
68 1     1 0 4 split(/\s+/, $_[0]->get_line_attr("Architecture"));
69             }
70              
71             sub version {
72 3     3 1 9 $_[0]->get_line_attr("Version");
73             }
74              
75             sub extract_upstream_version {
76 10     10 0 4261 my ($pkg, $version) = @_;
77              
78 10         55 $version =~ s/-[a-z0-9+.~]+$//i;
79 10         33 return $version
80             }
81              
82             sub upstream_version {
83 1     1 1 3 my ($self) = @_;
84 1         4 return __PACKAGE__->extract_upstream_version($self->version);
85             }
86              
87             sub extract_debian_revision {
88 10     10 0 14691 my ($pkg, $version) = @_;
89              
90 10         41 $version =~ /-([a-z0-9+.~]+)$/i;
91 10   100     63 return $1 || "";
92             }
93              
94             sub debian_revision {
95 1     1 1 3 my ($self) = @_;
96 1         3 return __PACKAGE__->extract_debian_revision($self->version);
97             }
98              
99             sub distribution {
100 1     1 1 5 $_[0]->get_line_attr("Distribution");
101             }
102              
103             sub urgency {
104 1     1 1 4 $_[0]->get_line_attr("Urgency");
105             }
106              
107             sub maintainer {
108 2     2 1 8 $_[0]->get_line_attr("Maintainer");
109             }
110              
111             sub changed_by {
112 0     0 1 0 $_[0]->get_line_attr("Changed-By");
113             }
114              
115             sub binary_packages {
116 0     0 1 0 split(/\s/, $_[0]->get_line_attr("Binary"));
117             }
118              
119             sub changes {
120 1     1 1 5 $_[0]->get_block_attr("Changes");
121             }
122              
123             sub files {
124 2     2 1 3 my ($self) = @_;
125              
126 2         7 my $files = $self->get_block_attr("Files");
127 2         17 return map { my @fields = split(/\s+/, $_); $fields[5] }
  8         34  
  8         29  
128             split(/\n/, $files);
129             }
130              
131             sub binary_package_files {
132 1     1 1 2 my ($self) = @_;
133              
134 1         4 grep { $_ =~ /\.deb$/ } $self->files;
  4         22  
135             }
136              
137             sub execute_gpg_verify {
138 4     4 0 10 my ($self) = @_;
139              
140 4 50       23 my $options = defined $self->{options}->{gpg_homedir} ?
141             "--homedir '$self->{options}->{gpg_homedir}'" :
142             "";
143 4         22 my $gpg_cmd_line = "LC_ALL=C gpg $options --verify ".$self->path." 2>&1";
144 4         80714 $self->{gpg_verify_output} = `$gpg_cmd_line`;
145 4         182 $self->{gpg_verify_status} = $?;
146             }
147              
148             sub gpg_verify_status {
149 3     3 0 10 my ($self) = @_;
150              
151 3 100       17 if (!$self->{gpg_verify_status}) {
152 1         11 $self->execute_gpg_verify;
153             }
154 3         75 return $self->{gpg_verify_status};
155             }
156              
157             sub gpg_verify_output {
158 3     3 0 6 my ($self) = @_;
159              
160 3 50       10 if (!$self->{gpg_verify_output}) {
161 3         8 $self->execute_gpg_verify;
162             }
163 3         142 return $self->{gpg_verify_output};
164             }
165              
166             sub correct_signature {
167 3     3 1 9 my ($self) = @_;
168 3         21 return ($self->gpg_verify_status == 0);
169             }
170              
171             sub signature_id {
172 3     3 1 12 my ($self) = @_;
173 3         10 $self->gpg_verify_output =~ /^gpg: Signature.*ID (\w+)$/m;
174 3         150 return $1;
175             }
176              
177             1;
178              
179             __END__