tokuhirom
2/20/2010 - 1:52 AM

gistfile1.txt

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use LWP::Simple qw/mirror/;
use IO::Zlib;
use ExtUtils::MakeMaker;

my $url = 'http://www.cpan.org/modules/02packages.details.txt.gz';
my $homedir = $ENV{HOME} || eval { require File::HomeDir; File::HomeDir->my_home };

GetOptions(
    'h|help'  => \my $help,
    'verbose' => \my $verbose,
) or pod2usage();
pod2usage() if $help;

&main;exit;

sub main {
    my $cachefile = "$homedir/.cpan/sources/modules/02packages.details.txt.gz";
    mirror($url, $cachefile) or die "Cannot mirror file";

    my $fh = IO::Zlib->new($cachefile, "rb") or die "cannot open $cachefile";
    # skip header part
    while (my $line = <$fh>) {
        last if $line eq "\n";
    }
    # body part
    my %seen;
    while (my $line = <$fh>) {
        my ($pkg, $version, $dist) = split /\s+/, $line;
        next if $version eq 'undef';
        next if $seen{$dist}++;
        (my $file = $pkg) =~ s!::!/!g;
        $file = "${file}.pm";
        for my $dir (@INC) {
            my $path = "$dir/$file";
            next unless -f $path;
            my $inst_version = MM->parse_version($path);
            if ($inst_version ne $version) {
                print "$pkg, $inst_version, $version\n";
            }
        }
    }
}

__END__

=head1 SYNOPSIS

    % cpan-outdated