chiark / gitweb /
expire-iso8601: compensate for insufficient density
[chiark-utils.git] / scripts / expire-iso8601
index 1f7c78758e206285be5c72a214ffe98f4772d89f..a5f21ea7c2b12becea705b6c526980ccd91f5efd 100755 (executable)
@@ -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 () {