Merge remote-tracking branch 'smcv/ready/transient-rm'
commit
b92e8caa4d
|
@ -201,7 +201,7 @@ sub migrate_to_internal {
|
|||
if (-e $oldoutput) {
|
||||
require IkiWiki::Render;
|
||||
debug("removing output file $oldoutput");
|
||||
IkiWiki::prune($oldoutput);
|
||||
IkiWiki::prune($oldoutput, $config{destdir});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -232,8 +232,9 @@ sub writefile ($$$;$$) {
|
|||
}
|
||||
|
||||
# This is a wrapper around the real prune.
|
||||
sub prune ($) {
|
||||
sub prune ($;$) {
|
||||
my $file=shift;
|
||||
my $up_to=shift;
|
||||
|
||||
my @keys=IkiWiki::Plugin::amazon_s3::file2keys($file);
|
||||
|
||||
|
@ -250,7 +251,7 @@ sub prune ($) {
|
|||
}
|
||||
}
|
||||
|
||||
return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file);
|
||||
return $IkiWiki::Plugin::amazon_s3::subs{'IkiWiki::prune'}->($file, $up_to);
|
||||
}
|
||||
|
||||
1
|
||||
|
|
|
@ -286,7 +286,7 @@ sub attachments_save {
|
|||
}
|
||||
return unless @attachments;
|
||||
require IkiWiki::Render;
|
||||
IkiWiki::prune($dir);
|
||||
IkiWiki::prune($dir, $config{wikistatedir}."/attachments");
|
||||
|
||||
# Check the attachments in and trigger a wiki refresh.
|
||||
if ($config{rcs}) {
|
||||
|
|
|
@ -665,9 +665,11 @@ sub commentmoderation ($$) {
|
|||
|
||||
my $page=IkiWiki::dirname($f);
|
||||
my $file="$config{srcdir}/$f";
|
||||
my $filedir="$config{srcdir}";
|
||||
if (! -e $file) {
|
||||
# old location
|
||||
$file="$config{wikistatedir}/comments_pending/".$f;
|
||||
$filedir="$config{wikistatedir}/comments_pending";
|
||||
}
|
||||
|
||||
if ($action eq 'Accept') {
|
||||
|
@ -682,7 +684,7 @@ sub commentmoderation ($$) {
|
|||
}
|
||||
|
||||
require IkiWiki::Render;
|
||||
IkiWiki::prune($file);
|
||||
IkiWiki::prune($file, $filedir);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ sub refresh () {
|
|||
}
|
||||
if ($delete) {
|
||||
debug(sprintf(gettext("removing old preview %s"), $file));
|
||||
IkiWiki::prune("$config{destdir}/$file");
|
||||
IkiWiki::prune("$config{destdir}/$file", $config{destdir});
|
||||
}
|
||||
}
|
||||
elsif (defined $mtime) {
|
||||
|
|
|
@ -1102,7 +1102,7 @@ sub deletetranslations ($) {
|
|||
IkiWiki::rcs_remove($_);
|
||||
}
|
||||
else {
|
||||
IkiWiki::prune("$config{srcdir}/$_");
|
||||
IkiWiki::prune("$config{srcdir}/$_", $config{srcdir});
|
||||
}
|
||||
} @todelete;
|
||||
|
||||
|
|
|
@ -22,6 +22,13 @@ sub getsetup () {
|
|||
},
|
||||
}
|
||||
|
||||
sub allowed_dirs {
|
||||
return grep { defined $_ } (
|
||||
$config{srcdir},
|
||||
$IkiWiki::Plugin::transient::transientdir,
|
||||
);
|
||||
}
|
||||
|
||||
sub check_canremove ($$$) {
|
||||
my $page=shift;
|
||||
my $q=shift;
|
||||
|
@ -33,12 +40,22 @@ sub check_canremove ($$$) {
|
|||
htmllink("", "", $page, noimageinline => 1)));
|
||||
}
|
||||
|
||||
# Must exist on disk, and be a regular file.
|
||||
# Must exist in either the srcdir or a suitable underlay (e.g.
|
||||
# transient underlay), and be a regular file.
|
||||
my $file=$pagesources{$page};
|
||||
if (! -e "$config{srcdir}/$file") {
|
||||
my $dir;
|
||||
|
||||
foreach my $srcdir (allowed_dirs()) {
|
||||
if (-e "$srcdir/$file") {
|
||||
$dir = $srcdir;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if (! defined $dir) {
|
||||
error(sprintf(gettext("%s is not in the srcdir, so it cannot be deleted"), $file));
|
||||
}
|
||||
elsif (-l "$config{srcdir}/$file" && ! -f _) {
|
||||
elsif (-l "$dir/$file" && ! -f _) {
|
||||
error(sprintf(gettext("%s is not a file"), $file));
|
||||
}
|
||||
|
||||
|
@ -46,7 +63,7 @@ sub check_canremove ($$$) {
|
|||
# This is sorta overkill, but better safe than sorry.
|
||||
if (! defined pagetype($pagesources{$page})) {
|
||||
if (IkiWiki::Plugin::attachment->can("check_canattach")) {
|
||||
IkiWiki::Plugin::attachment::check_canattach($session, $page, "$config{srcdir}/$file");
|
||||
IkiWiki::Plugin::attachment::check_canattach($session, $page, "$dir/$file");
|
||||
}
|
||||
else {
|
||||
error("removal of attachments is not allowed");
|
||||
|
@ -124,7 +141,7 @@ sub removal_confirm ($$@) {
|
|||
my $f=IkiWiki::Plugin::attachment::is_held_attachment($page);
|
||||
if (defined $f) {
|
||||
require IkiWiki::Render;
|
||||
IkiWiki::prune($f);
|
||||
IkiWiki::prune($f, "$config{wikistatedir}/attachments");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -223,21 +240,34 @@ sub sessioncgi ($$) {
|
|||
require IkiWiki::Render;
|
||||
if ($config{rcs}) {
|
||||
IkiWiki::disable_commit_hook();
|
||||
foreach my $file (@files) {
|
||||
IkiWiki::rcs_remove($file);
|
||||
}
|
||||
my $rcs_removed = 1;
|
||||
|
||||
foreach my $file (@files) {
|
||||
foreach my $srcdir (allowed_dirs()) {
|
||||
if (-e "$srcdir/$file") {
|
||||
if ($srcdir eq $config{srcdir} && $config{rcs}) {
|
||||
IkiWiki::rcs_remove($file);
|
||||
$rcs_removed = 1;
|
||||
}
|
||||
else {
|
||||
IkiWiki::prune("$srcdir/$file", $srcdir);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($config{rcs}) {
|
||||
if ($rcs_removed) {
|
||||
IkiWiki::rcs_commit_staged(
|
||||
message => gettext("removed"),
|
||||
session => $session,
|
||||
);
|
||||
}
|
||||
IkiWiki::rcs_commit_staged(
|
||||
message => gettext("removed"),
|
||||
session => $session,
|
||||
);
|
||||
IkiWiki::enable_commit_hook();
|
||||
IkiWiki::rcs_update();
|
||||
}
|
||||
else {
|
||||
foreach my $file (@files) {
|
||||
IkiWiki::prune("$config{srcdir}/$file");
|
||||
}
|
||||
}
|
||||
|
||||
IkiWiki::refresh();
|
||||
IkiWiki::saveindex();
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ sub rendered (@) {
|
|||
my $casualty = "$transientdir/$file";
|
||||
if (srcfile($file) ne $casualty && -e $casualty) {
|
||||
debug(sprintf(gettext("removing transient version of %s"), $file));
|
||||
IkiWiki::prune($casualty);
|
||||
IkiWiki::prune($casualty, $transientdir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -262,12 +262,13 @@ sub render ($$) {
|
|||
}
|
||||
}
|
||||
|
||||
sub prune ($) {
|
||||
sub prune ($;$) {
|
||||
my $file=shift;
|
||||
my $up_to=shift;
|
||||
|
||||
unlink($file);
|
||||
my $dir=dirname($file);
|
||||
while (rmdir($dir)) {
|
||||
while ((! defined $up_to || $dir =~ m{^\Q$up_to\E\/}) && rmdir($dir)) {
|
||||
$dir=dirname($dir);
|
||||
}
|
||||
}
|
||||
|
@ -447,7 +448,7 @@ sub remove_del (@) {
|
|||
}
|
||||
|
||||
foreach my $old (@{$oldrenderedfiles{$page}}) {
|
||||
prune($config{destdir}."/".$old);
|
||||
prune($config{destdir}."/".$old, $config{destdir});
|
||||
}
|
||||
|
||||
foreach my $source (keys %destsources) {
|
||||
|
@ -537,7 +538,7 @@ sub remove_unrendered () {
|
|||
foreach my $file (@{$oldrenderedfiles{$page}}) {
|
||||
if (! grep { $_ eq $file } @{$renderedfiles{$page}}) {
|
||||
debug(sprintf(gettext("removing %s, no longer built by %s"), $file, $page));
|
||||
prune($config{destdir}."/".$file);
|
||||
prune($config{destdir}."/".$file, $config{destdir});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -844,7 +845,7 @@ sub clean_rendered {
|
|||
remove_unrendered();
|
||||
foreach my $page (keys %oldrenderedfiles) {
|
||||
foreach my $file (@{$oldrenderedfiles{$page}}) {
|
||||
prune($config{destdir}."/".$file);
|
||||
prune($config{destdir}."/".$file, $config{destdir});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/perl
|
||||
use warnings;
|
||||
use strict;
|
||||
use Test::More tests => 6;
|
||||
use File::Path qw(make_path remove_tree);
|
||||
|
||||
BEGIN { use_ok("IkiWiki"); }
|
||||
BEGIN { use_ok("IkiWiki::Render"); }
|
||||
|
||||
%config=IkiWiki::defaultconfig();
|
||||
|
||||
remove_tree("t/tmp");
|
||||
|
||||
make_path("t/tmp/srcdir/a/b/c");
|
||||
make_path("t/tmp/srcdir/d/e/f");
|
||||
writefile("a/b/c/d.mdwn", "t/tmp/srcdir", "foo");
|
||||
writefile("d/e/f/g.mdwn", "t/tmp/srcdir", "foo");
|
||||
IkiWiki::prune("t/tmp/srcdir/d/e/f/g.mdwn");
|
||||
ok(-d "t/tmp/srcdir");
|
||||
ok(! -e "t/tmp/srcdir/d");
|
||||
IkiWiki::prune("t/tmp/srcdir/a/b/c/d.mdwn", "t/tmp/srcdir");
|
||||
ok(-d "t/tmp/srcdir");
|
||||
ok(! -e "t/tmp/srcdir/a");
|
Loading…
Reference in New Issue