This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge branch 'delta-deprecate' into blead
authorRicardo Signes <rjbs@cpan.org>
Wed, 12 Jun 2013 01:14:11 +0000 (21:14 -0400)
committerRicardo Signes <rjbs@cpan.org>
Wed, 12 Jun 2013 01:14:11 +0000 (21:14 -0400)
This replaces the %deprecated hash in Module::CoreList with a
Module::CoreList::TieHashDelta, making it easier to keep track of
what changed where, and easier to skim the source to see changes.

AUTHORS
Porting/corelist.pl
dist/Module-CoreList/Changes
dist/Module-CoreList/lib/Module/CoreList.pm

diff --git a/AUTHORS b/AUTHORS
index 521e941..44f52e2 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -798,6 +798,7 @@ Michael Stevens                     <mstevens@etla.org>
 Michael Witten                 <mfwitten@gmail.com>
 Michele Sardo
 Mik Firestone                  <fireston@lexmark.com>
+Mike Doherty                   <mike@mikedoherty.ca>
 Mike Fletcher                  <fletch@phydeaux.org>
 Mike Giroux                    <rmgiroux@acm.org>
 Mike Guy                       <mjtg@cam.ac.uk>
index 6185150..9a90fbb 100755 (executable)
@@ -131,7 +131,12 @@ if ( open my $ucdv, "<", "lib/unicore/version" ) {
     close $ucdv;
 }
 
-my $delta_data = make_corelist_delta($perl_vnum, \%lines);
+my $delta_data = make_corelist_delta(
+  $perl_vnum,
+  \%lines,
+  \%Module::CoreList::version
+);
+
 my $versions_in_release = "    " . $perl_vnum . " => {\n";
 $versions_in_release .= "        delta_from => $delta_data->{delta_from},\n";
 $versions_in_release .= "        changed => {\n";
@@ -230,13 +235,31 @@ $upstream_stanza .= ");";
 $corelist =~ s/^%upstream .*? ;$/$upstream_stanza/ismx;
 
 # Deprecation generation
-my $deprecated_stanza = "    " . $perl_vnum . " => {\n";
-foreach my $module ( sort keys %module_to_deprecated ) {
-    my $deprecated = defined $module_to_deprecated{$module} ? "'$module_to_deprecated{$module}'" : 'undef';
-    $deprecated_stanza .= sprintf "\t%-24s=> %s,\n", "'$module'", $deprecated;
+{
+  my $delta_data = make_corelist_delta(
+    $perl_vnum,
+    \%module_to_deprecated,
+    do { no warnings 'once'; \%Module::CoreList::deprecated },
+  );
+
+  my $deprecated_stanza = "    " . $perl_vnum . " => {\n";
+  $deprecated_stanza .= "        delta_from => $delta_data->{delta_from},\n";
+  $deprecated_stanza .= "        changed => {\n";
+  foreach my $key (sort keys $delta_data->{changed}) {
+    $deprecated_stanza .= sprintf "            %-24s=> %s,\n", "'$key'",
+        defined $delta_data->{changed}{$key} ? "'"
+          . $delta_data->{changed}{$key} . "'" : "undef";
+  }
+  $deprecated_stanza .= "        },\n";
+  $deprecated_stanza .= "        removed => {\n";
+  for my $key (sort keys($delta_data->{removed} || {})) {
+    $deprecated_stanza .= sprintf "           %-24s=> %s,\n", "'$key'", 1;
+  }
+  $deprecated_stanza .= "        }\n";
+  $deprecated_stanza .= "    },\n";
+
+  $corelist =~ s/^(%deprecated\s*=\s*.*?)(^\);)$/$1$deprecated_stanza$2/xism;
 }
