From 51badc960d933f6d0670cc76390c332a31b35d63 Mon Sep 17 00:00:00 2001 From: intrigeri Date: Tue, 27 Jan 2009 16:57:52 +0100 Subject: rename hook: instead of modifying the passed-by-name array, return a copy This is intended to solve Joey's concerns expressed on http://ikiwiki.info/todo/need_global_renamepage_hook/, i.e. the need to make it possible to use this hook from external plugins. A plugin using this hook still can add/modify/remove elements of the @torename array. Signed-off-by: intrigeri --- IkiWiki/Plugin/po.pm | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'IkiWiki/Plugin/po.pm') diff --git a/IkiWiki/Plugin/po.pm b/IkiWiki/Plugin/po.pm index 6f716a91f..6c6bb2cd1 100644 --- a/IkiWiki/Plugin/po.pm +++ b/IkiWiki/Plugin/po.pm @@ -329,29 +329,30 @@ sub postscan (@) { } # Add the renamed page translations to the list of to-be-renamed pages. -sub renamepages($$$) { - my ($torename, $cgi, $session) = (shift, shift, shift); +sub renamepages(@) { + my %params = @_; - # copy the initial array, so that we can iterate on it AND - # modify it at the same time, without iterating on the items we - # pushed on it ourselves - my @torename=@{$torename}; + my @torename = @{$params{torename}}; + my $session = $params{session}; # Save the page(s) the user asked to rename, so that our # canrename hook can tell the difference between: # - a translation being renamed as a consequence of its master page # being renamed # - a user trying to directly rename a translation - # This is why this hook has to be run first, before @torename is modified - # by other plugins. - $session->param(po_orig_torename => [ @torename ]); + # This is why this hook has to be run first, before the list of pages + # to rename is modified by other plugins. + $session->param(po_orig_torename => \@torename); IkiWiki::cgi_savesession($session); + my @ret=@torename; + # iterate on @torename and push onto @ret, so that we don't iterate + # on the items we added ourselves foreach my $rename (@torename) { next unless istranslatable($rename->{src}); my %otherpages=%{otherlanguages($rename->{src})}; while (my ($lang, $otherpage) = each %otherpages) { - push @{$torename}, { + push @ret, { src => $otherpage, srcfile => $pagesources{$otherpage}, dest => otherlanguage($rename->{dest}, $lang), @@ -360,6 +361,7 @@ sub renamepages($$$) { }; } } + return @ret; } sub mydelete(@) { -- cgit v1.2.3