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 --- doc/plugins/write.mdwn | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'doc/plugins') 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 -- 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/plugins') 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 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/plugins') 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 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/plugins') 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 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/plugins') 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