$! == ENOENT or hkfail "$lock: lstat: $!";
next;
}
+ my ($mode_what,$mode_locknb,$mode_action);
if (-M _ <= $treeexpiredays) {
logm 'debug', "housekeeping: subdirs $subdir: touched recently";
next;
+ } else {
+ $mode_what = 'cleaning';
+ $mode_locknb = LOCK_NB;
+ $mode_action = sub {
+ eval {
+ foreach my $suffix (qw(tmp git)) {
+ my $dir = "${subdir}\\.$suffix";
+ my $tdir = "${subdir}\\.tmp";
+ if ($dir ne $tdir) {
+ if (!rename $dir,$tdir) {
+ next if $! == ENOENT;
+ die "$dir: cannot rename to $tdir: $!\n";
+ }
+ }
+ system qw(rm -rf --), $tdir;
+ if (stat $tdir) {
+ die "$dir: problem deleting file(s), rm exited $?\n";
+ } elsif ($! != ENOENT) {
+ die "$tdir: cannot stat after deletion: $!\n";
+ }
+ }
+ };
+ if (length $@) {
+ chomp $@;
+ logm 'warning', "housekeeping: $subdir: cleanup prevented: $@";
+ } else {
+ unlink $lock or hkfail "remove $lock: $!";
+ }
+ };
}
- if (!lockfile \*LOCK, $lock, LOCK_EX|LOCK_NB) {
+ if (!lockfile \*LOCK, $lock, LOCK_EX|$mode_locknb) {
+ die $! unless $mode_locknb;
logm 'info', "housekeeping: subdirs $subdir: lock busy, skipping";
next;
}
- logm 'info', "housekeeping: subdirs $subdir: cleaning";
- eval {
- foreach my $suffix (qw(tmp git)) {
- my $dir = "${subdir}\\.$suffix";
- my $tdir = "${subdir}\\.tmp";
- if ($dir ne $tdir) {
- if (!rename $dir,$tdir) {
- next if $! == ENOENT;
- die "$dir: cannot rename to $tdir: $!\n";
- }
- }
- system qw(rm -rf --), $tdir;
- if (stat $tdir) {
- die "$dir: problem deleting file(s), rm exited $?\n";
- } elsif ($! != ENOENT) {
- die "$tdir: cannot stat after deletion: $!\n";
- }
- }
- };
- if (length $@) {
- chomp $@;
- logm 'warning', "housekeeping: $subdir: cleanup prevented: $@";
- } else {
- unlink $lock or hkfail "remove $lock: $!";
- }
+ logm 'info', "housekeeping: subdirs $subdir: $mode_what";
+ $mode_action->();
}
open HS, ">", "Housekeeping.stamp" or hkfail "touch Housekeeping.stamp: $!";
close HS or hkfail "close Housekeeping.stamp: $!";