diff --git a/ReadCache.pm b/ReadCache.pm new file mode 100644 index 0000000..9addf02 --- /dev/null +++ b/ReadCache.pm @@ -0,0 +1,21 @@ +package readcache; +use strict; + +# Read the archive directories. +our %archives; + +sub readDir { + my $dir = shift; + opendir(DIR, "$dir") or die "cannot open `$dir': $!"; + my @as = readdir DIR; + foreach my $archive (@as) { + next unless $archive =~ /^sha256_/ || $archive =~ /\.nar-bsdiff$/ || $archive =~ /\.nar\.bz2$/; + $archives{$archive} = "$dir/$archive"; + } + closedir DIR; +} + +readDir "/data/releases/nars"; +readDir "/data/releases/patches"; + +print STDERR scalar (keys %archives), "\n"; diff --git a/print-dead-files.pl b/print-dead-files.pl new file mode 100755 index 0000000..5f3c0a3 --- /dev/null +++ b/print-dead-files.pl @@ -0,0 +1,58 @@ +#! /var/run/current-system/sw/bin/perl -w -I . + +use strict; +use Nix::Manifest; +use ReadCache; +use File::Basename; + + +# Read the manifests. +my %narFiles; +my %patches; + +foreach my $manifest (@ARGV) { + print STDERR "loading $manifest\n"; + if (readManifest($manifest, \%narFiles, \%patches, 1) < 3) { +# die "manifest `$manifest' is too old (i.e., for Nix <= 0.7)\n"; + } +} + + +# Find the live archives. +my %usedFiles; + +foreach my $narFile (keys %narFiles) { + foreach my $file (@{$narFiles{$narFile}}) { + $file->{url} =~ /\/([^\/]+)$/; + my $basename = $1; + die unless defined $basename; + #print STDERR "GOT $basename\n"; + $usedFiles{$basename} = 1; + print STDERR "missing archive `$basename'\n" + unless defined $readcache::archives{$basename}; + } +} + +foreach my $patch (keys %patches) { + foreach my $file (@{$patches{$patch}}) { + $file->{url} =~ /\/([^\/]+)$/; + my $basename = $1; + die unless defined $basename; + #print STDERR "GOT2 $basename\n"; + $usedFiles{$basename} = 1; + die "missing archive `$basename'" + unless defined $readcache::archives{$basename}; + } +} + + +# Print out the dead archives. +foreach my $archive (keys %readcache::archives) { + next if $archive eq "." || $archive eq ".."; + if (!defined $usedFiles{$archive}) { + my $file = $readcache::archives{$archive}; + print "$file\n"; + my $hashFile = dirname($file) . "/.hash." . basename($file); + print "$hashFile\n" if -e $hashFile; + } +} diff --git a/remove-dead-files.sh b/remove-dead-files.sh new file mode 100644 index 0000000..c576d63 --- /dev/null +++ b/remove-dead-files.sh @@ -0,0 +1,4 @@ +#! /bin/sh +./print-dead-files.pl /data/releases/patches/all-patches $(find /data/releases -name MANIFEST | grep -v '\.trash' | grep -v '\.tmp') | sort > /tmp/dead +mkdir -p /data/releases/.trash/ +xargs -d '\n' sh -c 'find "$@" -mtime +100 -print' < /tmp/dead | xargs -d '\n' mv -v --target-directory=/data/releases/.trash/