chiark / gitweb /
expire-8601: wip new version
[chiark-utils.git] / scripts / expire-iso8601.new
index 25a4cd79d8e4da6ac68388aeefd8a0117a7e2efc..bcf4ec9b322061fc4f8d7e230db0b540585737ab 100755 (executable)
@@ -45,7 +45,7 @@ exit status:
 END
 
 use Carp;
-use DateTime::Format::ISO8601;
+use DateTime::Format::RFC3339;
 
 our @files;
 our $rm = 1;
@@ -54,8 +54,13 @@ our $unit = 86400;
 our $slop;
 our @intervals;
 
+sub badusage ($) {
+  print STDERR "bad usage: $_[0]\n$usage" or die $!;
+  exit 8;
+}
+
 sub scan () {
-  my $parser = DateTime::Format::ISO8601->new;
+  my $parser = DateTime::Format::RFC3339->new;
 
   foreach my $f (<[0-9]*>) {
     if ($f  !~ m/^ \d\d\d\d - \d\d - \d\d 
@@ -63,9 +68,10 @@ sub scan () {
                   (?: [-+] \d{1,2} \:? \d\d )? )? /x) {
       print STDERR "ignoring $f\n";
     }
-    my $t = $parser->parse_time($f) // confess;
-    my $t = $t->epoch() // confess;
-    push @files, { F => $f, T => $t, U => [] ];
+    $!=0; $?=0; my $t = `date -d '$&' +%s`;
+    die "date(!) failed on $&: $? $!" if $! || $?;
+    chomp $t or confess;
+    push @files, { F => $f, T => $t, U => [] };
   }
 }
 
@@ -87,7 +93,7 @@ sub flag ($) {
   my $n = $int->{Number};
   my $d = $int->{Interval};
   my $spec = $int->{Spec};
-  my $start_age = $int->{Number+1) * $interval;
+  my $start_age = ($n+1) * $d;
   my $i = 0;
 
   # find $i, the youngest which is at least $number x $interval
@@ -100,7 +106,7 @@ sub flag ($) {
   }
 
   for (;;) {
-    push $files[$i]{U}, $spec;
+    push @{ $files[$i]{U} }, $spec;
 
     # find $j, the closest to $i which is at least $d-slop younger
     my $j = $i;
@@ -124,11 +130,11 @@ sub implement () {
   }
   foreach (@files) {
     next if @{$_->{U}};
-    print "remove $_>{F}\n";
+    print "remove $_->{F}\n";
     if ($rm) {
       my $r= system 'rm', ($recurse ? ('-r') : ()), "--", $_->{F};
       die "run rm: $!\n" unless defined($r) && $r >= 0;
-      exit 16 if $r;
+      exit 12 if $r;
     }
   }
 }
@@ -158,10 +164,10 @@ $slop //= $unit * 0.1;
 
 foreach (@ARGV) {
   m/^(\d+)x(\d+)$/ or badusage "bad <number>x<interval> $_";
-  push @intervals, { Spec => $&, N => $1, I => $2 ];
+  push @intervals, { Spec => $&, N => $1, I => $2 };
 }
 
 scan();
 precomp();
-foreach $int (@intervals) { flag $int }
+foreach (@intervals) { flag $_ }
 implement();