This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
f2f19798bae2827b3adba6e9e530fdfd89865181
[perl5.git] / lib / Module / CoreList / bin / corelist
1 #!/usr/bin/perl
2
3 =head1 NAME
4
5 corelist - a commandline frontend to Module::CoreList
6
7 =head1 DESCRIPTION
8
9 See L<Module::CoreList> for one.
10
11 =head1 SYNOPSIS
12
13     corelist -v [<PerlVersion>]
14     corelist [-a] <ModuleName> | /<ModuleRegex>/ [<ModuleVersion>] ...
15     corelist [-v <PerlVersion>] [ <ModuleName> | /<ModuleNameRegex>/ ] ...
16
17 =head1 OPTIONS
18
19 =over
20
21 =item -a modulename
22
23     corelist -a utf8
24
25     utf8  was first released with perl 5.006
26       5.006      undef
27       5.006001   undef
28       5.006002   undef
29       5.007003   1.00
30       5.008      1.00
31       5.008001   1.02
32       5.008002   1.02
33       5.008003   1.02
34       5.008004   1.03
35       5.008005   1.04
36       5.008006   1.04
37       5.008007   1.05
38       5.008008   1.06
39       5.009      1.02
40       5.009001   1.02
41       5.009002   1.04
42       5.009003   1.06
43
44 =item -? or -help
45
46 help! help! help! to see more help, try --man.
47
48 =item -man
49
50 all of the help
51
52 =item -v
53
54 lists all of the perl release versions we got the CoreList for.
55
56 If you pass a version argument (value of C<$]>, like 5.00503),
57 you get a list of all the modules and their respective versions.
58
59 In module filtering context, it can be used as Perl version filter.
60
61 =back
62
63 =cut
64
65 use Module::CoreList;
66 use Getopt::Long;
67 use Pod::Usage;
68 use strict;
69 use warnings;
70 use version ();
71
72 my %Opts;
73
74 GetOptions(\%Opts, qw[ help|?! man! v|version:f a! ] );
75
76 pod2usage(1) if $Opts{help};
77 pod2usage(-verbose=>2) if $Opts{man};
78
79 if(exists $Opts{v} ){
80     if( !$Opts{v} ) {
81         print "\nModule::CoreList has info on the following perl versions:\n";
82         print "$_\n" for sort keys %Module::CoreList::version;
83         print "\n";
84         exit 0;
85     }
86
87     $Opts{v} = numify_version( $Opts{v} );
88     if( !exists $Module::CoreList::version{$Opts{v}} ) {
89         print "\nModule::CoreList has no info on perl v$Opts{v}\n\n";
90         exit 1;
91     }
92
93     if ( !@ARGV ) {
94         print "\nThe following modules were in perl v$Opts{v} CORE\n";
95         print "$_ ", $Module::CoreList::version{$Opts{v}}{$_} || " ","\n"
96         for sort keys %{$Module::CoreList::version{$Opts{v}}};
97         print "\n";
98         exit 0;
99     }
100 }
101
102 if ( !@ARGV ) {
103     pod2usage(0);
104 }
105
106 while (@ARGV) {
107         my ($mod, $ver);
108         if ($ARGV[0] =~ /=/) {
109             ($mod, $ver) = split /=/, shift @ARGV;
110         } else {
111             $mod = shift @ARGV;
112             $ver = (@ARGV && $ARGV[0] =~ /^\d/) ? shift @ARGV : "";
113         }
114
115         if ($mod !~ m|^/(.*)/([imosx]*)$|) { # not a regex
116             module_version($mod,$ver);
117         } else {
118             my $re;
119             eval { $re = $2 ? qr/(?$2)($1)/ : qr/$1/; }; # trap exceptions while building regex
120             if ($@) {
121                 # regex errors are usually like 'Quantifier follow nothing in regex; marked by ...'
122                 # then we drop text after ';' to shorten message
123                 my $errmsg = $@ =~ /(.*);/ ? $1 : $@;
124                 warn "\n$mod  is a bad regex: $errmsg\n";
125                 next;
126             }
127             my @mod = Module::CoreList->find_modules($re);
128             if (@mod) {
129                 module_version($_, $ver) for @mod;
130             } else {
131                 $ver |= '';
132                 print "\n$mod $ver has no match in CORE (or so I think)\n";
133             }
134
135         }
136 }
137
138 exit();
139
140 sub module_version {
141     my($mod,$ver) = @_;
142
143     if ( $Opts{v} ) {
144         return printf "  %-24s %-10s\n",
145             $mod,
146             $Module::CoreList::version{$Opts{v}}{$mod} || 'undef';
147     }
148
149     $ver = "" unless defined $ver;
150
151     my $ret = Module::CoreList->first_release(@_);
152     my $msg = "$mod $ver";
153
154     if( defined $ret ) {
155         $msg .= " was ";
156         $msg .= "first " unless $ver;
157         $msg .= "released with perl $ret"
158     } else {
159         $msg .= " was not in CORE (or so I think)";
160     }
161
162     print "\n",$msg,"\n";
163
164     if(defined $ret and exists $Opts{a} and $Opts{a}){
165         for my $v(
166             sort keys %Module::CoreList::version ){
167
168             printf "  %-10s %-10s\n",
169                 $v,
170                 $Module::CoreList::version{$v}{$mod}
171                     || 'undef'
172                     if exists $Module::CoreList::version{$v}{$mod};
173         }
174         print "\n";
175     }
176 }
177
178 sub numify_version {
179     my $ver = shift;
180     if ( index( $ver, q{.}, index( $ver, q{.} ) ) >= 0 ) {
181         $ver = version->new($ver)->numify;
182     }
183     return $ver;
184 }
185
186 =head1 EXAMPLES
187
188     $ corelist File::Spec
189
190     File::Spec  was first released with perl 5.005
191
192     $ corelist File::Spec 0.83
193
194     File::Spec 0.83 was released with perl 5.007003
195
196     $ corelist File::Spec 0.89
197
198     File::Spec 0.89 was not in CORE (or so I think)
199
200     $ corelist File::Spec::Aliens
201
202     File::Spec::Aliens  was not in CORE (or so I think)
203
204     $ corelist /IPC::Open/
205
206     IPC::Open2  was first released with perl 5
207
208     IPC::Open3  was first released with perl 5
209
210     $ corelist /MANIFEST/i
211
212     ExtUtils::Manifest  was first released with perl 5.001
213
214     $ corelist /Template/
215
216     /Template/  has no match in CORE (or so I think)
217
218     $ corelist -v 5.8.8 B
219
220     B                        1.09_01
221
222     $ corelist -v 5.8.8 /^B::/
223
224     B::Asmdata               1.01
225     B::Assembler             0.07
226     B::Bblock                1.02_01
227     B::Bytecode              1.01_01
228     B::C                     1.04_01
229     B::CC                    1.00_01
230     B::Concise               0.66
231     B::Debug                 1.02_01
232     B::Deparse               0.71
233     B::Disassembler          1.05
234     B::Lint                  1.03
235     B::O                     1.00
236     B::Showlex               1.02
237     B::Stackobj              1.00
238     B::Stash                 1.00
239     B::Terse                 1.03_01
240     B::Xref                  1.01
241
242 =head1 COPYRIGHT
243
244 Copyright (c) 2002-2006 by D.H. aka PodMaster
245
246 Current maintainer : Rafael Garcia-Suarez E<lt>rgarciasuarez at gmail dot
247 comE<gt>
248
249 This program is distributed under the same terms as perl itself.
250 See http://perl.org/ or http://cpan.org/ for more info on that.
251
252 =cut