1
0
forked from 0ad/0ad
0ad/build/xmbcleanup/xmbcleanup.pl
2004-12-19 00:42:44 +00:00

61 lines
1.5 KiB
Perl

use strict;
use warnings;
use File::Find;
my $remove_all = (grep /removeall/, @ARGV);
++$|;
# Relative to build/bin or build/xmbcleanup
my $dir = '../../binaries/data/mods/official';
my @xmlfiles;
find({
wanted => sub { push @xmlfiles, $File::Find::name if /\.xml$/; $File::Find::prune=1 if $_ eq '.svn' },
}, $dir);
my $count = 0;
# First, delete old-style XMB files
for (@xmlfiles) {
# Turn "etc.xml" into "etc.xmb"
(my $f = $_) =~ s/\.xml$/.xmb/ or die "Internal error: invalid filename '$_'";
# If it exists, delete it
if (-e $f) {
print "Deleting $f\n";
unlink $f;
++$count;
}
}
for (@xmlfiles) {
# Turn "etc.xml" into "etc_<'?' x 17>.xmb"
(my $f = $_) =~ s/\.xml$/_?????????????????.xmb/ or die "Internal error: invalid filename '$_'";
$f =~ s/ /\\ /g;
# Find all such files
my @xmbfiles = glob $f;
next unless @xmbfiles;
# Remove them all, if asked to do so
if ($remove_all) {
print "DELETING @xmbfiles\n";
unlink @xmbfiles;
$count += @xmbfiles;
# If there are two or more, delete all but the newest
} elsif (@xmbfiles > 1) {
@xmbfiles = sort @xmbfiles; # files are "etc_<TIMESTAMP><SIZE><VERSION>xmb", with TIMESTAMP
# hex-encoded, so sorting will put the oldest files first.
# Remove the newest
pop @xmbfiles;
# Delete the rest
print "DELETING @xmbfiles\n";
unlink @xmbfiles;
$count += @xmbfiles;
}
}
print "\n\nCompleted - $count ".($count==1?'file':'files')." deleted. Press enter to exit.";
<STDIN>;