This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Further updates to perldelta:
[perl5.git] / Porting / corelist-perldelta.pl
1 #!perl
2 use 5.010;
3 use strict;
4 use warnings;
5 use lib 'Porting';
6 use Maintainers qw/%Modules/;
7 use Module::CoreList;
8
9 my $deprecated;
10
11 #--------------------------------------------------------------------------#
12
13 sub added {
14   my ($mod, $old_v, $new_v) = @_;
15   say "=item C<$mod>\n";
16   say "Version $new_v has been added to the Perl core.\n";
17 }
18
19 sub updated {
20   my ($mod, $old_v, $new_v) = @_;
21   say "=item C<$mod>\n";
22   say "Upgraded from version $old_v to $new_v.\n";
23   if ( $deprecated->{$mod} ) {
24     say "NOTE: C<$mod> is deprecated and may be removed from a future version of Perl.\n";
25   }
26 }
27
28 sub removed {
29   my ($mod, $old_v, $new_v) = @_;
30   say "=item C<$mod>\n";
31   say "Removed from the Perl core.  Prior version was $old_v.\n";
32 }
33
34 sub generate_section {
35   my ($title, $item_sub, @mods ) = @_;
36   return unless @mods;
37
38   say "=head2 $title\n";
39   say "=over 4\n";
40
41   for my $tuple ( sort { lc($a->[0]) cmp lc($b->[0]) } @mods ) {
42     my ($mod,$old_v,$new_v) = @$tuple;
43     $old_v //= q('undef');
44     $new_v //= q('undef');
45     $item_sub->($mod, $old_v, $new_v);
46   }
47
48   say "=back\n";
49 }
50
51 #--------------------------------------------------------------------------#
52
53 my $corelist = \%Module::CoreList::version;
54 my @versions = sort keys %$corelist;
55
56 # by default, compare latest two version in CoreList;
57 my ($old, $new) = @ARGV;
58 $old ||= $versions[-2];
59 $new ||= $versions[-1];
60 warn $old;
61 warn $new;
62 $deprecated = $Module::CoreList::deprecated{$new};
63
64 my (@new,@deprecated,@removed,@pragmas,@modules);
65
66 # %Modules defines what is currently in core
67 for my $k ( keys %Modules ) {
68     warn "Considering $k";
69   next unless exists $corelist->{$new}{$k};
70   my $old_ver = $corelist->{$old}{$k};
71   my $new_ver = $corelist->{$new}{$k};
72   # in core but not in last corelist
73   if ( ! exists $corelist->{$old}{$k} ) {
74     push @new, [$k, undef, $new_ver];
75   }
76   # otherwise just pragmas or modules
77   else {
78     my $old_ver = $corelist->{$old}{$k};
79     my $new_ver = $corelist->{$new}{$k};
80     next unless defined $old_ver && defined $new_ver && $old_ver ne $new_ver;
81     my $tuple = [ $k, $old_ver, $new_ver ];
82     if ( $k eq lc $k ) {
83       push @pragmas, $tuple;
84     }
85     else {
86       push @modules, $tuple;
87     }
88   }
89 }
90
91 # in old corelist, but not this one => removed
92 # N.B. This is exhaustive -- not just what's in %Modules, so modules removed from
93 # distributions will show up here, too.  Some person will have to review to see what's
94 # important. That's the best we can do without a historical Maintainers.pl
95 for my $k ( keys %{ $corelist->{$old} } ) {
96   if ( ! exists $corelist->{$new}{$k} ) {
97     push @removed, [$k, $corelist->{$old}{$k}, undef];
98   }
99 }
100
101 generate_section("New Modules and Pragmata", \&added, @new);
102 generate_section("Pragmata Changes", \&updated, @pragmas);
103 generate_section("Updated Modules", \&updated, @modules);
104 generate_section("Removed Modules and Pragmata", \&removed, @removed);
105