#!/usr/bin/perl -w use strict; use warnings; # Generate a list of packages that are provided by the Perl core packages # and also packaged separately at a (hopefully) newer version. # The list will have the package name and the upstream version of the # corresponding module integrated in the currently installed Perl version. # Copyright (C) 2008 Niko Tyni # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 2 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . # from /usr/share/doc/libapt-pkg-perl/examples/apt-cache use AptPkg::Config '$_config'; use AptPkg::System '$_system'; use AptPkg::Cache; (my $self = $0) =~ s#.*/##; # initialise the global config object with the default values and # setup the $_system object $_config->init; $_system = $_config->system; # supress cache building messages $_config->{quiet} = 2; # set up the cache my $cache = AptPkg::Cache->new; # end from /usr/share/doc/libapt-pkg-perl/examples/apt-cache # special cases when libfoo-bar-perl => Foo::Bar doesn't work my %module_name = ( 'libio-compress-perl' => 'IO::Compress::Gzip', 'libio-compress-zlib-perl' => 'IO::Compress::Gzip', ); use Module::CoreList; my $versioning = $_system->versioning; # we look at packages provided by these my @core_packages = (qw(perl-base perl perl-modules)); # check we have a cache of Debian sid packages available warn('Warning: this list should only be updated on a system with an up to date APT cache of the Debian unstable distribution') if !grep { defined $_->{Origin} && defined $_->{Archive} && $_->{Origin} eq 'Debian' && $_->{Archive} eq 'unstable' } @{$cache->files}; print <{$pkg} or die("no such binary package found in the APT cache: $pkg"); my $latest = bin_latest($cached_versions); for my $provides (@{$latest->{ProvidesList}}) { my $name = $provides->{Name}; # skip virtual-only packages next if (!$cache->{$name}{VersionList}); my $version = find_core_version($name); next if !$version; # the underscore notates a CPAN development version; # these may need special casing with some packages $version =~ s/_/./g; print "$name $version\n"; } } # look up the version of a package in the core sub find_core_version { my $module = shift; my $ret; return if $module =~ /^perl(5|api)/; if (exists $module_name{$module}) { $module = $module_name{$module}; } else { # mangle the package name into the module name $module =~ s/^lib//; $module =~ s/-perl$//; $module =~ s/-/::/g; } for (Module::CoreList->find_modules(qr/^\Q$module\E$/i, 0+$])) { $ret = $Module::CoreList::version{0+$]}{$_}; last; } return $ret; } sub bin_latest { my $p = shift; return (sort bin_byversion @{$p->{VersionList}})[-1]; } sub bin_byversion { return $versioning->compare($a->{VerStr}, $b->{VerStr}); } # Local Variables: # indent-tabs-mode: nil # cperl-indent-level: 4 # End: # vim: syntax=perl sw=4 sts=4 sr et