From 86766875a924ce1cdf4b1e6affac83bc88e5d5d9 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 20 Aug 2020 00:59:46 +0100 Subject: [PATCH] expire-iso8601: compensate for insufficient density Signed-off-by: Ian Jackson --- scripts/expire-iso8601 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/scripts/expire-iso8601 b/scripts/expire-iso8601 index 1f7c787..a5f21ea 100755 --- a/scripts/expire-iso8601 +++ b/scripts/expire-iso8601 @@ -110,27 +110,34 @@ 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 - $slop; my $i = 0; + my $insufficiently_old = 0; - print DEBUG "FLAG $spec sa=$start_age dmax=$dmax\n"; + print DEBUG "FLAG $spec sa=$start_age dmin=$dmin dmax=$dmax\n"; # 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) { + $insufficiently_old = 1; print STDERR "insufficiently old for $spec\n"; last; } $i++; } + my $oldest = $i; + my $count = 0; + my $use = sub { my ($i, $spec) = @_; push @{ $files[$i]{U} }, $spec; + $count++; }; for (;;) { @@ -156,6 +163,24 @@ sub flag ($) { $i = $j; } + + $i = $oldest; + while ($count < $n) { + for (;;) { + $i++; + if ($i > $#files) { + if (!$insufficiently_old) { + print STDERR + "insufficiently old for $spec (density compensation)\n"; + } + return; + } + my $dt = $files[$i]{A} - $files[$oldest]{A}; + print DEBUG "o #$i $files[$i]{A} dt=$dt\n"; + last if $dt >= $dmin; + } + $use->($i, "$spec+"); + } } sub implement () { -- 2.30.2