~/.cpan/buildを綺麗にするスクリプト

CPANシェル起動時のガリガリが嫌いなので、CPAN::Configのscan_cacheをneverにしています。そうすると当然ですが~/.cpan/buildがどんどん太っていくわけです。CPAN::CacheMgrはキャッシュサイズに収まるように古いものから削除するようになっているみたいですが、モジュールの最新バージョンのビルドキャッシュはXSの調査をする時やアンインストールする時にあると便利なので残しておきたいので、バージョンの古いものだけを消す自作スクリプトを使っています。

使い方は、エントリ末尾に載っている(例によって汚い)スクリプトcpan_cleanみたいな名前で保存して実行するだけです。

確認無しでいきなり削除を始めるので注意してください。削除対象の確認ぐらい入れた方がいいと思うのですが、自分で使うものですし、どうせ~/.cpan/buildなので知ったこっちゃないですw

あと、CPAN::Configを読むようになっているので、CPAN::MyConfigな人はごにょごにょ修正してください。直接buildディレクトリを指定しても良いです。

#!/usr/bin/env perl
#
# $Revision: 23 $
# $Source$
# $Date: 2006-09-27 18:04:14 +0900 (Wed, 27 Sep 2006) $
#
package main;
use strict;
use warnings;
use version; our $VERSION = qv( (qw$Revision: 23 $)[1] / 1000 );

use Carp;
use CPAN::Config;
use English qw(-no_match_vars);
use File::Path;
use List::Util qw(max);

my $FORCE_DELETE = 0;

my $build_dir = $CPAN::Config->{build_dir};   ## no critic (ProhibitPackageVars)
chdir $build_dir or croak $OS_ERROR;

my %entries;
foreach my $dir ( glob q{*} ) {
    next if !-d $dir;
    if ( $dir =~ m/(.*?\D)(v?[\d\.]*)$/msx ) {
        ## no critic (ProhibitCaptureWithoutTest)
        my ( $key, $version ) = ( $1, $2 );
        ## use critic
        croak "!-d $key$version" if !-d "$key$version";
        push @{ $entries{$key} },
          {
            dir     => $dir,
            version => version->new($version)->numify,
          };
    }
    else {
        croak $dir;
    }
}

my @dirs;
foreach my $entry ( grep { 1 < @{$_} } values %entries ) {
    my $max_version = max map { $_->{version} } @{$entry};
    push @dirs, map { $_->{dir} }
      grep { $_->{version} != $max_version } @{$entry};
}

rmtree( \@dirs, 1, $FORCE_DELETE );