our $recurse = 1;
our $unit = 86400;
our $slop;
-our $debug;
+our $debug = 0;
our @intervals;
sub badusage ($) {
$_->{A} = ($newest_t - $_->{T}) / $unit foreach @files;
$slop /= $unit;
- print DEBUG Dumper(\@files, \@intervals) if $debug >= 2;
+ push @{$files[0]{U}}, "newest";
+
+ print DEBUG Dumper(scalar(@files), \@files, \@intervals) if $debug >= 2;
}
sub flag ($) {
my ($int) = @_;
my $n = $int->{N};
my $d = $int->{D};
- my $dmin = $d - $slop;
+ my $dmax = $d + $slop;
my $spec = $int->{Spec};
- my $start_age = ($n+1) * $d;
+ my $start_age = ($n-1) * $d - $slop;
my $i = 0;
- print DEBUG "FLAG $spec sa=$start_age dmin=$dmin\n";
+ print DEBUG "FLAG $spec sa=$start_age dmax=$dmax\n";
- # find $i, the youngest which is at least $number x $interval
+ # find $i, the youngest which is at least $start_age
for (;;) {
print DEBUG "i #$i $files[$i]{A}\n";
last if $files[$i]{A} >= $start_age;
if ($i == $#files) {
- print STDERR "insufficient for $spec\n";
+ print STDERR "insufficiently old for $spec\n";
+ last;
}
$i++;
}
for (;;) {
push @{ $files[$i]{U} }, $spec;
- # find $j, the closest to $i which is at least $d-slop younger
+ # find $j, the closest to $i, preferably no more than $dmax younger
my $j = $i;
for (;;) {
$j--;
+ # at each point in this loop $j is the next candidate
last if $j < 0;
- last if $files[$j];
my $dt = $files[$i]{A} - $files[$j]{A};
print DEBUG "j #$j $files[$j]{A} dt=$dt\n";
- last if $dt >= $dmin;
+ last if $dt > $dmax;
}
last if $j < 0;
+ $j++;
+ if ($j == $i) {
+ $j--;
+ print STDERR "insufficiently dense for $spec after $files[$j]{F}\n";
+ }
+ print DEBUG "i #$j\n";
$i = $j;
}
sub implement () {
foreach (@files) {
next unless @{$_->{U}};
- print "keep $_->{F} for @{$_->{U}}\n";
+ printf "keep %s for %s - age %.1f\n",
+ $_->{F}, "@{$_->{U}}", $_->{A};
}
foreach (@files) {
next if @{$_->{U}};
- print "remove $_->{F}\n";
+ printf "remove %s - age %.1f\n",
+ $_->{F}, $_->{A};
if ($rm) {
my $r= system 'rm', ($recurse ? ('-r') : ()), "--", $_->{F};
die "run rm: $!\n" unless defined($r) && $r >= 0;