From acecbad0ff4a8c441da520522710dd5357ab31e0 Mon Sep 17 00:00:00 2001 From: Peter Gammie Date: Wed, 29 Sep 2010 15:14:19 +1000 Subject: First cut at the revert plugin. --- doc/templates.mdwn | 2 +- doc/wikiicons/revert.png | Bin 0 -> 840 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/wikiicons/revert.png (limited to 'doc') diff --git a/doc/templates.mdwn b/doc/templates.mdwn index bfb6a439a..4fd2bf501 100644 --- a/doc/templates.mdwn +++ b/doc/templates.mdwn @@ -74,7 +74,7 @@ html out of ikiwiki and in the templates. * `editpage.tmpl`, `editconflict.tmpl`, `editcreationconflict.tmpl`, `editfailedsave.tmpl`, `editpagegone.tmpl`, `pocreatepage.tmpl`, `editcomment.tmpl` `commentmoderation.tmpl`, `renamesummary.tmpl`, - `passwordmail.tmpl`, `openid-selector.tmpl` - Parts of ikiwiki's user + `passwordmail.tmpl`, `openid-selector.tmpl`, `revert.tmpl` - Parts of ikiwiki's user interface; do not normally need to be customised. [[!meta robots="noindex, follow"]] diff --git a/doc/wikiicons/revert.png b/doc/wikiicons/revert.png new file mode 100644 index 000000000..9036046e9 Binary files /dev/null and b/doc/wikiicons/revert.png differ -- cgit v1.2.3 From 3f3aab3793fb471f8a99ed12df1bbad7abdc3455 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 4 Oct 2010 16:22:50 -0400 Subject: document new rcs reversion support functions --- IkiWiki/Plugin/git.pm | 175 ++++++++++++++++++++++---------------------- doc/plugins/write.mdwn | 33 ++++++++- doc/todo/web_reversion.mdwn | 6 ++ 3 files changed, 123 insertions(+), 91 deletions(-) (limited to 'doc') diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index a0f9b15a7..33ec00d8a 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -748,73 +748,72 @@ sub git_find_root { } 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 () { @@ -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; - push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev)); + push @rets, git_parse_changes(git_commit_info($oldrev."..".$newrev)); $no_chdir=0; } @@ -840,31 +839,31 @@ sub rcs_receive () { } 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 (@) { - # 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 (@) { diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index d5bd1dd76..1bd3b0f87 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -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, -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 @@ -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. +#### `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 diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 34947b710..9e5880558 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -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]] + +>>> 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`? +>>> * -- cgit v1.2.3 From 237ea79d715fbba5c1be0b73fbe008b3221975fb Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 6 Oct 2010 14:39:10 -0400 Subject: remove rcs_showpatch --- IkiWiki.pm | 4 ---- IkiWiki/Plugin/git.pm | 9 --------- IkiWiki/Plugin/recentchanges.pm | 2 +- doc/plugins/write.mdwn | 6 ------ doc/todo/web_reversion.mdwn | 4 ---- 5 files changed, 1 insertion(+), 24 deletions(-) (limited to 'doc') diff --git a/IkiWiki.pm b/IkiWiki.pm index 466907c9d..269647eb4 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1949,10 +1949,6 @@ sub rcs_revert (@) { $hooks{rcs}{rcs_revert}{call}->(@_); } -sub rcs_showpatch (@) { - $hooks{rcs}{rcs_showpatch}{call}->(@_); -} - sub add_depends ($$;$) { my $page=shift; my $pagespec=shift; diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 5922494bc..3ccaa446a 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -29,7 +29,6 @@ sub import { hook(type => "rcs", id => "rcs_receive", call => \&rcs_receive); hook(type => "rcs", id => "rcs_preprevert", call => \&rcs_preprevert); hook(type => "rcs", id => "rcs_revert", call => \&rcs_revert); - hook(type => "rcs", id => "rcs_showpatch", call => \&rcs_showpatch); } sub checkconfig () { @@ -865,12 +864,4 @@ sub rcs_revert (@) { } } -sub rcs_showpatch (@) { - # Show the patch with the given revision id. - my %params = @_; - my $rev = $params{rev}; - - return join "\n", run_or_die('git', 'show', $rev); -} - 1 diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm index 7e71d4fc3..948bb1366 100644 --- a/IkiWiki/Plugin/recentchanges.pm +++ b/IkiWiki/Plugin/recentchanges.pm @@ -117,7 +117,7 @@ sub sessioncgi ($$) { } else { $form->title(sprintf(gettext("confirm reversion of %s"), $rev)); - my $patch_contents = IkiWiki::rcs_showpatch(rev => $rev); + my $patch_contents = IkiWiki::rcs_diff($rev); $form->tmpl_param(patch_contents => encode_entities($patch_contents)); $form->field(name => "rev", type => "hidden", value => $rev, force => 1); IkiWiki::showform($form, $buttons, $session, $q); diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 1bd3b0f87..3eade34ee 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -1212,12 +1212,6 @@ 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 diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 33fa79aad..7cb412f79 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -55,7 +55,6 @@ Peter Gammie has done an initial implementation of the above. > (The data from `rcs_preprevert` could also be used for a confirmation > prompt -- it doesn't currently include enough info for diffs, but at > least could have a list of changed files.) ->> I added `rcs_showpatch` which simply yields the output of `git show `. -- [[peteg]] > > Note that it's possible for a git repo to have commits that modify wiki > files in a subdir, and code files elsewhere. `rcs_preprevert` should @@ -71,9 +70,6 @@ Peter Gammie has done an initial implementation of the above. >>> (and fixed all the indention..). Issues I noticed but have not gotten >>> to: --[[Joey]] >>>> Please change the git pointer above, then. I will work on your branch. -- [[peteg]] ->>> ->>> * `rcs_diff` already exists; why add `rcs_showpatch`? ->>>> If `rcs_diff` is intended for human consumption, by all means we can use that. -- [[peteg]] >>> * Would it be better for `rcs_revert` to not commit, and >>> `rcs_commit_staged` to then be used? This would work for git, but -- cgit v1.2.3 From 7988a5aee3be9fe82da1d47d2a72c95eabc7bb6e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 6 Oct 2010 14:55:08 -0400 Subject: revert html tweaking --- doc/style.css | 3 ++- templates/change.tmpl | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'doc') diff --git a/doc/style.css b/doc/style.css index fa4b2a38a..aa27d8866 100644 --- a/doc/style.css +++ b/doc/style.css @@ -172,7 +172,8 @@ div.recentchanges { width: 35%; font-size: small; } -.recentchanges .pagelinks { +.recentchanges .pagelinks, +.recentchanges .revert { float: right; margin: 0; width: 60%; diff --git a/templates/change.tmpl b/templates/change.tmpl index 9cf40777b..4525402a7 100644 --- a/templates/change.tmpl +++ b/templates/change.tmpl @@ -10,10 +10,8 @@
Changed pages:
-[[diff|wikiicons/diff.png]] - - - +[[diff|wikiicons/diff.png]] +
Changed by:
@@ -29,8 +27,10 @@
Date:

-[[revert|wikiicons/revert.png]] + +[[revert|wikiicons/revert.png]] +
-- cgit v1.2.3 From 238e8b95a5b084e7131d3314b78419b9404cba4c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 6 Oct 2010 15:08:12 -0400 Subject: convert rcs_revert to only stage the reversion --- IkiWiki.pm | 4 ++-- IkiWiki/Plugin/git.pm | 13 ++++--------- IkiWiki/Plugin/recentchanges.pm | 13 +++++++++---- doc/plugins/write.mdwn | 10 ++++------ doc/todo/web_reversion.mdwn | 4 ---- 5 files changed, 19 insertions(+), 25 deletions(-) (limited to 'doc') diff --git a/IkiWiki.pm b/IkiWiki.pm index 269647eb4..faf4af5c7 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1941,11 +1941,11 @@ sub rcs_receive () { $hooks{rcs}{rcs_receive}{call}->(); } -sub rcs_preprevert (@) { +sub rcs_preprevert ($) { $hooks{rcs}{rcs_preprevert}{call}->(@_); } -sub rcs_revert (@) { +sub rcs_revert ($) { $hooks{rcs}{rcs_revert}{call}->(@_); } diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 3ccaa446a..996ab6fba 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -846,19 +846,14 @@ sub rcs_preprevert (@) { [git_parse_changes(git_commit_info($rev, 1))]); } -sub rcs_revert (@) { - # Try to revert the given patch; returns undef on _success_. - my %params = @_; - my $rev = $params{rev}; +sub rcs_revert ($) { + # Try to revert the given rev; returns undef on _success_. + my $rev = $shift; 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), @_); + return undef; } 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); } diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm index 439241b93..44c981548 100644 --- a/IkiWiki/Plugin/recentchanges.pm +++ b/IkiWiki/Plugin/recentchanges.pm @@ -101,12 +101,17 @@ sub sessioncgi ($$) { if ($form->submitted eq 'Revert' && $form->validate) { IkiWiki::checksessionexpiry($q, $session, $q->param('sid')); IkiWiki::disable_commit_hook(); - my $r = IkiWiki::rcs_revert( - session => $session, - rev => $rev); + my $r = IkiWiki::rcs_revert($rev); + if (! defined $r) { # success + rcs_commit_staged( + message => sprintf(gettext("This reverts commit %s"), $rev), + session => $session, + rev => $rev, + ); + } IkiWiki::enable_commit_hook(); - if ($r) { + if (defined $r) { die "Revert '$rev' failed."; } else { diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 3eade34ee..dbbe83851 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -1201,16 +1201,14 @@ 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(@)` +#### `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. +It should try to revert the specified rev, and leave the reversion staged +so `rcs_commit_staged` will complete it. It should return undef on _success_ +and an error message on failure. ### PageSpec plugins diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 7cb412f79..784b72e05 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -71,10 +71,6 @@ Peter Gammie has done an initial implementation of the above. >>> to: --[[Joey]] >>>> Please change the git pointer above, then. I will work on your branch. -- [[peteg]] ->>> * Would it be better for `rcs_revert` to not commit, and ->>> `rcs_commit_staged` to then be used? This would work for git, but ->>> maybe other RCSs would be problimatic. It would simplifiy the ->>> interface and allow for future mulitple-revert interfaces. >>> * I quite don't understand why one caller of `git_parse_changes` >>> needs it to chdir, and not the other one. It's running >>> in the same git repo either way, and git doesn't need -- cgit v1.2.3 From 594eb32780466e89390bacc61f8c28b1d4ca9f0b Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 17:46:21 -0400 Subject: update for new hooks --- doc/rcs.mdwn | 2 ++ 1 file changed, 2 insertions(+) (limited to 'doc') diff --git a/doc/rcs.mdwn b/doc/rcs.mdwn index 83c6910d0..06af9807c 100644 --- a/doc/rcs.mdwn +++ b/doc/rcs.mdwn @@ -23,6 +23,8 @@ auto.setup |yes |yes |incomplete|yes |incomplete |yes `rcs_diff` |yes |yes |yes |yes |no |yes |yes |yes `rcs_getctime` |fast |slow |slow |slow |slow |slow |slow |slow `rcs_getmtime` |fast |slow |slow |no |no |no |no |no +`rcs_preprevert` |yes |no |no |no |no |no |no |no +`rcs_revert` |yes |no |no |no |no |no |no |no anonymous push |yes |no |no |no |no |no |no |no conflict handling |yes |yes |yes |buggy |yes |yes |yes |yes openid username |yes |no |no |no |no |no |no |no -- cgit v1.2.3 From 84111d96c461a5d31a615ebf64cae751e6fd9aef Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 17:54:12 -0400 Subject: make revert hooks optional I removed the IkiWiki::rcs_ stubs for the revert hooks. Instead recentchanges tests to see if the hooks are available and calls them directly. --- IkiWiki.pm | 8 -------- IkiWiki/Plugin/recentchanges.pm | 9 ++++++--- doc/plugins/write.mdwn | 5 +++-- templates/change.tmpl | 2 ++ 4 files changed, 11 insertions(+), 13 deletions(-) (limited to 'doc') diff --git a/IkiWiki.pm b/IkiWiki.pm index faf4af5c7..1f6d70ba3 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1941,14 +1941,6 @@ sub rcs_receive () { $hooks{rcs}{rcs_receive}{call}->(); } -sub rcs_preprevert ($) { - $hooks{rcs}{rcs_preprevert}{call}->(@_); -} - -sub rcs_revert ($) { - $hooks{rcs}{rcs_revert}{call}->(@_); -} - sub add_depends ($$;$) { my $page=shift; my $pagespec=shift; diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm index 44c981548..a6d7f9fce 100644 --- a/IkiWiki/Plugin/recentchanges.pm +++ b/IkiWiki/Plugin/recentchanges.pm @@ -93,7 +93,8 @@ sub sessioncgi ($$) { return unless $do eq 'revert' && $rev; - IkiWiki::rcs_preprevert(cgi => $q, session => $session, rev => $rev); + $IkiWiki::hooks{rcs}{rcs_preprevert}{call}->( + cgi => $q, session => $session, rev => $rev); my ($form, $buttons) = confirmation_form($q, $session); IkiWiki::decode_form_utf8($form); @@ -101,7 +102,7 @@ sub sessioncgi ($$) { if ($form->submitted eq 'Revert' && $form->validate) { IkiWiki::checksessionexpiry($q, $session, $q->param('sid')); IkiWiki::disable_commit_hook(); - my $r = IkiWiki::rcs_revert($rev); + my $r = $IkiWiki::hooks{rcs}{rcs_revert}{call}->($rev); if (! defined $r) { # success rcs_commit_staged( message => sprintf(gettext("This reverts commit %s"), $rev), @@ -186,7 +187,9 @@ sub store ($$$) { ]; push @{$change->{pages}}, { link => '...' } if $is_excess; - if (length $config{cgiurl}) { + if (length $config{cgiurl} && + exists $IkiWiki::hooks{rcs}{rcs_preprevert} && + exists $IkiWiki::hooks{rcs}{rcs_revert}) { $change->{reverturl} = IkiWiki::cgiurl( do => "revert", rev => $change->{rev} diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index dbbe83851..6b751f0cd 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -1154,8 +1154,6 @@ context, and the whole diff in scalar context. This is used to get the page creation time for a file from the RCS, by looking it up in the history. -It's ok if this is not implemented, and throws an error. - If the RCS cannot determine a ctime for the file, return 0. #### `rcs_getmtime($)` @@ -1210,6 +1208,9 @@ It should try to revert the specified rev, and leave the reversion staged so `rcs_commit_staged` will complete it. It should return undef on _success_ and an error message on failure. +This hook and `rcs_preprevert` are optional, if not implemented, no revert +web interface will be available. + ### PageSpec plugins It's also possible to write plugins that add new functions to diff --git a/templates/change.tmpl b/templates/change.tmpl index 4525402a7..60a9d94b5 100644 --- a/templates/change.tmpl +++ b/templates/change.tmpl @@ -28,9 +28,11 @@
+ [[revert|wikiicons/revert.png]] +
-- cgit v1.2.3 From f5c270b11dbfb2589df21388a07f55002e076d3c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 18:43:15 -0400 Subject: update --- doc/todo/web_reversion.mdwn | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'doc') diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 784b72e05..4335b3fbf 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -62,6 +62,8 @@ Peter Gammie has done an initial implementation of the above. >> Taken care of by refactoring `rcs_receive` in `git.pm` >> I've tested it lightly in my single-user setup. It's a little nasty that the `attachment` plugin >> gets used to check whether attachments are allowed -- there really should be a hook for that. +>>> I agree, but have not figured out a way to make a hook work yet. +>>> --[[Joey]] >> >> Please look it over and tell me what else needs fixing... -- [[peteg]] @@ -76,8 +78,3 @@ Peter Gammie has done an initial implementation of the above. >>> in the same git repo either way, and git doesn't need >>> `git show` to run in a subdir at all.. >>>> I was aping (preserving) what was already there. I don't understand what you say about `git show` - it must run under $srcdir, surely? And empirically the CGI process wasn't in the right place. By all means simplify that. -- [[peteg]] - ->>> * Probably needs to untaint the revs passed in. ->>> * Seems backwards for `rcs_preprevert` to import and ->>> use `IkiWiki::Receive`. ->>>> Indeed. This is saying that the checking code in IkiWiki::Receive is in the wrong place. I think it would be better to set up some general hooks and shuffle it into a plugin, for then other plugins that maintain special files in the repo can have a say about validity. -- [[peteg]] -- cgit v1.2.3 From e7d6dcfed618c57c775478c95b77a15097142e6e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 18:46:30 -0400 Subject: remove todo item I understand the need to avoid chdir when running git_parse_changes for receive now. At that point, the changes have not been pushed to the srcdir's repo yet. When running the same code for preprevert, chdir to the srcdir is ok, and necessary. --- IkiWiki/Plugin/git.pm | 2 -- doc/todo/web_reversion.mdwn | 9 +-------- 2 files changed, 1 insertion(+), 10 deletions(-) (limited to 'doc') diff --git a/IkiWiki/Plugin/git.pm b/IkiWiki/Plugin/git.pm index 48e71aa9a..47e806209 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -794,8 +794,6 @@ sub git_parse_changes { 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) { diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 4335b3fbf..212fd3a53 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -69,12 +69,5 @@ Peter Gammie has done an initial implementation of the above. >>> I have made my own revert branch and put a few fixes in there >>> [[!template id=gitbranch branch=origin/revert author="[[joey]]"]] ->>> (and fixed all the indention..). Issues I noticed but have not gotten ->>> to: --[[Joey]] +>>> (and fixed all the indention..). --[[Joey]] >>>> Please change the git pointer above, then. I will work on your branch. -- [[peteg]] - ->>> * I quite don't understand why one caller of `git_parse_changes` ->>> needs it to chdir, and not the other one. It's running ->>> in the same git repo either way, and git doesn't need ->>> `git show` to run in a subdir at all.. ->>>> I was aping (preserving) what was already there. I don't understand what you say about `git show` - it must run under $srcdir, surely? And empirically the CGI process wasn't in the right place. By all means simplify that. -- [[peteg]] -- cgit v1.2.3 From 481d8e69dece3f256015af4a5c1da33bf06c7b99 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 19:12:46 -0400 Subject: better revert icon based on one of the smileys, fixed to have transparent bg --- doc/wikiicons/revert.png | Bin 840 -> 397 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'doc') diff --git a/doc/wikiicons/revert.png b/doc/wikiicons/revert.png index 9036046e9..c39e65c33 100644 Binary files a/doc/wikiicons/revert.png and b/doc/wikiicons/revert.png differ -- cgit v1.2.3 From 108d2ac9ae8597ff7e62edd6274fc21d626cdf69 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 19:13:35 -0400 Subject: fix to have transparent background --- doc/smileys/icon-error.png | Bin 159 -> 397 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'doc') diff --git a/doc/smileys/icon-error.png b/doc/smileys/icon-error.png index 53b1055f6..c39e65c33 100644 Binary files a/doc/smileys/icon-error.png and b/doc/smileys/icon-error.png differ -- cgit v1.2.3 From 1820f07f04476e8be290aadeee140cd0a5a0dfed Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 19:24:06 -0400 Subject: revert interface done --- debian/changelog | 5 +++++ doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn | 6 ++++++ doc/todo/web_reversion.mdwn | 2 ++ 3 files changed, 13 insertions(+) (limited to 'doc') diff --git a/debian/changelog b/debian/changelog index 1d12d0558..d1ee4967d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,6 +4,11 @@ ikiwiki (3.20100927) UNRELEASED; urgency=low * htmltidy: Allow configuring tidy parameters in setup file. (W. Trevor King) * Updated French program translation. Closes: #598918 + * git: Added new rcs_revert and rcs_preprevert hooks. + * recentchanges: Add revert buttons to RecentChanges page, and + implement web-based reversion interface. + * Thanks to Peter Gammie for his assistance with the web-based reversion + feature. -- Joey Hess Wed, 29 Sep 2010 11:58:23 -0400 diff --git a/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn b/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn index 4998c1a75..d69b3801b 100644 --- a/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn +++ b/doc/forum/how_do_I_revert_edits_in_the_web_mode__63__.mdwn @@ -38,3 +38,9 @@ Puzzled a bit :-/ Perer Gammie and I are working on reversion over at [[todo/web_reversion]]. --[[Joey]] + +Update: Web reversion is now supported by ikiwiki. Only changes committed +to your wiki after you upgrade to the version of ikiwiki that supports it +will get revert buttons on the RecentChanges page. If you want to force +adding buttons for older changes, you can delete `recentchanges/*._change` +from your srcdir, and rebuild the wiki. --[[Joey]] diff --git a/doc/todo/web_reversion.mdwn b/doc/todo/web_reversion.mdwn index 212fd3a53..9550fa58b 100644 --- a/doc/todo/web_reversion.mdwn +++ b/doc/todo/web_reversion.mdwn @@ -71,3 +71,5 @@ Peter Gammie has done an initial implementation of the above. >>> [[!template id=gitbranch branch=origin/revert author="[[joey]]"]] >>> (and fixed all the indention..). --[[Joey]] >>>> Please change the git pointer above, then. I will work on your branch. -- [[peteg]] + +[[done]] -- cgit v1.2.3 From 2d99fe0d34be35d9e5d556d530f2d8993007cdf6 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 8 Oct 2010 19:27:28 -0400 Subject: note that recentchanges plugin handles reversions --- doc/plugins/recentchanges.mdwn | 2 ++ 1 file changed, 2 insertions(+) (limited to 'doc') diff --git a/doc/plugins/recentchanges.mdwn b/doc/plugins/recentchanges.mdwn index 823f68502..6fff18e8a 100644 --- a/doc/plugins/recentchanges.mdwn +++ b/doc/plugins/recentchanges.mdwn @@ -6,6 +6,8 @@ generates a page describing each recent change made to the wiki. These pages can be joined together with [[inline]] to generate the [[RecentChanges]] page. +This plugin also currently handles web-based reversion of changes. + Typically only the RecentChanges page will use the pages generated by this plugin, but you can use it elsewhere too if you like. It's used like this: -- cgit v1.2.3