CPAN-Reporter-Smoker-OpenBSD
view release on metacpan or search on metacpan
bin/mirror_cleanup view on Meta::CPAN
#!perl
use warnings;
use strict;
use DBI 1.636;
use Set::Tiny 0.04;
use CPAN;
use Getopt::Long;
use Pod::Usage 1.69;
use CPAN::Mini 1.111016;
use File::Spec;
our $VERSION = '0.021'; # VERSION
my ( $help, $version_check );
GetOptions(
'help' => \$help,
'version' => \$version_check
) or pod2usage(1);
pod2usage( -exitval => 0, -verbose => 2 ) if $help;
if ($version_check) {
print "mirror_cleanup - version $VERSION\n";
exit(0);
}
print "Reloading CPAN client indexes...\n";
CPAN::HandleConfig->load;
CPAN::Shell::setup_output;
CPAN::Index->force_reload;
print "Starting cleanup...\n";
my $self = scalar( getpwuid($<) );
my $dbfile = "/home/$self/.cpan/cpandb.sql";
my $dbh = DBI->connect( "dbi:SQLite:dbname=$dbfile", "", "" );
my $query_distros = $dbh->prepare(
q{select A.dist_file from dists A join auths B on A.auth_id = B.auth_id where B.cpanid = ?}
);
my $query_authors = $dbh->prepare(q{select cpanid from auths});
$query_authors->execute();
my $removed = 0;
my $minicpan_root = get_root();
while ( my $row = $query_authors->fetchrow_arrayref() ) {
my $distros = get_distro_files( $dbh, $query_distros, $row->[0] );
my $path = File::Spec->catdir(
$minicpan_root, 'authors', 'id',
substr( $row->[0], 0, 1 ),
substr( $row->[0], 0, 2 ),
$row->[0]
);
next unless ( -d $path );
opendir( DIR, $path ) or die "Cannot read $path: $!";
my @files = readdir(DIR);
close(DIR);
shift(@files);
shift(@files);
foreach my $distro_file (@files) {
next if $distro_file eq 'CHECKSUMS';
my $to_remove = File::Spec->catfile( $path, $distro_file );
next unless ( -f $to_remove );
unless ( $distros->has($distro_file) ) {
my $to_remove = File::Spec->catfile( $path, $distro_file );
print "$to_remove can be removed\n";
unlink($to_remove) or warn "could not remove $to_remove: $!";
$removed++;
}
}
}
$dbh->disconnect();
print "Total removed: $removed\n";
sub get_root {
my %config = CPAN::Mini->read_config();
return $config{local};
}
sub get_distro_files {
my ( $dbh, $sth, $author ) = @_;
$sth->bind_param( 1, $author );
$sth->execute();
my @distros;
while ( my $row = $sth->fetchrow_arrayref() ) {
push( @distros, $row->[0] );
}
return Set::Tiny->new(@distros);
( run in 1.625 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )