From acecbad0ff4a8c441da520522710dd5357ab31e0 Mon Sep 17 00:00:00 2001 From: Peter Gammie Date: Wed, 29 Sep 2010 15:14:19 +1000 Subject: [PATCH] First cut at the revert plugin. --- IkiWiki.pm | 12 ++++++ IkiWiki/Plugin/git.pm | 35 +++++++++++++++++ IkiWiki/Plugin/recentchanges.pm | 66 ++++++++++++++++++++++++++++++++ doc/templates.mdwn | 2 +- doc/wikiicons/revert.png | Bin 0 -> 840 bytes templates/revert.tmpl | 13 +++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 doc/wikiicons/revert.png create mode 100644 templates/revert.tmpl diff --git a/IkiWiki.pm b/IkiWiki.pm index 66ae86809..e2b2ceda3 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -1941,6 +1941,18 @@ 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 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 fd57ce1e4..a68bd0b0e 100644 --- a/IkiWiki/Plugin/git.pm +++ b/IkiWiki/Plugin/git.pm @@ -27,6 +27,10 @@ sub import { hook(type => "rcs", id => "rcs_getctime", call => \&rcs_getctime); hook(type => "rcs", id => "rcs_getmtime", call => \&rcs_getmtime); 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); + hook(type => "rcs", id => "rcs_revert", call => \&rcs_revert); } sub checkconfig () { @@ -811,4 +815,35 @@ sub rcs_receive () { return reverse @rets; } +sub rcs_preprevert ($) { + # FIXME implement +} + +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}; + + 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."; + } +} + +sub rcs_showpatch ($) { + # Show the patch with the given revision id. + my ($rev) = @_; + + # FIXME check + my @r = run_or_die('git', 'show', $rev); + + return join "\n", @r; +} + 1 diff --git a/IkiWiki/Plugin/recentchanges.pm b/IkiWiki/Plugin/recentchanges.pm index 758b98348..2a78566e1 100644 --- a/IkiWiki/Plugin/recentchanges.pm +++ b/IkiWiki/Plugin/recentchanges.pm @@ -60,6 +60,72 @@ sub refresh ($) { } } +sub confirmation_form { + my ($q, $session, $rev) = @_; + + eval q{use CGI::FormBuilder}; + error($@) if $@; + my $f = CGI::FormBuilder->new( + name => "revert", + header => 0, + charset => "utf-8", + method => 'POST', + javascript => 0, + params => $q, + action => $config{cgiurl}, + stylesheet => 1, + template => { template('revert.tmpl') }, + ); + + $f->field(name => "sid", type => "hidden", value => $session->id, + force => 1); + $f->field(name => "do", type => "hidden", value => "revert", force => 1); + $f->field(name => "rev", type => "hidden", value => $rev, force => 1); + + return $f, ["Revert", "Cancel"]; +} + +sub sessioncgi ($$) { + my ($q, $session) = @_; + my $do = $q->param('do'); + my $rev = $q->param('rev'); + + return unless $do eq 'revert' && $rev; + + # FIXME rcs_preprevert ?? + IkiWiki::check_canedit('FIXME', $q, $session); + + my ($form, $buttons) = confirmation_form($q, $session); + IkiWiki::decode_form_utf8($form); + + 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); + IkiWiki::enable_commit_hook(); + + if($r) { + die "FIXME revert '$rev' failed."; + } else { + IkiWiki::refresh(); + IkiWiki::saveindex(); + # FIXME indicate success. + } + } else { + $form->title(sprintf(gettext("confirm reversion of %s"), $rev)); + my $patch_contents = IkiWiki::rcs_showpatch($rev); + $form->tmpl_param(patch_contents => encode_entities($patch_contents)); + IkiWiki::showform($form, $buttons, $session, $q); + exit 0; + } + + IkiWiki::redirect($q, urlto($config{recentchangespage}, '')); + exit 0; +} + # Enable the recentchanges link. sub pagetemplate (@) { my %params=@_; 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 0000000000000000000000000000000000000000..9036046e9ba678a470602caf4fef6e9f1f88dade GIT binary patch literal 840 zcmV-O1GoH%P)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2^mP$3M| z6qIAsYv2Nn45oyzYergAh!X^mkbnd+09?gri1vNQ)TH_RMgQM_{V07j)!`EbAgNS{ z6d?3bZ^H2b6JK{+s~8PmZU43$2E{_{@gH|SPqE%>`6dZNKpBfkRpASnU@8aNwq0sn zw>L2j&nNKDs{tkr@7++2MfQtF53V0-wxCW{y%hWui#RZE&52c;_a>*~Wk2j;+j;Y9 zr0*6L`V@OyCvD-%Ee^nhHzJLsrzJTO*_PR`V3!d)PVw3OonL;z{6;MZZ~gk`!ubns z_x7E+(!-dQc09?f)W+SXm#o?`wHY_MhD&dse6zwlwJ}#ObD@V>ihuI#c`lKe(!xqS zqglEG)G*0v__VjDti?*2>A7qM96Ez;VEg8_5JAnf%EdvpXzRty)aG*+@`2GZSU{y> zjTZZ5%`17?#jE#~1|Jp%{tX23`L()*08phdbKRDF$DZ3m#jvg(ikUF7xsrz~-FJ+p znUtJ#x$CA@hqMLmIB7)6;cmC{`i*(5ZF+Xf>jK^ke9&Ukq>|>{)13bgw6EE7C+V8`nH9m^XT5-OM$LkXBh>Wmmi zx6WESKYg$J^kmi6-N9*@@v;AY`)+;f!A(o8s2YyFg$NLX93N0XC66MqW9q#7lFi-! zS$mhY{P>=W4@ZeyBF7yfIYB%MiZ+Rm0vj?W9+4Y|BUStI&%e)Ew&BPRzf_1`zc0DO zeTu4~@LZyZND##Yk7&$`1aTsVyW>Ayy-G0&B2I3B4_ArGL_SdzQ+XmJK_3AvXOTWR SZbnrA0000 + + + +
+ + +
+
+ + +
+ -- 2.26.2