parent
544da9b0da
commit
40dc92a67b
|
@ -130,12 +130,17 @@ sub rename_form ($$$) { #{{{
|
||||||
options => \@page_types,
|
options => \@page_types,
|
||||||
value => $ext, force => 1);
|
value => $ext, force => 1);
|
||||||
|
|
||||||
|
foreach my $p (keys %pagesources) {
|
||||||
|
if ($pagesources{$p}=~m/^\Q$page\E\//) {
|
||||||
$f->field(name => "subpages",
|
$f->field(name => "subpages",
|
||||||
label => "",
|
label => "",
|
||||||
type => "checkbox",
|
type => "checkbox",
|
||||||
options => [ [ 1 => gettext("Also rename SubPages and attachments") ] ],
|
options => [ [ 1 => gettext("Also rename SubPages and attachments") ] ],
|
||||||
value => 1,
|
value => 1,
|
||||||
force => 1);
|
force => 1);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$f->field(name => "attachment", type => "hidden");
|
$f->field(name => "attachment", type => "hidden");
|
||||||
|
|
||||||
|
@ -256,12 +261,14 @@ sub sessioncgi ($$) { #{{{
|
||||||
postrename($session);
|
postrename($session);
|
||||||
}
|
}
|
||||||
elsif ($form->submitted eq 'Rename' && $form->validate) {
|
elsif ($form->submitted eq 'Rename' && $form->validate) {
|
||||||
|
# Queue of rename actions to perfom.
|
||||||
|
my @torename;
|
||||||
|
|
||||||
# These untaints are safe because of the checks
|
# These untaints are safe because of the checks
|
||||||
# performed in check_canrename below.
|
# performed in check_canrename later.
|
||||||
my $src=$q->param("page");
|
my $src=$q->param("page");
|
||||||
my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src});
|
my $srcfile=IkiWiki::possibly_foolish_untaint($pagesources{$src});
|
||||||
my $dest=IkiWiki::possibly_foolish_untaint(IkiWiki::titlepage($q->param("new_name")));
|
my $dest=IkiWiki::possibly_foolish_untaint(IkiWiki::titlepage($q->param("new_name")));
|
||||||
|
|
||||||
my $destfile=$dest;
|
my $destfile=$dest;
|
||||||
if (! $q->param("attachment")) {
|
if (! $q->param("attachment")) {
|
||||||
my $type=$q->param('type');
|
my $type=$q->param('type');
|
||||||
|
@ -275,42 +282,76 @@ sub sessioncgi ($$) { #{{{
|
||||||
|
|
||||||
$destfile.=".".$type;
|
$destfile.=".".$type;
|
||||||
}
|
}
|
||||||
|
push @torename, {
|
||||||
|
src => $src,
|
||||||
|
srcfile => $srcfile,
|
||||||
|
dest => $dest,
|
||||||
|
destfile => $destfile,
|
||||||
|
required => 1,
|
||||||
|
};
|
||||||
|
|
||||||
check_canrename($src, $srcfile, $dest, $destfile,
|
# See if any subpages need to be renamed.
|
||||||
$q, $session);
|
|
||||||
|
|
||||||
# See if subpages need to be renamed.
|
|
||||||
my @subpages;
|
|
||||||
if ($q->param("subpages") && $src ne $dest) {
|
if ($q->param("subpages") && $src ne $dest) {
|
||||||
foreach my $p (keys %pagesources) {
|
foreach my $p (keys %pagesources) {
|
||||||
if ($pagesources{$p}=~m/^\Q$src\E\/$/) {
|
if ($pagesources{$p}=~m/^\Q$src\E\//) {
|
||||||
push @subpages, $p;
|
my $d=$pagesources{$p};
|
||||||
}
|
$d=~s/^\Q$src\E\//$dest\//;
|
||||||
}
|
push @torename, {
|
||||||
}
|
src => $p,
|
||||||
|
srcfile => $pagesources{$p},
|
||||||
# Begin renaming process, which will end with a
|
dest => pagename($d),
|
||||||
# wiki refresh.
|
destfile => $d,
|
||||||
require IkiWiki::Render;
|
required => 0,
|
||||||
IkiWiki::disable_commit_hook() if $config{rcs};
|
|
||||||
|
|
||||||
do_rename($srcfile, $destfile, $session);
|
|
||||||
|
|
||||||
foreach my $subpage (@subpages) {
|
|
||||||
my $subsrc=$pagesources{$subpage};
|
|
||||||
my $subdest=$subsrc;
|
|
||||||
$subdest=~s/^\Q$src\E\//$dest/;
|
|
||||||
eval {
|
|
||||||
do_rename($subsrc, $subdest, $session)
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
my @fixedlinks;
|
|
||||||
if ($src ne $dest) {
|
|
||||||
push @fixedlinks, fixlinks($src, $dest, $session);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# End renaming process and refresh wiki.
|
require IkiWiki::Render;
|
||||||
|
IkiWiki::disable_commit_hook() if $config{rcs};
|
||||||
|
my %origpagesources=%pagesources;
|
||||||
|
|
||||||
|
# First file renaming.
|
||||||
|
foreach my $rename (@torename) {
|
||||||
|
if ($rename->{required}) {
|
||||||
|
do_rename($rename, $q, $session);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
eval {do_rename($rename, $q, $session)};
|
||||||
|
if ($@) {
|
||||||
|
$rename->{error}=$@;
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Temporarily tweak pagesources to point to
|
||||||
|
# the renamed file, in case fixlinks needs
|
||||||
|
# to edit it.
|
||||||
|
$pagesources{$rename->{src}}=$rename->{destfile};
|
||||||
|
}
|
||||||
|
IkiWiki::rcs_commit_staged(
|
||||||
|
sprintf(gettext("rename %s to %s"), $srcfile, $destfile),
|
||||||
|
$session->param("name"), $ENV{REMOTE_ADDR}) if $config{rcs};
|
||||||
|
|
||||||
|
# Then link fixups.
|
||||||
|
foreach my $rename (@torename) {
|
||||||
|
next if $rename->{src} eq $rename->{dest};
|
||||||
|
next if $rename->{error};
|
||||||
|
foreach my $p (fixlinks($rename, $session)) {
|
||||||
|
# map old page names to new
|
||||||
|
foreach my $r (@torename) {
|
||||||
|
next if $rename->{error};
|
||||||
|
if ($r->{src} eq $p) {
|
||||||
|
$p=$r->{dest};
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
push @{$rename->{fixedlinks}}, $p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Then refresh.
|
||||||
|
%pagesources=%origpagesources;
|
||||||
if ($config{rcs}) {
|
if ($config{rcs}) {
|
||||||
IkiWiki::enable_commit_hook();
|
IkiWiki::enable_commit_hook();
|
||||||
IkiWiki::rcs_update();
|
IkiWiki::rcs_update();
|
||||||
|
@ -318,47 +359,51 @@ sub sessioncgi ($$) { #{{{
|
||||||
IkiWiki::refresh();
|
IkiWiki::refresh();
|
||||||
IkiWiki::saveindex();
|
IkiWiki::saveindex();
|
||||||
|
|
||||||
# Scan for any remaining broken links to $src.
|
# Find pages with remaining, broken links.
|
||||||
my @brokenlinks;
|
foreach my $rename (@torename) {
|
||||||
if ($src ne $dest) {
|
next if $rename->{src} eq $rename->{dest};
|
||||||
|
|
||||||
foreach my $page (keys %links) {
|
foreach my $page (keys %links) {
|
||||||
my $broken=0;
|
my $broken=0;
|
||||||
foreach my $link (@{$links{$page}}) {
|
foreach my $link (@{$links{$page}}) {
|
||||||
my $bestlink=bestlink($page, $link);
|
my $bestlink=bestlink($page, $link);
|
||||||
if ($bestlink eq $src) {
|
if ($bestlink eq $rename->{src}) {
|
||||||
$broken=1;
|
push @{$rename->{brokenlinks}}, $page;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
push @brokenlinks, $page if $broken;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Generate a rename summary, that will be shown at the top
|
# Generate a summary, that will be shown at the top
|
||||||
# of the edit template.
|
# of the edit template.
|
||||||
|
$renamesummary="";
|
||||||
|
foreach my $rename (@torename) {
|
||||||
my $template=template("renamesummary.tmpl");
|
my $template=template("renamesummary.tmpl");
|
||||||
$template->param(src => $srcfile);
|
$template->param(src => $rename->{srcfile});
|
||||||
$template->param(dest => $destfile);
|
$template->param(dest => $rename->{destfile});
|
||||||
if ($src ne $dest) {
|
$template->param(error => $rename->{error});
|
||||||
|
if ($rename->{src} ne $rename->{dest}) {
|
||||||
$template->param(brokenlinks_checked => 1);
|
$template->param(brokenlinks_checked => 1);
|
||||||
$template->param(brokenlinks => [
|
$template->param(brokenlinks => [
|
||||||
map {
|
map {
|
||||||
{
|
{
|
||||||
page => htmllink($dest, $dest, $_,
|
page => htmllink($rename->{dest}, $rename->{dest}, $_,
|
||||||
noimageinline => 1)
|
noimageinline => 1)
|
||||||
}
|
}
|
||||||
} @brokenlinks
|
} @{$rename->{brokenlinks}}
|
||||||
]);
|
]);
|
||||||
$template->param(fixedlinks => [
|
$template->param(fixedlinks => [
|
||||||
map {
|
map {
|
||||||
{
|
{
|
||||||
page => htmllink($dest, $dest, $_,
|
page => htmllink($rename->{dest}, $rename->{dest}, $_,
|
||||||
noimageinline => 1)
|
noimageinline => 1)
|
||||||
}
|
}
|
||||||
} @fixedlinks
|
} @{$rename->{fixedlinks}}
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$renamesummary=$template->output;
|
$renamesummary.=$template->output;
|
||||||
|
}
|
||||||
|
|
||||||
postrename($session, $src, $dest, $q->param("attachment"));
|
postrename($session, $src, $dest, $q->param("attachment"));
|
||||||
}
|
}
|
||||||
|
@ -386,29 +431,34 @@ sub renamepage_hook ($$$$) { #{{{
|
||||||
}# }}}
|
}# }}}
|
||||||
|
|
||||||
sub do_rename ($$$) { #{{{
|
sub do_rename ($$$) { #{{{
|
||||||
my $srcfile=shift;
|
my $rename=shift;
|
||||||
my $destfile=shift;
|
my $q=shift;
|
||||||
my $session=shift;
|
my $session=shift;
|
||||||
|
|
||||||
# Actual file rename happens here.
|
# First, check if this rename is allowed.
|
||||||
# First, ensure that the dest directory exists and is ok.
|
check_canrename($rename->{src},
|
||||||
IkiWiki::prep_writefile($destfile, $config{srcdir});
|
$rename->{srcfile},
|
||||||
|
$rename->{dest},
|
||||||
|
$rename->{destfile},
|
||||||
|
$q, $session);
|
||||||
|
|
||||||
|
# Ensure that the dest directory exists and is ok.
|
||||||
|
IkiWiki::prep_writefile($rename->{destfile}, $config{srcdir});
|
||||||
|
|
||||||
if ($config{rcs}) {
|
if ($config{rcs}) {
|
||||||
IkiWiki::rcs_rename($srcfile, $destfile);
|
IkiWiki::rcs_rename($rename->{srcfile}, $rename->{destfile});
|
||||||
IkiWiki::rcs_commit_staged(
|
|
||||||
sprintf(gettext("rename %s to %s"), $srcfile, $destfile),
|
|
||||||
$session->param("name"), $ENV{REMOTE_ADDR});
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (! rename("$config{srcdir}/$srcfile", "$config{srcdir}/$destfile")) {
|
if (! rename($config{srcdir}."/".$rename->{srcfile},
|
||||||
|
$config{srcdir}."/".$rename->{destfile})) {
|
||||||
error("rename: $!");
|
error("rename: $!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} # }}}
|
} # }}}
|
||||||
|
|
||||||
sub fixlinks ($$$) { #{{{
|
sub fixlinks ($$$) { #{{{
|
||||||
my $src=shift;
|
my $rename=shift;
|
||||||
my $dest=shift;
|
|
||||||
my $session=shift;
|
my $session=shift;
|
||||||
|
|
||||||
my @fixedlinks;
|
my @fixedlinks;
|
||||||
|
@ -417,7 +467,7 @@ sub fixlinks ($$$) { #{{{
|
||||||
my $needfix=0;
|
my $needfix=0;
|
||||||
foreach my $link (@{$links{$page}}) {
|
foreach my $link (@{$links{$page}}) {
|
||||||
my $bestlink=bestlink($page, $link);
|
my $bestlink=bestlink($page, $link);
|
||||||
if ($bestlink eq $src) {
|
if ($bestlink eq $rename->{src}) {
|
||||||
$needfix=1;
|
$needfix=1;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
|
@ -425,14 +475,14 @@ sub fixlinks ($$$) { #{{{
|
||||||
if ($needfix) {
|
if ($needfix) {
|
||||||
my $file=$pagesources{$page};
|
my $file=$pagesources{$page};
|
||||||
my $oldcontent=readfile($config{srcdir}."/".$file);
|
my $oldcontent=readfile($config{srcdir}."/".$file);
|
||||||
my $content=renamepage_hook($page, $src, $dest, $oldcontent);
|
my $content=renamepage_hook($page, $rename->{src}, $rename->{dest}, $oldcontent);
|
||||||
if ($oldcontent ne $content) {
|
if ($oldcontent ne $content) {
|
||||||
my $token=IkiWiki::rcs_prepedit($file);
|
my $token=IkiWiki::rcs_prepedit($file);
|
||||||
eval { writefile($file, $config{srcdir}, $content) };
|
eval { writefile($file, $config{srcdir}, $content) };
|
||||||
next if $@;
|
next if $@;
|
||||||
my $conflict=IkiWiki::rcs_commit(
|
my $conflict=IkiWiki::rcs_commit(
|
||||||
$file,
|
$file,
|
||||||
sprintf(gettext("update for rename of %s to %s"), $src, $dest),
|
sprintf(gettext("update for rename of %s to %s"), $rename->{srcfile}, $rename->{destfile}),
|
||||||
$token,
|
$token,
|
||||||
$session->param("name"),
|
$session->param("name"),
|
||||||
$ENV{REMOTE_ADDR}
|
$ENV{REMOTE_ADDR}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
<TMPL_IF ERROR>
|
||||||
|
<p>
|
||||||
|
<b>Failed to rename <TMPL_VAR SRC> to <TMPL_VAR DEST>: </b>
|
||||||
|
<TMPL_VAR ERROR>
|
||||||
|
</p>
|
||||||
|
<TMPL_ELSE>
|
||||||
<p>
|
<p>
|
||||||
<b>Successfully renamed <TMPL_VAR SRC> to <TMPL_VAR DEST>.</b>
|
<b>Successfully renamed <TMPL_VAR SRC> to <TMPL_VAR DEST>.</b>
|
||||||
</p>
|
</p>
|
||||||
|
@ -14,8 +20,7 @@ The following pages still link to <TMPL_VAR SRC>:
|
||||||
<ul>
|
<ul>
|
||||||
<TMPL_LOOP NAME=BROKENLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
|
<TMPL_LOOP NAME=BROKENLINKS><li><TMPL_VAR PAGE></li></TMPL_LOOP>
|
||||||
</ul>
|
</ul>
|
||||||
<TMPL_ELSE>
|
|
||||||
No pages have broken links to <TMPL_VAR SRC>.
|
|
||||||
</TMPL_IF>
|
</TMPL_IF>
|
||||||
</TMPL_IF>
|
</TMPL_IF>
|
||||||
</p>
|
</p>
|
||||||
|
</TMPL_IF>
|
||||||
|
|
Loading…
Reference in New Issue