File Coverage

blib/lib/CPANPLUS/Dist/Gentoo/Maps.pm
Criterion Covered Total %
statement 33 55 60.0
branch 11 24 45.8
condition 3 6 50.0
subroutine 8 9 88.8
pod 5 5 100.0
total 60 99 60.6


line stmt bran cond sub pod time code
1             package CPANPLUS::Dist::Gentoo::Maps;
2              
3 4     4   77085 use strict;
  4         10  
  4         143  
4 4     4   53 use warnings;
  4         10  
  4         109  
5              
6 4     4   22 use File::Spec;
  4         8  
  4         87  
7 4     4   3086 use POSIX ();
  4         28293  
  4         19739  
8              
9             =head1 NAME
10              
11             CPANPLUS::Dist::Gentoo::Maps - Map CPAN distribution names, version numbers and license identifiers to their Gentoo counterparts.
12              
13             =head1 VERSION
14              
15             Version 0.12
16              
17             =cut
18              
19             our $VERSION = '0.12';
20              
21             =head1 DESCRIPTION
22              
23             This is an helper package to L.
24              
25             =cut
26              
27             my %name_mismatch;
28              
29             /^\s*([\w-]+)\s+([\w-]+)\s*$/ and $name_mismatch{$1} = $2 while ;
30              
31             close DATA;
32              
33             =head1 FUNCTIONS
34              
35             =head2 C
36              
37             Maps a CPAN distribution name to the corresponding Gentoo package name.
38              
39             =cut
40              
41             sub name_c2g {
42 17     17 1 8655 my ($name) = @_;
43 17   66     144 return $name_mismatch{$name} || $name;
44             }
45              
46             =head2 C
47              
48             Maps F C tag values to the corresponding list of Gentoo license identifiers.
49             Duplicates are stripped off.
50              
51             The included data was gathered from L and L.
52              
53             =cut
54              
55             my %licenses = (
56             apache => [ 'Apache-2.0' ],
57             artistic => [ 'Artistic' ],
58             artistic_2 => [ 'Artistic-2' ],
59             bsd => [ 'BSD' ],
60             gpl => [ 'GPL-1' ],
61             gpl2 => [ 'GPL-2' ],
62             gpl3 => [ 'GPL-3' ],
63             lgpl => [ 'LGPL-2.1' ],
64             lgpl2 => [ 'LGPL-2.1' ],
65             lgpl3 => [ 'LGPL-3' ],
66             mit => [ 'MIT' ],
67             mozilla => [ 'MPL-1.1' ],
68             perl => [ 'Artistic', 'GPL-2' ],
69             );
70              
71             sub license_c2g {
72 6     6 1 3425 my %seen;
73              
74 6 100       49 grep !$seen{$_}++,
75 6         18 map @{$licenses{+lc} || []},
76             grep defined,
77             @_;
78             }
79              
80             =head2 C
81              
82             Converts the C<$version> of a CPAN distribution C<$name> to a Gentoo version number.
83              
84             =cut
85              
86             my $default_mapping = sub {
87             my ($version, @no_strip) = @_;
88              
89             my $is_dev = $version =~ /_/;
90             my $has_v = $version =~ s/^v//;
91              
92             for ($version) {
93             y/_-//d;
94             s/^\.*//;
95             s/\.*\z//;
96             s/\.+/./g;
97             }
98              
99             my $dots = $version =~ y/\.//;
100              
101             my @parts;
102             if ($has_v or $dots >= 2) {
103             @parts = split /\./, $version;
104             } else {
105             ($parts[0], my $subversion) = split /\./, $version, 2;
106             $subversion = '0' unless defined $subversion;
107             my $sublen = length $subversion;
108             if ($sublen < 6) {
109             $subversion .= '0' x (6 - $sublen);
110             } else {
111             my $pad = $sublen % 3;
112             $subversion .= '0' x (3 - $pad) if $pad;
113             }
114             push @parts, $subversion =~ /(...)/g;
115             }
116              
117             for my $i (0 .. $#parts) {
118             next if $no_strip[$i];
119             $parts[$i] =~ s/^0+([^0]|0\z)/$1/;
120             }
121             $version = join '.', @parts;
122              
123             $version .= '_rc' if $is_dev;
124              
125             return $version;
126             };
127              
128             my $default_but_ignore_v = sub {
129             my ($version) = @_;
130              
131             $version =~ s/^v//;
132              
133             return $default_mapping->($version);
134             };
135              
136             my $default_but_no_strip_1 = sub {
137             return $default_mapping->($_[0], 0, 1);
138             };
139              
140             my $default_but_no_strip_2 = sub {
141             return $default_mapping->($_[0], 0, 1, 1);
142             };
143              
144             my $insert_dot_every = sub {
145             my ($version, $step) = @_;
146              
147             my $is_dev = $version =~ /_/;
148              
149             for ($version) {
150             s/^v//;
151             y/_-//d;
152             s/^\.*//;
153             s/\.*\z//;
154             s/\.+/./g;
155             }
156              
157             my @parts;
158             ($parts[0], my $subversion) = split /\./, $version, 2;
159             $subversion =~ s/\.//g;
160             my $pat = sprintf '.{1,%d}', $step || 1;
161             push @parts, $subversion =~ /($pat)/g;
162              
163             s/^0+([^0]|0\z)/$1/ for @parts;
164             $version = join '.', @parts;
165              
166             $version .= '_rc' if $is_dev;
167              
168             return $version;
169             };
170              
171             my $simple_cleanup = sub {
172             my ($version) = @_;
173              
174             my $is_dev = $version =~ /_/;
175              
176             for ($version) {
177             s/^v//;
178             y/_-//d;
179             s/^\.*//;
180             s/\.*\z//;
181             s/\.+/./g;
182             }
183              
184             $version .= '_rc' if $is_dev;
185              
186             return $version;
187             };
188              
189             my $simple_and_correct_suffixes = sub {
190             my ($version) = @_;
191              
192             $version = $simple_cleanup->($version);
193             $version =~ s/(?
194              
195             return $version;
196             };
197              
198             my $simple_and_strip_letters = sub {
199             my ($version) = @_;
200              
201             $version = $simple_cleanup->($version);
202             $version =~ s/(?<=\d)[a-z]+//g;
203              
204             return $version;
205             };
206              
207             my $simple_and_letters_as_suffix = sub {
208             my ($version) = @_;
209              
210             $version = $simple_cleanup->($version);
211             $version =~ s/(?<=\d)b(?=\d)/_beta/g;
212              
213             return $version;
214             };
215              
216             my %version_mismatch;
217              
218             $version_mismatch{$_} = $default_but_ignore_v for qw<
219             Net-DNS-Resolver-Programmable
220             >;
221              
222             $version_mismatch{$_} = $default_but_no_strip_1 for qw<
223             Crypt-RC4
224             File-Grep
225             MogileFS-Client-Async
226             MogileFS-Network
227             >;
228              
229             $version_mismatch{$_} = $default_but_no_strip_2 for qw<
230             Net-IMAP-Simple
231             >;
232              
233             $version_mismatch{$_} = sub { $insert_dot_every->($_[0], 1) } for qw<
234             HTTP-Cookies
235             HTTP-Negotiate
236             >;
237              
238             $version_mismatch{$_} = sub { $insert_dot_every->($_[0], 3) } for qw<
239             POE-Component-IKC
240             >;
241              
242             $version_mismatch{$_} = $simple_cleanup for qw<
243             Alien-SDL
244             CGI-SpeedyCGI
245             Class-ISA
246             Data-Uniqid
247             ExtUtils-Install
248             File-Path
249             Getopt-GUI-Long
250             Gtk2-Notify
251             HTML-Table
252             I18N-LangTags
253             IO
254             IPC-System-Simple
255             Lab-Measurement
256             Log-TraceMessages
257             MusicBrainz-DiscID
258             Net-IRC
259             Net-Ping
260             SDL
261             SOAP-WSDL
262             TeX-Encode
263             Tie-Simple
264             Time-Piece
265             WattsUp-Daemon
266             >;
267              
268             $version_mismatch{$_} = $simple_and_correct_suffixes for qw<
269             Gimp
270             XML-Grove
271             >;
272              
273             $version_mismatch{$_} = $simple_and_strip_letters for qw<
274             DelimMatch
275             SGMLSpm
276             >;
277              
278             $version_mismatch{$_} = $simple_and_letters_as_suffix for qw<
279             Frontier-RPC
280             >;
281              
282             sub version_c2g {
283 21     21 1 5466 my ($n, $v) = @_;
284              
285 21 50       63 return unless defined $v;
286              
287 21         28 my $handler;
288 21 100       62 $handler = $version_mismatch{$n} if defined $n;
289 21 100       50 $handler = $default_mapping unless defined $handler;
290              
291 21         50 return $handler->($v);
292             }
293              
294             =head2 C
295              
296             Converts a perl version number as you can find it in CPAN prerequisites to a Gentoo version number.
297              
298             =cut
299              
300             sub perl_version_c2g {
301 7     7 1 654 my ($v) = @_;
302              
303 7 50 33     60 return unless defined $v and $v =~ /^[0-9\.]+$/;
304              
305 7         10 my @parts;
306 7 100       33 if (my ($version, $subversion) = $v =~ /^([0-9]+)\.(0[^\.]+)$/) {
307 2         6 my $len = length $subversion;
308 2 50       12 if (my $pad = $len % 3) {
309 2         7 $subversion .= '0' x (3 - $pad);
310             }
311 2         12 @parts = ($version, $subversion =~ /(.{1,3})/g);
312             } else {
313 5         19 @parts = split /\./, $v;
314             }
315              
316 7         69 return join '.', map int, @parts;
317             }
318              
319             =head2 C
320              
321             Get the numerical timestamp associated with the portage tree located at C<$portage>.
322             Requires L, and returns C if it is not available.
323              
324             =cut
325              
326             sub get_portage_timestamp {
327 0     0 1   my ($portage) = @_;
328              
329             {
330 0           local $@;
  0            
331 0 0         eval { require POSIX::strptime } or return;
  0            
332             }
333              
334 0           my $file = File::Spec->catfile($portage, 'metadata', 'timestamp.chk');
335 0 0         return unless -e $file;
336              
337 0           my $timestamp = do {
338 0 0         open my $fh, '<', $file or return;
339 0           local $/;
340 0           <$fh>;
341             };
342 0           s/^\s*//, s/\s*$// for $timestamp;
343              
344 0           my $shift = 0;
345 0 0         if ($timestamp =~ s/\s+([+-])([0-9]{2})([0-9]{2})$//) {
346 0           $shift = ($2 * 60 + $3) * 60;
347 0 0         $shift = -$shift if $1 eq '-';
348             }
349              
350 0           my $old_lc_all = POSIX::setlocale(POSIX::LC_ALL());
351 0           POSIX::setlocale(POSIX::LC_ALL(), 'C');
352 0           $timestamp = POSIX::mktime(
353             POSIX::strptime($timestamp, '%a, %d %b %Y %H:%M:%S')
354             );
355 0           POSIX::setlocale(POSIX::LC_ALL(), $old_lc_all);
356 0           $timestamp += $shift;
357              
358 0           return $timestamp;
359             }
360              
361             =head2 C
362              
363             Numerical timestamp associated with the revision of the portage tree that was used for generating the corrections to the natural cpan-to-gentoo mapping listed in this module.
364              
365             =cut
366              
367             sub TIMESTAMP () { 1339737301 }
368              
369             =head1 SEE ALSO
370              
371             L.
372              
373             =head1 AUTHOR
374              
375             Vincent Pit, C<< >>, L.
376              
377             You can contact me by mail or on C (vincent).
378              
379             =head1 BUGS
380              
381             Please report any bugs or feature requests to C, or through the web interface at L.
382             I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
383              
384             =head1 SUPPORT
385              
386             You can find documentation for this module with the perldoc command.
387              
388             perldoc CPANPLUS::Dist::Gentoo
389              
390             =head1 COPYRIGHT & LICENSE
391              
392             Copyright 2009,2010,2011,2012 Vincent Pit, all rights reserved.
393              
394             This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
395              
396             =cut
397              
398             1; # End of CPANPLUS::Dist::Gentoo::Maps
399              
400             __DATA__