Fix web revert of a file deletion.
authorJoey Hess <joey@kitenet.net>
Mon, 5 Sep 2011 18:51:49 +0000 (14:51 -0400)
committerJoey Hess <joey@kitenet.net>
Mon, 5 Sep 2011 18:51:49 +0000 (14:51 -0400)
When reverting, an add is a remove, and a remove is an add.

IkiWiki/Plugin/git.pm
debian/changelog
doc/bugs/cannot_revert_page_deletion.mdwn

index cf7fbe9b7c43ee53180612d0411e6202074fb9e0..3117e42914d5f8b8f4f5d49ec3e3f0b5865d1891 100644 (file)
@@ -762,6 +762,7 @@ sub git_find_root {
 }
 
 sub git_parse_changes {
+       my $reverted = shift;
        my @changes = @_;
 
        my ($subdir, $rootdir) = git_find_root();
@@ -782,11 +783,11 @@ sub git_parse_changes {
                                $mode=$detail->{'mode_to'};
                        }
                        elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
-                               $action="add";
+                               $action= $reverted ? "remove" : "add";
                                $mode=$detail->{'mode_to'};
                        }
                        elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
-                               $action="remove";
+                               $action= $reverted ? "add" : "remove";
                                $mode=$detail->{'mode_from'};
                        }
                        else {
@@ -845,7 +846,7 @@ sub rcs_receive () {
                # it and only see changes in it.)
                # The pre-receive hook already puts us in the right place.
                $git_dir=".";
-               push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev));
+               push @rets, git_parse_changes(0, git_commit_info($oldrev."..".$newrev));
                $git_dir=undef;
        }
 
@@ -872,7 +873,7 @@ sub rcs_preprevert ($) {
                error gettext("you are not allowed to revert a merge");
        }
 
-       my @ret=git_parse_changes(@commits);
+       my @ret=git_parse_changes(1, @commits);
 
        $git_dir=undef;
        return @ret;
index 5ed868e1d2197453df9f995c83f564f6b37ce8e5..0e82db1ba062122d65e966d461f7b688a0ab4be9 100644 (file)
@@ -29,6 +29,7 @@ ikiwiki (3.20110716) UNRELEASED; urgency=low
     is not installed. Closes: #637606
   * Promote RPC::XML to a Recommends, since it's used by auto-blog.setup.
     Closes: #637603
+  * Fix web revert of a file deletion.
 
  -- Joey Hess <joeyh@debian.org>  Tue, 19 Jul 2011 11:22:52 -0400
 
index 5292906a192e8fc781d30b555de1210859dede07..651b4d0ece2af1475b8192af9e78fb7aba10e3c3 100644 (file)
@@ -1,2 +1,10 @@
 After deleting a page with the "remove" button, it seems that the page deletion cannot be reverted using the "revert" icon in [[RecentChanges]]. 
 It ironically says that "Error: ?$pagename does not exist". See [[http://ikiwiki.info/ikiwiki.cgi?rev=860c2c84d98ea0a38a4f91dacef6d4e09f6e6c2e&do=revert]]. [[JeanPrivat]]
+
+> And it only gets that far if the remove plugin is enabled. Otherwise it
+> complains that you cannot change $pagename.
+> 
+> The root bug is that git's `rcs_preprevert` creates a structure that
+> shows the change that was made (which includes a file deletion),
+> not the change that would be made if it was reverted (which includes a
+> file addition). [[Fixed|done]]. --[[Joey]]