App-phoebe

 view release on metacpan or  search on metacpan

t/oddmuse-wiki.pl  view on Meta::CPAN

    if ($delete) {
      my $status = DeletePage($OpenPageName);
      print ' ', ($status ? T('not deleted:') . ' ' . $status : T('deleted'));
    } else {
      ExpireKeepFiles();
    }
  }
}

sub ExpireKeepFiles {   # call with opened page
  return unless $KeepDays;
  my $expirets = $Now - ($KeepDays * 86400); # 24*60*60
  foreach my $revision (GetKeepRevisions($OpenPageName)) {
    my $keep = GetKeptRevision($revision);
    next if $keep->{'keep-ts'} >= $expirets;
    next if $KeepMajor and $keep->{revision} == $Page{lastmajor};
    Unlink(GetKeepFile($OpenPageName, $revision));
  }
}

sub ReadFile {
  if (open(my $IN, '<:encoding(UTF-8)', encode_utf8(shift))) {
    local $/ = undef; # Read complete files
    my $data=<$IN>;
    close $IN;
    return (1, $data);
  }
  return (0, '');
}

sub ReadFileOrDie  {
  my ($file) = @_;
  my ($status, $data);
  ($status, $data) = ReadFile($file);
  if (not $status) {
    ReportError(Ts('Cannot open %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
  }
  return $data;
}

sub WriteStringToFile {
  my ($file, $string) = @_;
  open(my $OUT, '>:encoding(UTF-8)', encode_utf8($file))
    or ReportError(Ts('Cannot write %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
  print $OUT  $string;
  close($OUT);
}

sub AppendStringToFile {
  my ($file, $string) = @_;
  open(my $OUT, '>>:encoding(UTF-8)', encode_utf8($file))
    or ReportError(Ts('Cannot write %s', $file) . ": $!", '500 INTERNAL SERVER ERROR');
  print $OUT  $string;
  close($OUT);
}

sub IsFile    { return -f encode_utf8(shift); }
sub IsDir     { return -d encode_utf8(shift); }
sub ZeroSize  { return -z encode_utf8(shift); }
sub Unlink    { return unlink(map { encode_utf8($_) } @_); }
sub Modified  { return (stat(encode_utf8(shift)))[9]; }
sub Glob      { return map { decode_utf8($_) } bsd_glob(encode_utf8(shift)); }
sub ChangeMod { return chmod(shift, map { encode_utf8($_) } @_); }
sub Rename    { return rename(encode_utf8($_[0]), encode_utf8($_[1])); }
sub RemoveDir { return rmdir(encode_utf8(shift)); }
sub ChangeDir { return chdir(encode_utf8(shift)); }

sub CreateDir {
  my ($newdir) = @_;
  return if IsDir($newdir);
  mkdir(encode_utf8($newdir), 0775)
    or ReportError(Ts('Cannot create %s', $newdir) . ": $!", '500 INTERNAL SERVER ERROR');
}

sub GetLockedPageFile {
  my $id = shift;
  return "$PageDir/$id.lck";
}

sub RequestLockDir {
  my ($name, $tries, $wait, $error, $retried) = @_;
  $tries ||= 4;
  $wait ||= 2;
  CreateDir($TempDir);
  my $lock = $LockDir . $name;
  my $n = 0;
  # Cannot use CreateDir because we don't want to skip mkdir if the directory
  # already exists.
  while (mkdir(encode_utf8($lock), 0555) == 0) {
    if ($n++ >= $tries) {
      my $ts = Modified($lock);
      if ($Now - $ts > $LockExpiration and $LockExpires{$name} and not $retried) { # XXX should we remove this now?
	ReleaseLockDir($name); # try to expire lock (no checking)
	return 1 if RequestLockDir($name, undef, undef, undef, 1);
      }
      return 0 unless $error;
      ReportError(Ts('Could not get %s lock', $name) . ": $!. ",
		  '503 SERVICE UNAVAILABLE', undef,
		  Ts('The lock was created %s.', CalcTimeSince($Now - $ts))
		  . ($retried && ' ' . T('Maybe the user running this script is no longer allowed to remove the lock directory?'))
		  . ' ' . T('Sometimes locks are left behind if a job crashes.') . ' '
		  . ($Now - $ts < 600 ? T('After ten minutes, you could try to unlock the wiki.')
		     : ScriptLink('action=unlock', T('Unlock Wiki'), 'unlock')));
    }
    sleep($wait);
  }
  $Locks{$name} = 1;
  return 1;
}

sub HandleSignals {
  my ($signal) = @_; # TODO should we pass it to CleanLock?
  CleanLock($_) foreach keys %Locks;
  exit; # let's count it as graceful exit
}

sub CleanLock {
  my ($name) = @_;
  $LockCleaners{$name}->() if exists $LockCleaners{$name};
  ReleaseLockDir($name); # TODO should we log this?
}



( run in 1.773 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )