]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
document new rcs reversion support functions
authorJoey Hess <joey@kitenet.net>
Mon, 4 Oct 2010 20:22:50 +0000 (16:22 -0400)
committerJoey Hess <joey@kitenet.net>
Mon, 4 Oct 2010 20:22:50 +0000 (16:22 -0400)
IkiWiki/Plugin/git.pm
doc/plugins/write.mdwn
doc/todo/web_reversion.mdwn

index a0f9b15a799af756170675a2bbd59e82af99be85..33ec00d8ad140b1c06024a5432698ce6c3fe00c1 100644 (file)
@@ -748,73 +748,72 @@ sub git_find_root {
 }
 
 sub git_parse_changes {
 }
 
 sub git_parse_changes {
-    my @changes = @_;
-
-    my $subdir = git_find_root();
-    my @rets;
-    foreach my $ci (@changes) {
-        foreach my $detail (@{ $ci->{'details'} }) {
-            my $file = $detail->{'file'};
-
-            # check that all changed files are in the
-            # subdir
-            if (length $subdir &&
-                ! ($file =~ s/^\Q$subdir\E//)) {
-                error sprintf(gettext("you are not allowed to change %s"), $file);
-            }
-
-            my ($action, $mode, $path);
-            if ($detail->{'status'} =~ /^[M]+\d*$/) {
-                $action="change";
-                $mode=$detail->{'mode_to'};
-            }
-            elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
-                $action="add";
-                $mode=$detail->{'mode_to'};
-            }
-            elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
-                $action="remove";
-                $mode=$detail->{'mode_from'};
-            }
-            else {
-                error "unknown status ".$detail->{'status'};
-            }
-
-            # test that the file mode is ok
-            if ($mode !~ /^100[64][64][64]$/) {
-                error sprintf(gettext("you cannot act on a file with mode %s"), $mode);
-            }
-            if ($action eq "change") {
-                if ($detail->{'mode_from'} ne $detail->{'mode_to'}) {
-                    error gettext("you are not allowed to change file modes");
-                }
-            }
-
-            # extract attachment to temp file
-            if (($action eq 'add' || $action eq 'change') &&
-                ! pagetype($file)) {
-
-                eval q{use File::Temp};
-                die $@ if $@;
-                my $fh;
-                ($fh, $path)=File::Temp::tempfile("XXXXXXXXXX", UNLINK => 1);
-                # Ensure we run this in the right place, see comments in rcs_receive.
-                my $cmd = ($no_chdir ? '' : "cd $config{srcdir} && ")
-                    . "git show $detail->{sha1_to} > '$path'";
-                if (system($cmd) != 0) {
-                    error("failed writing temp file '$path'.");
-                }
-            }
-
-            push @rets, {
-                file => $file,
-                action => $action,
-                path => $path,
-            };
-        }
-    }
-
-    return @rets;
+       my @changes = @_;
+
+       my $subdir = git_find_root();
+       my @rets;
+       foreach my $ci (@changes) {
+               foreach my $detail (@{ $ci->{'details'} }) {
+                       my $file = $detail->{'file'};
+
+                       # check that all changed files are in the subdir
+                       if (length $subdir &&
+                           ! ($file =~ s/^\Q$subdir\E//)) {
+                               error sprintf(gettext("you are not allowed to change %s"), $file);
+                       }
+
+                       my ($action, $mode, $path);
+                       if ($detail->{'status'} =~ /^[M]+\d*$/) {
+                               $action="change";
+                               $mode=$detail->{'mode_to'};
+                       }
+                       elsif ($detail->{'status'} =~ /^[AM]+\d*$/) {
+                               $action="add";
+                               $mode=$detail->{'mode_to'};
+                       }
+                       elsif ($detail->{'status'} =~ /^[DAM]+\d*/) {
+                               $action="remove";
+                               $mode=$detail->{'mode_from'};
+                       }
+                       else {
+                               error "unknown status ".$detail->{'status'};
+                       }
+
+                       # test that the file mode is ok
+                       if ($mode !~ /^100[64][64][64]$/) {
+                               error sprintf(gettext("you cannot act on a file with mode %s"), $mode);
+                       }
+                       if ($action eq "change") {
+                               if ($detail->{'mode_from'} ne $detail->{'mode_to'}) {
+                                       error gettext("you are not allowed to change file modes");
+                               }
+                       }
+
+                       # extract attachment to temp file
+                       if (($action eq 'add' || $action eq 'change') &&
+                           ! pagetype($file)) {
+                               eval q{use File::Temp};
+                               die $@ if $@;
+                               my $fh;
+                               ($fh, $path)=File::Temp::tempfile("XXXXXXXXXX", UNLINK => 1);
+                               # Ensure we run this in the right place,
+                               # see comments in rcs_receive.
+                               my $cmd = ($no_chdir ? '' : "cd $config{srcdir} && ")
+                                       . "git show $detail->{sha1_to} > '$path'";
+                               if (system($cmd) != 0) {
+                                       error("failed writing temp file '$path'.");
+                               }
+                       }
+
+                       push @rets, {
+                               file => $file,
+                               action => $action,
+                               path => $path,
+                       };
+               }
+       }
+
+       return @rets;
 }
 
 sub rcs_receive () {
 }
 
 sub rcs_receive () {
@@ -832,7 +831,7 @@ sub rcs_receive () {
                # are in the master git repo, not the srcdir repo.
                # The pre-receive hook already puts us in the right place.
                $no_chdir=1;
                # are in the master git repo, not the srcdir repo.
                # The pre-receive hook already puts us in the right place.
                $no_chdir=1;
-                push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev));
+               push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev));
                $no_chdir=0;
        }
 
                $no_chdir=0;
        }
 
@@ -840,31 +839,31 @@ sub rcs_receive () {
 }
 
 sub rcs_preprevert (@) {
 }
 
 sub rcs_preprevert (@) {
-    # Determine what the effects are of reverting the patch with the
-    # ID given by 'rev'. Returns the same structure as rcs_receive.
-    # Note test_changes expects 'cgi' and 'session' parameters.
-    my %params = @_;
-    my $rev = $params{rev};
+       my %params = @_;
+       my $rev = $params{rev};
 
 
-    require IkiWiki::Receive;
-    IkiWiki::Receive::test_changes(%params, changes => [git_parse_changes(git_commit_info($rev, 1))]);
+       # Note test_changes expects 'cgi' and 'session' parameters.
+       require IkiWiki::Receive;
+       IkiWiki::Receive::test_changes(%params, changes =>
+               [git_parse_changes(git_commit_info($rev, 1))]);
 }
 
 sub rcs_revert (@) {
 }
 
 sub rcs_revert (@) {
-    # Try to revert the given patch; returns undef on _success_.
-    # Same parameters as rcs_commit_staged + 'rev', the patch ID to be
-    # reverted.
-    my %params = @_;
-    my $rev = $params{rev};
+       # Try to revert the given patch; returns undef on _success_.
+       my %params = @_;
+       my $rev = $params{rev};
 
 
-    if(run_or_non('git', 'revert', '--no-commit', $rev)) {
-        debug "Committing revert for patch '$rev'.";
-        rcs_commit_staged(message => "This reverts commit $rev", @_);
-    } else {
-        # No idea what is actually getting reverted, so all we can do is say we failed.
-        run_or_die('git', 'reset', '--hard');
-        return "Failed to revert patch $rev.";
-    }
+       if (run_or_non('git', 'revert', '--no-commit', $rev)) {
+               debug "Committing revert for patch '$rev'.";
+               rcs_commit_staged(message => 
+                       sprintf(gettext("This reverts commit %s"), $rev), @_);
+       }
+       else {
+               # No idea what is actually getting reverted, so all we can
+               # do is say we failed.
+               run_or_die('git', 'reset', '--hard');
+               return sprintf(gettext("Failed to revert commit %s"), $rev);
+       }
 }
 
 sub rcs_showpatch (@) {
 }
 
 sub rcs_showpatch (@) {
index d5bd1dd7648bf867b3dfe1f3a21f71038e40ee83..1bd3b0f871b34855712417906c711e0100cd7473 100644 (file)
@@ -1176,9 +1176,9 @@ sense to implement for all RCSs.
 
 It should examine the incoming changes, and do any sanity 
 checks that are appropriate for the RCS to limit changes to safe file adds,
 
 It should examine the incoming changes, and do any sanity 
 checks that are appropriate for the RCS to limit changes to safe file adds,
-removes, and changes. If something bad is found, it should exit
-nonzero, to abort the push. Otherwise, it should return a list of
-files that were changed, in the form:
+removes, and changes. If something bad is found, it should die, to abort
+the push. Otherwise, it should return a list of files that were changed,
+in the form:
 
        {
                file => # name of file that was changed
 
        {
                file => # name of file that was changed
@@ -1191,6 +1191,33 @@ files that were changed, in the form:
 The list will then be checked to make sure that each change is one that
 is allowed to be made via the web interface.
 
 The list will then be checked to make sure that each change is one that
 is allowed to be made via the web interface.
 
+#### `rcs_preprevert($)`
+
+This is called by the revert web interface. It is passed a RCS-specific
+change ID, and should determine what the effects would be of reverting
+that change, and return the same data structure as `rcs_receive`.
+
+Like `rcs_receive`, it should do whatever sanity checks are appropriate
+for the RCS to limit changes to safe changes, and die if a change would
+be unsafe to revert.
+
+#### `rcs_revert(@)`
+
+This is called by the revert web interface. It is passed a named
+parameter rev that is the RCS-specific change ID to revert.
+
+Addition named parameters: `message`, and `session` (optional).
+
+It should try to revert the specified rev, which includes committing
+the reversion, and returns undef on _success_ and an error message
+on failure.
+
+#### `rcs_showpatch(@)`
+
+This is passed a named parameter rev that is a RCS-specific
+change ID. It should generate a diff-style patch showing the changes
+made and return it.
+
 ### PageSpec plugins
 
 It's also possible to write plugins that add new functions to
 ### PageSpec plugins
 
 It's also possible to write plugins that add new functions to
index 34947b710441b4c279931255c28f2cd9197de39c..9e5880558fc92bcd2232966325ecd4591c7f6647 100644 (file)
@@ -65,3 +65,9 @@ Peter Gammie has done an initial implementation of the above.
 >> gets used to check whether attachments are allowed -- there really should be a hook for that.
 >>
 >> Please look it over and tell me what else needs fixing... -- [[peteg]]
 >> gets used to check whether attachments are allowed -- there really should be a hook for that.
 >>
 >> Please look it over and tell me what else needs fixing... -- [[peteg]]
+
+>>> I have made my own revert branch and put a few fixes in there. Issues
+>>> I noticed but have not gotten to:
+>>>
+>>> * `rcs_diff` already exists; why add `rcs_showpatch`?
+>>> *