svn-backup-dumps.pyだけで物足りないところをPerlで補完

Twitter / Kota Sakoda: svn-backup-dumps.py -c 10とか…

開発サーバーのバックアップとかやってて、ふと思った事がきっかけです。
svn-backup-dumps.py ってなかなか便利で、

リビジョンを10個毎まとめてダンプ。

$ svn-backup-dumps.py -c 10 /YOUR/repository .
repository.000000-000009.svndmp
repository.000010-000019.svndmp
...

リビジョンを50個毎まとめてダンプ。

$ svn-backup-dumps.py -c 50
repository.000000-000049.svndmp
repository.000050-000099.svndmp
...

みたいにお手軽にバックアップ出来るわけです。
cronに登録しておくと、とても便利なんです。

勝手に最新リビジョンまでバックアップしてくれるわけですが、ここで一つ問題があります。
仮に最新リビジョンが105だった場合、-c 10オプションを指定すると、

repository.00090-000099.svndmp
repository.00100-000105.svndmp

とダンプしてくれるのはいいのだけど、その後リビジョンが106になり、そのタイミングでcronが走ってしまったりすると、

repository.00100-000106.svndmp

とファイルが生成されてしまい、

repository.00100-000105.svndmp

このファイルはもろにゴミになってしまうというわけ。
このゴミファイルを勝手に消してくれる機能はさすがについていないようでちょっと残念。

というわけで、上記のようなゴミファイルを消す処理を書きました。
Pythonはすらすら書けないのでPerlで。

delete-old-dumps.pl

use strict;

my $dir = shift || ".";
my %data;

opendir DIR, $dir or die($!);
while (my $file = readdir(DIR) ){
    next if $file =~ /^(\.|delete-old-dumps)/;
    push @{$data{(split /\.|-/, $file)[1]}}, $file;
}
closedir DIR;

foreach (sort keys %data){
    my @cache = reverse sort @{ $data{$_} };
    if (scalar @cache > 1){
        for (my $i=1; $i < scalar @cache; $i++){
            unlink $dir . '/' . $cache[$i] or warn($!);
        }
    }
}

使い方は、

$ delete-old-dumps.pl YOUR_DUMPS_PATH

これで綺麗にする事ができますた。

pagetop