rename hook: instead of modifying the passed-by-name array, return a copy
authorintrigeri <intrigeri@boum.org>
Tue, 27 Jan 2009 15:57:52 +0000 (16:57 +0100)
committerintrigeri <intrigeri@boum.org>
Tue, 27 Jan 2009 16:08:55 +0000 (17:08 +0100)
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 <intrigeri@boum.org>
IkiWiki/Plugin/po.pm
IkiWiki/Plugin/rename.pm
IkiWiki/Plugin/skeleton.pm.example
doc/plugins/write.mdwn

index 6f716a91f2a741253141b998e30aed74eb3fc83b..6c6bb2cd140af1d52fd280cdc43e5da217e86ebb 100644 (file)
@@ -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(@) {
index 90af1b4a985e5f94bd724ac88064ccf53d7d4919..f39c93332e311fd3cc452e06525c2d4827eef984 100644 (file)
@@ -312,7 +312,13 @@ sub sessioncgi ($$) {
                                required => 1,
                        };
 
-                       IkiWiki::run_hooks(rename => sub { shift->(\@torename, $q, $session); });
+                       IkiWiki::run_hooks(rename => sub {
+                               @torename=shift->(
+                                       torename => \@torename,
+                                       cgi => $q,
+                                       session => $session
+                               );
+                       });
 
                        # See if any subpages need to be renamed.
                        if ($q->param("subpages") && $src ne $dest) {
index 62eeaf51db20b0acea8a31926ef391ebbc28d834..573510191c5c92507fbf0dc68615f9246f3b3437 100644 (file)
@@ -229,8 +229,8 @@ sub renamepage (@) {
        debug("skeleton plugin running in renamepage");
 }
 
-sub rename ($$$) {
-       my ($torename, $cgi, $session) = (shift, shift, shift);
+sub rename (@) {
+       my %params=@_;
        
        debug("skeleton plugin running in rename");
 }
index 98372b33de3fb14857fc97c5a212ed000f0eac55..0c5ad4540b70cc96742fa56ea086ef671491b0da 100644 (file)
@@ -414,16 +414,16 @@ new page.
 
 ### rename
 
-       hook(type => "rename", id => "foo", call => \&renamepages);
+       hook(type => "rename", id => "foo", call => \&rename);
 
 When a page or set of pages is renamed, the referenced function is
-called, and is passed:
+called, and is passed named parameters:
 
-* a reference to an array of hashes with keys: `src`, `srcfile`,
-  `dest`, `destfile`, `required`. Such a hook function can modify
-  the array.
-* a CGI object
-* a session object
+* `torename`: a reference to an array of hashes with keys: `src`, `srcfile`,
+  `dest`, `destfile`, `required`. Such a hook function can either return the
+  array content unchanged, or modify it and return the modified version.
+* `cgi`: a CGI object
+* `session`: a session object.
 
 ### getsetup