]> git.vpit.fr Git - perl/modules/CPANPLUS-Dist-Gentoo.git/blob - lib/CPANPLUS/Dist/Gentoo/Maps.pm
df1843a099c75cb3ab53414b718ac77e0043040b
[perl/modules/CPANPLUS-Dist-Gentoo.git] / lib / CPANPLUS / Dist / Gentoo / Maps.pm
1 package CPANPLUS::Dist::Gentoo::Maps;
2
3 use strict;
4 use warnings;
5
6 use File::Spec;
7 use POSIX ();
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<CPANPLUS::Dist::Gentoo>.
24
25 =cut
26
27 my %name_mismatch;
28
29 /^\s*([\w-]+)\s+([\w-]+)\s*$/ and $name_mismatch{$1} = $2 while <DATA>;
30
31 close DATA;
32
33 =head1 FUNCTIONS
34
35 =head2 C<name_c2g>
36
37     my $gentoo_pkg = name_c2g($cpan_dist);
38
39 Maps a CPAN distribution name to the corresponding Gentoo package name.
40
41 =cut
42
43 sub name_c2g {
44  my ($name) = @_;
45  return $name_mismatch{$name} || $name;
46 }
47
48 =head2 C<license_c2g>
49
50     my @gentoo_licenses = license_c2g(@meta_licenses);
51
52 Maps F<META.yml> C<license> tag values to the corresponding list of Gentoo license identifiers.
53 Duplicates are stripped off.
54
55 The included data was gathered from L<Module::Install> and L<Software::License>.
56
57 =cut
58
59 my %licenses = (
60  apache     => [ 'Apache-2.0' ],
61  artistic   => [ 'Artistic' ],
62  artistic_2 => [ 'Artistic-2' ],
63  bsd        => [ 'BSD' ],
64  gpl        => [ 'GPL-1' ],
65  gpl2       => [ 'GPL-2' ],
66  gpl3       => [ 'GPL-3' ],
67  lgpl       => [ 'LGPL-2.1' ],
68  lgpl2      => [ 'LGPL-2.1' ],
69  lgpl3      => [ 'LGPL-3' ],
70  mit        => [ 'MIT' ],
71  mozilla    => [ 'MPL-1.1' ],
72  perl       => [ 'Artistic', 'GPL-2' ],
73 );
74
75 sub license_c2g {
76  my %seen;
77
78  grep !$seen{$_}++,
79   map @{$licenses{+lc} || []},
80    grep defined,
81     @_;
82 }
83
84 =head2 C<version_c2g>
85
86     my $gentoo_version = version_c2g($cpan_dist, $cpan_version);
87
88 Converts the C<$version> of a CPAN distribution C<$name> to a Gentoo version number.
89
90 =cut
91
92 my $default_mapping = sub {
93  my ($version, @no_strip) = @_;
94
95  my $is_dev = $version =~ /_/;
96  my $has_v  = $version =~ s/^v//;
97
98  for ($version) {
99   y/_-//d;
100   s/^\.*//;
101   s/\.*\z//;
102   s/\.+/./g;
103  }
104
105  my $dots   = $version =~ y/\.//;
106
107  my @parts;
108  if ($has_v or $dots >= 2) {
109   @parts = split /\./, $version;
110  } else {
111   ($parts[0], my $subversion) = split /\./, $version, 2;
112   $subversion = '0' unless defined $subversion;
113   my $sublen = length $subversion;
114   if ($sublen < 6) {
115    $subversion .= '0' x (6 - $sublen);
116   } else {
117    my $pad = $sublen % 3;
118    $subversion .= '0' x (3 - $pad) if $pad;
119   }
120   push @parts, $subversion =~ /(...)/g;
121  }
122
123  for my $i (0 .. $#parts) {
124   next if $no_strip[$i];
125   $parts[$i] =~ s/^0+([^0]|0\z)/$1/;
126  }
127  $version  = join '.', @parts;
128
129  $version .= '_rc' if $is_dev;
130
131  return $version;
132 };
133
134 my $default_but_ignore_v = sub {
135  my ($version) = @_;
136
137  $version =~ s/^v//;
138
139  return $default_mapping->($version);
140 };
141
142 my $default_but_no_strip_1 = sub {
143  return $default_mapping->($_[0], 0, 1);
144 };
145
146 my $default_but_no_strip_2 = sub {
147  return $default_mapping->($_[0], 0, 1, 1);
148 };
149
150 my $insert_dot_every = sub {
151  my ($version, $step, $strip) = @_;
152
153  my $is_dev = $version =~ /_/;
154
155  for ($version) {
156   s/^v//;
157   y/_-//d;
158   s/^\.*//;
159   s/\.*\z//;
160   s/\.+/./g;
161  }
162
163  my @parts;
164  ($parts[0], my $subversion) = split /\./, $version, 2;
165  $subversion =~ s/\.//g;
166  my $pat = sprintf '.{1,%d}', $step || 1;
167  push @parts, $subversion =~ /($pat)/g;
168
169  if ($strip) {
170   s/^0+([^0]|0\z)/$1/ for @parts;
171  }
172  $version = join '.', @parts;
173
174  $version .= '_rc' if $is_dev;
175
176  return $version;
177 };
178
179 my $simple_cleanup = sub {
180  my ($version) = @_;
181
182  my $is_dev = $version =~ /_/;
183
184  for ($version) {
185   s/^v//;
186   y/_-//d;
187   s/^\.*//;
188   s/\.*\z//;
189   s/\.+/./g;
190  }
191
192  $version .= '_rc' if $is_dev;
193
194  return $version;
195 };
196
197 my $simple_and_correct_suffixes = sub {
198  my ($version) = @_;
199
200  $version = $simple_cleanup->($version);
201  $version =~ s/(?<!_)((?:alpha|beta|pre|rc|p)\d*)\b/_$1/g;
202
203  return $version;
204 };
205
206 my $simple_and_strip_letters = sub {
207  my ($version) = @_;
208
209  $version = $simple_cleanup->($version);
210  $version =~ s/(?<=\d)[a-z]+//g;
211
212  return $version;
213 };
214
215 my $simple_and_letters_as_suffix = sub {
216  my ($version) = @_;
217
218  $version = $simple_cleanup->($version);
219  $version =~ s/(?<=\d)b(?=\d)/_beta/g;
220
221  return $version;
222 };
223
224 my %version_mismatch;
225
226 $version_mismatch{$_} = $default_but_ignore_v for qw<
227  Net-DNS-Resolver-Programmable
228 >;
229
230 $version_mismatch{$_} = $default_but_no_strip_1 for qw<
231  Crypt-RC4
232  FLV-AudioExtractor
233  File-Grep
234  MogileFS-Client-Async
235  MogileFS-Network
236  Test-Command-Simple
237  Unix-Getrusage
238 >;
239
240 $version_mismatch{$_} = sub { $insert_dot_every->($_[0], 1) } for qw<
241  HTTP-Cookies
242  HTTP-Negotiate
243 >;
244
245 $version_mismatch{$_} = sub { $insert_dot_every->($_[0], 3) } for qw<
246  Data-Diver
247 >;
248
249 $version_mismatch{$_} = $simple_cleanup for qw<
250  CGI-SpeedyCGI
251  Class-ISA
252  CryptX
253  Data-HexDump
254  Gtk2-Notify
255  HTML-Table
256  I18N-LangTags
257  IO
258  IPC-System-Simple
259  Lab-Measurement
260  Net-Ping
261  REST-Client
262  SDL
263  SOAP-WSDL
264  TAP-Parser-SourceHandler-pgTAP
265  TeX-Encode
266  Tie-Simple
267  Time-Piece
268  WattsUp-Daemon
269 >;
270
271 $version_mismatch{$_} = $simple_and_correct_suffixes for qw<
272  XML-Grove
273 >;
274
275 $version_mismatch{$_} = $simple_and_strip_letters for qw<
276  DelimMatch
277  SGMLSpm
278 >;
279
280 $version_mismatch{$_} = $simple_and_letters_as_suffix for qw<
281  Frontier-RPC
282 >;
283
284 sub version_c2g {
285  my ($n, $v) = @_;
286
287  return unless defined $v;
288
289  my $handler;
290  $handler = $version_mismatch{$n} if defined $n;
291  $handler = $default_mapping  unless defined $handler;
292
293  return $handler->($v);
294 }
295
296 =head2 C<perl_version_c2g>
297
298     my $gentoo_version = perl_version_c2g($perl_version);
299
300 Converts a perl version number as you can find it in CPAN prerequisites to a Gentoo version number.
301
302 =cut
303
304 sub perl_version_c2g {
305  my ($v) = @_;
306
307  return unless defined $v and $v =~ /^[0-9\.]+$/;
308
309  my @parts;
310  if (my ($version, $subversion) = $v =~ /^([0-9]+)\.(0[^\.]+)$/) {
311   my $len = length $subversion;
312   if (my $pad = $len % 3) {
313    $subversion .= '0' x (3 - $pad);
314   }
315   @parts = ($version, $subversion =~ /(.{1,3})/g);
316  } else {
317   @parts = split /\./, $v;
318  }
319
320  return join '.', map int, @parts;
321 }
322
323 =head2 C<get_portage_timestamp>
324
325     my $timestamp = get_portage_timestamp($portage);
326
327 Get the numerical timestamp associated with the portage tree located at C<$portage>.
328 Requires L<POSIX::strptime>, and returns C<undef> if it is not available.
329
330 =cut
331
332 sub get_portage_timestamp {
333  my ($portage) = @_;
334
335  {
336   local $@;
337   eval { require POSIX::strptime } or return;
338  }
339
340  my $file = File::Spec->catfile($portage, 'metadata', 'timestamp.chk');
341  return unless -e $file;
342
343  my $timestamp = do {
344   open my $fh, '<', $file or return;
345   local $/;
346   <$fh>;
347  };
348  s/^\s*//, s/\s*$// for $timestamp;
349
350  my $shift = 0;
351  if ($timestamp =~ s/\s+([+-])([0-9]{2})([0-9]{2})$//) {
352   $shift = ($2 * 60 + $3) * 60;
353   $shift = -$shift if $1 eq '-';
354  }
355
356  my $old_lc_all = POSIX::setlocale(POSIX::LC_ALL());
357  POSIX::setlocale(POSIX::LC_ALL(), 'C');
358  $timestamp = POSIX::mktime(
359   POSIX::strptime($timestamp, '%a, %d %b %Y %H:%M:%S')
360  );
361  POSIX::setlocale(POSIX::LC_ALL(), $old_lc_all);
362  $timestamp += $shift;
363
364  return $timestamp;
365 }
366
367 =head2 C<TIMESTAMP>
368
369 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.
370
371 =cut
372
373 sub TIMESTAMP () { 1367759701 }
374
375 =head1 EXPORT
376
377 This module does not export any symbol.
378 All its functions have to be called by their fully qualified names.
379
380 =head1 SEE ALSO
381
382 L<CPANPLUS::Dist::Gentoo>.
383
384 =head1 AUTHOR
385
386 Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
387
388 You can contact me by mail or on C<irc.perl.org> (vincent).
389
390 =head1 BUGS
391
392 Please report any bugs or feature requests to C<bug-cpanplus-dist-gentoo at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CPANPLUS-Dist-Gentoo>.
393 I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
394
395 =head1 SUPPORT
396
397 You can find documentation for this module with the perldoc command.
398
399     perldoc CPANPLUS::Dist::Gentoo
400
401 =head1 COPYRIGHT & LICENSE
402
403 Copyright 2009,2010,2011,2012 Vincent Pit, all rights reserved.
404
405 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
406
407 =cut
408
409 1; # End of CPANPLUS::Dist::Gentoo::Maps
410
411 __DATA__
412 AcePerl                 Ace
413 CGI-Simple              Cgi-Simple
414 CGI-SpeedyCGI           SpeedyCGI
415 Cache-Mmap              cache-mmap
416 Class-Loader            class-loader
417 Class-ReturnValue       class-returnvalue
418 Config-General          config-general
419 Convert-ASCII-Armour    convert-ascii-armour
420 Convert-PEM             convert-pem
421 Crypt-CBC               crypt-cbc
422 Crypt-DES_EDE3          crypt-des-ede3
423 Crypt-DH                crypt-dh
424 Crypt-DSA               crypt-dsa
425 Crypt-IDEA              crypt-idea
426 Crypt-Primes            crypt-primes
427 Crypt-RSA               crypt-rsa
428 Crypt-Random            crypt-random
429 DBIx-SearchBuilder      dbix-searchbuilder
430 Data-Buffer             data-buffer
431 Date-Manip              DateManip
432 Digest                  digest-base
433 Digest-BubbleBabble     digest-bubblebabble
434 Digest-MD2              digest-md2
435 ExtUtils-Depends        extutils-depends
436 ExtUtils-PkgConfig      extutils-pkgconfig
437 Frontier-RPC            frontier-rpc
438 Glib                    glib-perl
439 Gnome2                  gnome2-perl
440 Gnome2-Canvas           gnome2-canvas
441 Gnome2-GConf            gnome2-gconf
442 Gnome2-VFS              gnome2-vfs-perl
443 Gnome2-Wnck             gnome2-wnck
444 Gtk2                    gtk2-perl
445 Gtk2-Ex-FormFactory     gtk2-ex-formfactory
446 Gtk2-GladeXML           gtk2-gladexml
447 Gtk2-Spell              gtk2-spell
448 Gtk2-TrayIcon           gtk2-trayicon
449 Gtk2-TrayManager        gtk2-traymanager
450 Gtk2Fu                  gtk2-fu
451 I18N-LangTags           i18n-langtags
452 Image-Info              ImageInfo
453 Image-Size              ImageSize
454 Inline-Files            inline-files
455 Locale-Maketext         locale-maketext
456 Locale-Maketext-Fuzzy   locale-maketext-fuzzy
457 Locale-Maketext-Lexicon locale-maketext-lexicon
458 Log-Dispatch            log-dispatch
459 Math-Pari               math-pari
460 Module-Info             module-info
461 MogileFS-Server         mogilefs-server
462 NTLM                    Authen-NTLM
463 Net-Ping                net-ping
464 Net-SFTP                net-sftp
465 Net-SSH-Perl            net-ssh-perl
466 Net-Server              net-server
467 OLE-Storage_Lite        OLE-StorageLite
468 Ogg-Vorbis-Header       ogg-vorbis-header
469 PathTools               File-Spec
470 Perl-Tidy               perltidy
471 Pod-Parser              PodParser
472 Regexp-Common           regexp-common
473 Set-Scalar              set-scalar
474 String-CRC32            string-crc32
475 Template-Plugin-Latex   Template-Latex
476 Text-Autoformat         text-autoformat
477 Text-Reform             text-reform
478 Text-Template           text-template
479 Text-Wrapper            text-wrapper
480 Tie-EncryptedHash       tie-encryptedhash
481 Time-Period             Period
482 Tk                      perl-tk
483 Wx                      wxperl
484 YAML                    yaml
485 gettext                 Locale-gettext
486 txt2html                TextToHTML