-$deprecated_stanza .= "    },\n";
-$corelist =~ s/^(%deprecated\s*=\s*.*?)(^\);)$/$1$deprecated_stanza$2/xism;
 
 my $tracker = "%bug_tracker = (\n";
 foreach my $module ( sort keys %module_to_upstream ) {
@@ -309,7 +332,7 @@ sub fetch_url {
 }
 
 sub make_corelist_delta {
-  my($version, $lines) = @_;
+  my($version, $lines, $existing) = @_;
   # Trust core perl, if someone does use a weird version number the worst that
   # can happen is an extra delta entry for a module.
   my %versions = map { $_ => eval $lines->{$_} } keys %$lines;
@@ -320,13 +343,13 @@ sub make_corelist_delta {
   my %deltas;
   # Search for the release with the least amount of changes (this avoids having
   # to ask for where this perl was branched from).
-  for my $previous(reverse sort keys %Module::CoreList::version) {
+  for my $previous(reverse sort keys %$existing) {
     # Shouldn't happen, but ensure we don't load weird data...
     next if $previous > $version || $previous == $version && $previous eq $version;
 
     my $delta = $deltas{$previous} = {};
     ($delta->{changed}, $delta->{removed}) = calculate_delta(
-      $Module::CoreList::version{$previous}, \%versions);
+      $existing->{$previous}, \%versions);
   }
 
   my $smallest = (sort {
index 301e7ce..e5713a6 100644 (file)
@@ -1,6 +1,7 @@
-...
+2.92
   - Make switches case-sensitive (keep -d and -D distinct)
   - correct omission of Text::Soundex and File::CheckTree from deprecations
+  - switch %deprecated to a delta hash
 
 2.91 Mon May 20 2013
   - Updated for v5.19.0
index 9a937e2..4acc7b3 100644 (file)
@@ -8100,486 +8100,225 @@ for my $version (sort { $a <=> $b } keys %delta) {
 }
 
 %deprecated = (
-    5.011 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.011001 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.011002 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.011003 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.011004 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.011005 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.012000 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.013000 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.012001 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
+    5.011    => {
+        changed => { map { $_ => 1 } qw/
+            Class::ISA
+            Pod::Plainer
+            Shell
+            Switch
+        /},
+    },
+    5.011001 => { delta_from => 5.011 },
+    5.011002 => { delta_from => 5.011001 },
+    5.011003 => { delta_from => 5.011002 },
+    5.011004 => { delta_from => 5.011003 },
+    5.011005 => { delta_from => 5.011004 },
+
+    5.012    => { delta_from => 5.011005 },
+    5.012001 => { delta_from => 5.012 },
+    5.012002 => { delta_from => 5.012001 },
+    5.012003 => { delta_from => 5.012002 },
+    5.012004 => { delta_from => 5.012003 },
+    5.012005 => { delta_from => 5.012004 },
+
+    5.013    => { delta_from => 5.012005 },
     5.013001 => {
-       'Shell'                 => '1',
-    },
-    5.013002 => {
-       'Shell'                 => '1',
-    },
-    5.013003 => {
-       'Shell'                 => '1',
-    },
-    5.013004 => {
-       'Shell'                 => '1',
-    },
-    5.012002 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.013005 => {
-       'Shell'                 => '1',
-    },
-    5.013006 => {
-       'Shell'                 => '1',
-    },
-    5.013007 => {
-       'Shell'                 => '1',
-    },
-    5.013008 => {
-       'Shell'                 => '1',
-    },
-    5.012003 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.013009 => {
-       'Shell'                 => '1',
-    },
-    5.013010 => {
-       'Shell'                 => '1',
-    },
-    5.013011 => {
-       'Shell'                 => '1',
-    },
-    5.014000 => {
-       'Shell'                 => '1',
-    },
-    5.012004 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.012005 => {
-       'Class::ISA'            => '1',
-       'Pod::Plainer'          => '1',
-       'Shell'                 => '1',
-       'Switch'                => '1',
-    },
-    5.014001 => {
-        'Shell'                 => '1',
-    },
-    5.015000 => {
-       'Devel::DProf'          => '1',
-    },
-    5.015000 => {
-    },
-    5.015001 => {
-    },
-    5.015002 => {
-    },
-    5.014002 => {
-       'Shell'                 => '1',
-    },
-    5.015003 => {
-    },
-    5.015004 => {
-    },
-    5.015005 => {
-    },
-    5.015006 => {
-    },
-    5.015007 => {
-    },
-    5.015008 => {
-    },
-    5.015009 => {
-    },
-    5.016000 => {
-    },
-    5.016001 => {
-    },
-    5.016002 => {
-    },
-    5.017000 => {
-    },
-    5.017001 => {
-    },
-    5.017002 => {
-    },
-    5.017003 => {
-    },
-    5.017004 => {
-    },
-    5.014003 => {
-       'Shell'                 => '1',
-    },
-    5.017005 => {
-    },
-    5.017006 => {
-    },
-    5.017007 => {
-    },
+        delta_from => 5.013,
+        removed => { map { $_ => 1 } qw/
+            Class::ISA
+            Pod::Plainer
+            Switch
+        /},
+    },
+    5.013002 => { delta_from => 5.013001 },
+    5.013003 => { delta_from => 5.013002 },
+    5.013004 => { delta_from => 5.013003 },
+    5.013005 => { delta_from => 5.013004 },
+    5.013006 => { delta_from => 5.013005 },
+    5.013007 => { delta_from => 5.013006 },
+    5.013008 => { delta_from => 5.013007 },
+    5.013009 => { delta_from => 5.013008 },
+    5.01301  => { delta_from => 5.013009 },
+    5.013011 => { delta_from => 5.01301  },
+
+    5.014    => { delta_from => 5.013011 },
+    5.014001 => { delta_from => 5.014    },
+    5.014002 => { delta_from => 5.014001 },
+    5.014003 => { delta_from => 5.014002 },
+    5.014004 => { delta_from => 5.014003 },
+
+    5.015    => {
+        delta_from => 5.014004,
+        removed => { Shell => 1 },
+    },
+    5.015001 => { delta_from => 5.015    },
+    5.015002 => { delta_from => 5.015001 },
+    5.015003 => { delta_from => 5.015002 },
+    5.015004 => { delta_from => 5.015003 },
+    5.015005 => { delta_from => 5.015004 },
+    5.015006 => { delta_from => 5.015005 },
+    5.015007 => { delta_from => 5.015006 },
+    5.015008 => { delta_from => 5.015007 },
+    5.015009 => { delta_from => 5.015008 },
+
+    5.016    => { delta_from => 5.015009 },
+    5.016001 => { delta_from => 5.016    },
+    5.016002 => { delta_from => 5.016001 },
+    5.016003 => { delta_from => 5.016002 },
+
+    5.017    => { delta_from => 5.016003 },
+    5.017001 => { delta_from => 5.017    },
+    5.017002 => { delta_from => 5.017001 },
+    5.017003 => { delta_from => 5.017002 },
+    5.017004 => { delta_from => 5.017003 },
+    5.017005 => { delta_from => 5.017004 },
+    5.017006 => { delta_from => 5.017005 },
+    5.017007 => { delta_from => 5.017006 },
     5.017008 => {
-        'Pod::LaTeX'            => '1',
+        delta_from => 5.017007,
+        changed => { 'Pod::LaTeX' => 1 },
     },
     5.017009 => {
-        'Archive::Extract'      => '1',
-        'B::Lint'               => '1',
-        'B::Lint::Debug'        => '1',
-        'CPANPLUS'              => '1',
-        'CPANPLUS::Backend'     => '1',
-        'CPANPLUS::Backend::RV' => '1',
-        'CPANPLUS::Config'      => '1',
-        'CPANPLUS::Config::HomeEnv'=> '1',
-        'CPANPLUS::Configure'   => '1',
-        'CPANPLUS::Configure::Setup'=> '1',
-        'CPANPLUS::Dist'        => '1',
-        'CPANPLUS::Dist::Autobundle'=> '1',
-        'CPANPLUS::Dist::Base'  => '1',
-        'CPANPLUS::Dist::Build' => '1',
-        'CPANPLUS::Dist::Build::Constants'=> '1',
-        'CPANPLUS::Dist::MM'    => '1',
-        'CPANPLUS::Dist::Sample'=> '1',
-        'CPANPLUS::Error'       => '1',
-        'CPANPLUS::Internals'   => '1',
-        'CPANPLUS::Internals::Constants'=> '1',
-        'CPANPLUS::Internals::Constants::Report'=> '1',
-        'CPANPLUS::Internals::Extract'=> '1',
-        'CPANPLUS::Internals::Fetch'=> '1',
-        'CPANPLUS::Internals::Report'=> '1',
-        'CPANPLUS::Internals::Search'=> '1',
-        'CPANPLUS::Internals::Source'=> '1',
-        'CPANPLUS::Internals::Source::Memory'=> '1',
-        'CPANPLUS::Internals::Source::SQLite'=> '1',
-        'CPANPLUS::Internals::Source::SQLite::Tie'=> '1',
-        'CPANPLUS::Internals::Utils'=> '1',
-        'CPANPLUS::Internals::Utils::Autoflush'=> '1',
-        'CPANPLUS::Module'      => '1',
-        'CPANPLUS::Module::Author'=> '1',
-        'CPANPLUS::Module::Author::Fake'=> '1',
-        'CPANPLUS::Module::Checksums'=> '1',
-        'CPANPLUS::Module::Fake'=> '1',
-        'CPANPLUS::Module::Signature'=> '1',
-        'CPANPLUS::Selfupdate'  => '1',
-        'CPANPLUS::Shell'       => '1',
-        'CPANPLUS::Shell::Classic'=> '1',
-        'CPANPLUS::Shell::Default'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Remote'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Source'=> '1',
-        'Devel::InnerPackage'   => '1',
-        'File::CheckTree'       => '1',
-        'Log::Message'          => '1',
-        'Log::Message::Config'  => '1',
-        'Log::Message::Handlers'=> '1',
-        'Log::Message::Item'    => '1',
-        'Log::Message::Simple'  => '1',
-        'Module::Pluggable'     => '1',
-        'Module::Pluggable::Object'=> '1',
-        'Object::Accessor'      => '1',
-        'Pod::LaTeX'            => '1',
-        'Term::UI'              => '1',
-        'Term::UI::History'     => '1',
-        'Text::Soundex'         => '1',
-    },
-    5.014004 => {
-       'Shell'                 => '1',
-    },
-    5.016003 => {
-    },
-    5.017010 => {
-        'Archive::Extract'      => '1',
-        'B::Lint'               => '1',
-        'B::Lint::Debug'        => '1',
-        'CPANPLUS'              => '1',
-        'CPANPLUS::Backend'     => '1',
-        'CPANPLUS::Backend::RV' => '1',
-        'CPANPLUS::Config'      => '1',
-        'CPANPLUS::Config::HomeEnv'=> '1',
-        'CPANPLUS::Configure'   => '1',
-        'CPANPLUS::Configure::Setup'=> '1',
-        'CPANPLUS::Dist'        => '1',
-        'CPANPLUS::Dist::Autobundle'=> '1',
-        'CPANPLUS::Dist::Base'  => '1',
-        'CPANPLUS::Dist::Build' => '1',
-        'CPANPLUS::Dist::Build::Constants'=> '1',
-        'CPANPLUS::Dist::MM'    => '1',
-        'CPANPLUS::Dist::Sample'=> '1',
-        'CPANPLUS::Error'       => '1',
-        'CPANPLUS::Internals'   => '1',
-        'CPANPLUS::Internals::Constants'=> '1',
-        'CPANPLUS::Internals::Constants::Report'=> '1',
-        'CPANPLUS::Internals::Extract'=> '1',
-        'CPANPLUS::Internals::Fetch'=> '1',
-        'CPANPLUS::Internals::Report'=> '1',
-        'CPANPLUS::Internals::Search'=> '1',
-        'CPANPLUS::Internals::Source'=> '1',
-        'CPANPLUS::Internals::Source::Memory'=> '1',
-        'CPANPLUS::Internals::Source::SQLite'=> '1',
-        'CPANPLUS::Internals::Source::SQLite::Tie'=> '1',
-        'CPANPLUS::Internals::Utils'=> '1',
-        'CPANPLUS::Internals::Utils::Autoflush'=> '1',
-        'CPANPLUS::Module'      => '1',
-        'CPANPLUS::Module::Author'=> '1',
-        'CPANPLUS::Module::Author::Fake'=> '1',
-        'CPANPLUS::Module::Checksums'=> '1',
-        'CPANPLUS::Module::Fake'=> '1',
-        'CPANPLUS::Module::Signature'=> '1',
-        'CPANPLUS::Selfupdate'  => '1',
-        'CPANPLUS::Shell'       => '1',
-        'CPANPLUS::Shell::Classic'=> '1',
-        'CPANPLUS::Shell::Default'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Remote'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Source'=> '1',
-        'Devel::InnerPackage'   => '1',
-        'File::CheckTree'       => '1',
-        'Log::Message'          => '1',
-        'Log::Message::Config'  => '1',
-        'Log::Message::Handlers'=> '1',
-        'Log::Message::Item'    => '1',
-        'Log::Message::Simple'  => '1',
-        'Module::Pluggable'     => '1',
-        'Module::Pluggable::Object'=> '1',
-        'Object::Accessor'      => '1',
-        'Pod::LaTeX'            => '1',
-        'Term::UI'              => '1',
-        'Term::UI::History'     => '1',
-        'Text::Soundex'         => '1',
-    },
-    5.017011 => {
-        'Archive::Extract'      => '1',
-        'B::Lint'               => '1',
-        'B::Lint::Debug'        => '1',
-        'CPANPLUS'              => '1',
-        'CPANPLUS::Backend'     => '1',
-        'CPANPLUS::Backend::RV' => '1',
-        'CPANPLUS::Config'      => '1',
-        'CPANPLUS::Config::HomeEnv'=> '1',
-        'CPANPLUS::Configure'   => '1',
-        'CPANPLUS::Configure::Setup'=> '1',
-        'CPANPLUS::Dist'        => '1',
-        'CPANPLUS::Dist::Autobundle'=> '1',
-        'CPANPLUS::Dist::Base'  => '1',
-        'CPANPLUS::Dist::Build' => '1',
-        'CPANPLUS::Dist::Build::Constants'=> '1',
-        'CPANPLUS::Dist::MM'    => '1',
-        'CPANPLUS::Dist::Sample'=> '1',
-        'CPANPLUS::Error'       => '1',
-        'CPANPLUS::Internals'   => '1',
-        'CPANPLUS::Internals::Constants'=> '1',
-        'CPANPLUS::Internals::Constants::Report'=> '1',
-        'CPANPLUS::Internals::Extract'=> '1',
-        'CPANPLUS::Internals::Fetch'=> '1',
-        'CPANPLUS::Internals::Report'=> '1',
-        'CPANPLUS::Internals::Search'=> '1',
-        'CPANPLUS::Internals::Source'=> '1',
-        'CPANPLUS::Internals::Source::Memory'=> '1',
-        'CPANPLUS::Internals::Source::SQLite'=> '1',
-        'CPANPLUS::Internals::Source::SQLite::Tie'=> '1',
-        'CPANPLUS::Internals::Utils'=> '1',
-        'CPANPLUS::Internals::Utils::Autoflush'=> '1',
-        'CPANPLUS::Module'      => '1',
-        'CPANPLUS::Module::Author'=> '1',
-        'CPANPLUS::Module::Author::Fake'=> '1',
-        'CPANPLUS::Module::Checksums'=> '1',
-        'CPANPLUS::Module::Fake'=> '1',
-        'CPANPLUS::Module::Signature'=> '1',
-        'CPANPLUS::Selfupdate'  => '1',
-        'CPANPLUS::Shell'       => '1',
-        'CPANPLUS::Shell::Classic'=> '1',
-        'CPANPLUS::Shell::Default'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Remote'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Source'=> '1',
-        'Devel::InnerPackage'   => '1',
-        'File::CheckTree'       => '1',
-        'Log::Message'          => '1',
-        'Log::Message::Config'  => '1',
-        'Log::Message::Handlers'=> '1',
-        'Log::Message::Item'    => '1',
-        'Log::Message::Simple'  => '1',
-        'Module::Pluggable'     => '1',
-        'Module::Pluggable::Object'=> '1',
-        'Object::Accessor'      => '1',
-        'Pod::LaTeX'            => '1',
-        'Term::UI'              => '1',
-        'Term::UI::History'     => '1',
-        'Text::Soundex'         => '1',
-    },
-    5.017012 => {
-        'Archive::Extract'      => '1',
-        'B::Lint'               => '1',
-        'B::Lint::Debug'        => '1',
-        'CPANPLUS'              => '1',
-        'CPANPLUS::Backend'     => '1',
-        'CPANPLUS::Backend::RV' => '1',
-        'CPANPLUS::Config'      => '1',
-        'CPANPLUS::Config::HomeEnv'=> '1',
-        'CPANPLUS::Configure'   => '1',
-        'CPANPLUS::Configure::Setup'=> '1',
-        'CPANPLUS::Dist'        => '1',
-        'CPANPLUS::Dist::Autobundle'=> '1',
-        'CPANPLUS::Dist::Base'  => '1',
-        'CPANPLUS::Dist::Build' => '1',
-        'CPANPLUS::Dist::Build::Constants'=> '1',
-        'CPANPLUS::Dist::MM'    => '1',
-        'CPANPLUS::Dist::Sample'=> '1',
-        'CPANPLUS::Error'       => '1',
-        'CPANPLUS::Internals'   => '1',
-        'CPANPLUS::Internals::Constants'=> '1',
-        'CPANPLUS::Internals::Constants::Report'=> '1',
-        'CPANPLUS::Internals::Extract'=> '1',
-        'CPANPLUS::Internals::Fetch'=> '1',
-        'CPANPLUS::Internals::Report'=> '1',
-        'CPANPLUS::Internals::Search'=> '1',
-        'CPANPLUS::Internals::Source'=> '1',
-        'CPANPLUS::Internals::Source::Memory'=> '1',
-        'CPANPLUS::Internals::Source::SQLite'=> '1',
-        'CPANPLUS::Internals::Source::SQLite::Tie'=> '1',
-        'CPANPLUS::Internals::Utils'=> '1',
-        'CPANPLUS::Internals::Utils::Autoflush'=> '1',
-        'CPANPLUS::Module'      => '1',
-        'CPANPLUS::Module::Author'=> '1',
-        'CPANPLUS::Module::Author::Fake'=> '1',
-        'CPANPLUS::Module::Checksums'=> '1',
-        'CPANPLUS::Module::Fake'=> '1',
-        'CPANPLUS::Module::Signature'=> '1',
-        'CPANPLUS::Selfupdate'  => '1',
-        'CPANPLUS::Shell'       => '1',
-        'CPANPLUS::Shell::Classic'=> '1',
-        'CPANPLUS::Shell::Default'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Remote'=> '1',
-        'CPANPLUS::Shell::Default::Plugins::Source'=> '1',
-        'Devel::InnerPackage'   => '1',
-        'File::CheckTree'       => '1',
-        'Log::Message'          => '1',
-        'Log::Message::Config'  => '1',
-        'Log::Message::Handlers'=> '1',
-        'Log::Message::Item'    => '1',
-        'Log::Message::Simple'  => '1',
-        'Module::Pluggable'     => '1',
-        'Module::Pluggable::Object'=> '1',
-        'Object::Accessor'      => '1',
-        'Pod::LaTeX'            => '1',
-        'Term::UI'              => '1',
-        'Term::UI::History'     => '1',
-        'Text::Soundex'         => '1',
-    },
-    5.018000 => {
-       'Archive::Extract'      => '1',
-       'B::Lint'               => '1',
-       'B::Lint::Debug'        => '1',
-       'CPANPLUS'              => '1',
-       'CPANPLUS::Backend'     => '1',
-       'CPANPLUS::Backend::RV' => '1',
-       'CPANPLUS::Config'      => '1',
-       'CPANPLUS::Config::HomeEnv'=> '1',
-       'CPANPLUS::Configure'   => '1',
-       'CPANPLUS::Configure::Setup'=> '1',
-       'CPANPLUS::Dist'        => '1',
-       'CPANPLUS::Dist::Autobundle'=> '1',
-       'CPANPLUS::Dist::Base'  => '1',
-       'CPANPLUS::Dist::Build' => '1',
-       'CPANPLUS::Dist::Build::Constants'=> '1',
-       'CPANPLUS::Dist::MM'    => '1',
-       'CPANPLUS::Dist::Sample'=> '1',
-       'CPANPLUS::Error'       => '1',
-       'CPANPLUS::Internals'   => '1',
-       'CPANPLUS::Internals::Constants'=> '1',
-       'CPANPLUS::Internals::Constants::Report'=> '1',
-       'CPANPLUS::Internals::Extract'=> '1',
-       'CPANPLUS::Internals::Fetch'=> '1',
-       'CPANPLUS::Internals::Report'=> '1',
-       'CPANPLUS::Internals::Search'=> '1',
-       'CPANPLUS::Internals::Source'=> '1',
-       'CPANPLUS::Internals::Source::Memory'=> '1',
-       'CPANPLUS::Internals::Source::SQLite'=> '1',
-       'CPANPLUS::Internals::Source::SQLite::Tie'=> '1',
-       'CPANPLUS::Internals::Utils'=> '1',
-       'CPANPLUS::Internals::Utils::Autoflush'=> '1',
-       'CPANPLUS::Module'      => '1',
-       'CPANPLUS::Module::Author'=> '1',
-       'CPANPLUS::Module::Author::Fake'=> '1',
-       'CPANPLUS::Module::Checksums'=> '1',
-       'CPANPLUS::Module::Fake'=> '1',
-       'CPANPLUS::Module::Signature'=> '1',
-       'CPANPLUS::Selfupdate'  => '1',
-       'CPANPLUS::Shell'       => '1',
-       'CPANPLUS::Shell::Classic'=> '1',
-       'CPANPLUS::Shell::Default'=> '1',
-       'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '1',
-       'CPANPLUS::Shell::Default::Plugins::Remote'=> '1',
-       'CPANPLUS::Shell::Default::Plugins::Source'=> '1',
-       'Devel::InnerPackage'   => '1',
-       'File::CheckTree'       => '1',
-       'Log::Message'          => '1',
-       'Log::Message::Config'  => '1',
-       'Log::Message::Handlers'=> '1',
-       'Log::Message::Item'    => '1',
-       'Log::Message::Simple'  => '1',
-       'Module::Pluggable'     => '1',
-       'Module::Pluggable::Object'=> '1',
-       'Object::Accessor'      => '1',
-       'Pod::LaTeX'            => '1',
-       'Term::UI'              => '1',
-       'Term::UI::History'     => '1',
-       'Text::Soundex'         => '1',
-    },
-    5.019000 => {
+        delta_from => 5.017008,
+        changed => { map { $_ => 1 } qw/
+            Archive::Extract
+            B::Lint
+            B::Lint::Debug
+            CPANPLUS
+            CPANPLUS::Backend
+            CPANPLUS::Backend::RV
+            CPANPLUS::Config
+            CPANPLUS::Config::HomeEnv
+            CPANPLUS::Configure
+            CPANPLUS::Configure::Setup
+            CPANPLUS::Dist
+            CPANPLUS::Dist::Autobundle
+            CPANPLUS::Dist::Base
+            CPANPLUS::Dist::Build
+            CPANPLUS::Dist::Build::Constants
+            CPANPLUS::Dist::MM
+            CPANPLUS::Dist::Sample
+            CPANPLUS::Error
+            CPANPLUS::Internals
+            CPANPLUS::Internals::Constants
+            CPANPLUS::Internals::Constants::Report
+            CPANPLUS::Internals::Extract
+            CPANPLUS::Internals::Fetch
+            CPANPLUS::Internals::Report
+            CPANPLUS::Internals::Search
+            CPANPLUS::Internals::Source
+            CPANPLUS::Internals::Source::Memory
+            CPANPLUS::Internals::Source::SQLite
+            CPANPLUS::Internals::Source::SQLite::Tie
+            CPANPLUS::Internals::Utils
+            CPANPLUS::Internals::Utils::Autoflush
+            CPANPLUS::Module
+            CPANPLUS::Module::Author
+            CPANPLUS::Module::Author::Fake
+            CPANPLUS::Module::Checksums
+            CPANPLUS::Module::Fake
+            CPANPLUS::Module::Signature
+            CPANPLUS::Selfupdate
+            CPANPLUS::Shell
+            CPANPLUS::Shell::Classic
+            CPANPLUS::Shell::Default
+            CPANPLUS::Shell::Default::Plugins::CustomSource
+            CPANPLUS::Shell::Default::Plugins::Remote
+            CPANPLUS::Shell::Default::Plugins::Source
+            Devel::InnerPackage
+            File::CheckTree
+            Log::Message
+            Log::Message::Config
+            Log::Message::Handlers
+            Log::Message::Item
+            Log::Message::Simple
+            Module::Pluggable
+            Module::Pluggable::Object
+            Object::Accessor
+            Term::UI
+            Term::UI::History
+            Text::Soundex
+        /},
+    },
+    5.01701  => { delta_from => 5.017009 },
+    5.017011 => { delta_from => 5.01701  },
+    5.017012 => { delta_from => 5.017011 },
+
+    5.018    => { delta_from => 5.017012 },
+
+    5.019    => {
+        delta_from => 5.018,
+        removed => { map { $_ => 1 } qw/
+            Archive::Extract
+            B::Lint
+            B::Lint::Debug
+            CPANPLUS
+            CPANPLUS::Backend
+            CPANPLUS::Backend::RV
+            CPANPLUS::Config
+            CPANPLUS::Config::HomeEnv
+            CPANPLUS::Configure
+            CPANPLUS::Configure::Setup
+            CPANPLUS::Dist
+            CPANPLUS::Dist::Autobundle
+            CPANPLUS::Dist::Base
+            CPANPLUS::Dist::Build
+            CPANPLUS::Dist::Build::Constants
+            CPANPLUS::Dist::MM
+            CPANPLUS::Dist::Sample
+            CPANPLUS::Error
+            CPANPLUS::Internals
+            CPANPLUS::Internals::Constants
+            CPANPLUS::Internals::Constants::Report
+            CPANPLUS::Internals::Extract
+            CPANPLUS::Internals::Fetch
+            CPANPLUS::Internals::Report
+            CPANPLUS::Internals::Search
+            CPANPLUS::Internals::Source
+            CPANPLUS::Internals::Source::Memory
+            CPANPLUS::Internals::Source::SQLite
+            CPANPLUS::Internals::Source::SQLite::Tie
+            CPANPLUS::Internals::Utils
+            CPANPLUS::Internals::Utils::Autoflush
+            CPANPLUS::Module
+            CPANPLUS::Module::Author
+            CPANPLUS::Module::Author::Fake
+            CPANPLUS::Module::Checksums
+            CPANPLUS::Module::Fake
+            CPANPLUS::Module::Signature
+            CPANPLUS::Selfupdate
+            CPANPLUS::Shell
+            CPANPLUS::Shell::Classic
+            CPANPLUS::Shell::Default
+            CPANPLUS::Shell::Default::Plugins::CustomSource
+            CPANPLUS::Shell::Default::Plugins::Remote
+            CPANPLUS::Shell::Default::Plugins::Source
+            Devel::InnerPackage
+            File::CheckTree
+            Log::Message
+            Log::Message::Config
+            Log::Message::Handlers
+            Log::Message::Item
+            Log::Message::Simple
+            Module::Pluggable
+            Module::Pluggable::Object
+            Object::Accessor
+            Pod::LaTeX
+            Term::UI
+            Term::UI::History
+            Text::Soundex
+        /}
     },
 );
 
+for my $version (sort { $a <=> $b } keys %deprecated) {
+    my $data = $deprecated{$version};
+
+    tie %{ $deprecated{$version} }, 'Module::CoreList::TieHashDelta',
+        $data->{changed}, $data->{removed},
+        $data->{delta_from} ? $deprecated{ $data->{delta_from} } : undef;
+}
+
 %upstream = (
     'App::Cpan'             => 'cpan',
     'App::Prove'            => 'cpan',