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