]> git.vpit.fr Git - perl/modules/CPANPLUS-Dist-Gentoo.git/blob - samples/gengentooisms
Add the samples/gengentooisms script
[perl/modules/CPANPLUS-Dist-Gentoo.git] / samples / gengentooisms
1 #!/usr/bin/env perl
2
3 # This scrit is meant to guess gentooisms by looking into the portage tree.
4 # A really good one would use the CPANPLUS API to check if the dist name
5 # candidates are really on CPAN.
6
7 use strict;
8 use warnings;
9
10 use Fatal;
11 use List::Util qw/max/;
12
13 use constant PORTAGE => '/usr/portage';
14
15 my %gentooism;
16
17 for my $category (qw/perl-core dev-perl/) {
18  my $dir = PORTAGE . '/' . $category;
19  chdir $dir;
20  for my $name (<*>) {
21   next unless -d $name;
22   my $eb = (sort glob "$dir/$name/$name-*")[-1];
23   open my $fh, '<', $eb;
24   my ($pn, $on_cpan);
25   while (<$fh>) {
26    $on_cpan = 1 if  not defined $on_cpan
27                 and /(?:MODULE_AUTHOR|SRC_URI=.*?(?i:cpan))/;
28    if (not defined $pn and /_PN?=(.*)/) {
29     $pn = $1;
30     if ($pn =~ /^\s*["']?\s*\$\{PN?\}/) {
31      undef $pn;
32      next;
33     }
34     $pn =~ s!\$[{(][^/]*?[})]!!g;
35     $pn =~ s!\$\{P?V.*?\}!!g;
36     $pn =~ s/^\s*["']?\s*-*\s*//;
37     $pn =~ s/\s*-*\s*["']?\s*$//;
38     $pn =~ s/-\d+\..*//;
39     if ($pn =~ m!\$\{PN?(/.*?/(?:.*/?)?)\}!) {
40      my $s = $1;
41      $s .= '/' if $s =~ tr!/!! <= 2;
42      eval "(\$pn = \$name) =~ s$s";
43     }
44    }
45   }
46   if ($pn and $pn ne $name) {
47    if ($on_cpan) {
48     $gentooism{$pn} = $name;
49    } else {
50     print STDERR "'$pn' => '$name' may not be on CPAN\n";
51    }
52   }
53  }
54 }
55
56 my $max = max map length, keys %gentooism;
57
58 print STDERR +(keys %gentooism) . " gentooisms found\n";
59
60 print  "my %gentooism = (\n";
61 printf " '%s'%s => '%s',\n", $_, (' ' x ($max - length)), $gentooism{$_}
62                                                        for sort keys %gentooism;
63 print  ");\n";