From 18346994ca67e487a66d6b807bf596000d8dbfde Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Sat, 2 Jul 2011 13:46:56 +0000 Subject: [PATCH] Moved action=rollback to an Action subclass --- includes/Article.php | 93 ++------------------- includes/AutoLoader.php | 1 + includes/DefaultSettings.php | 1 + includes/Wiki.php | 1 - includes/WikiPage.php | 2 +- includes/actions/RollbackAction.php | 122 ++++++++++++++++++++++++++++ 6 files changed, 132 insertions(+), 88 deletions(-) create mode 100644 includes/actions/RollbackAction.php diff --git a/includes/Article.php b/includes/Article.php index a1639119c3..8f141e663b 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -1228,6 +1228,13 @@ class Article extends Page { Action::factory( 'revert', $this )->show(); } + /** + * User interface for rollback operations + */ + public function rollback() { + Action::factory( 'rollback', $this )->show(); + } + /** * Output a redirect back to the article. * This is typically used after an edit. @@ -1615,92 +1622,6 @@ class Article extends Page { } } - /** - * User interface for rollback operations - */ - public function rollback() { - global $wgUser, $wgOut, $wgRequest; - - $details = null; - - $result = $this->mPage->doRollback( - $wgRequest->getVal( 'from' ), - $wgRequest->getText( 'summary' ), - $wgRequest->getVal( 'token' ), - $wgRequest->getBool( 'bot' ), - $details - ); - - if ( in_array( array( 'actionthrottledtext' ), $result ) ) { - $wgOut->rateLimited(); - return; - } - - if ( isset( $result[0][0] ) && ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' ) ) { - $wgOut->setPageTitle( wfMsg( 'rollbackfailed' ) ); - $errArray = $result[0]; - $errMsg = array_shift( $errArray ); - $wgOut->addWikiMsgArray( $errMsg, $errArray ); - - if ( isset( $details['current'] ) ) { - $current = $details['current']; - - if ( $current->getComment() != '' ) { - $wgOut->addWikiMsgArray( 'editcomment', array( - Linker::formatComment( $current->getComment() ) ), array( 'replaceafter' ) ); - } - } - - return; - } - - # Display permissions errors before read-only message -- there's no - # point in misleading the user into thinking the inability to rollback - # is only temporary. - if ( !empty( $result ) && $result !== array( array( 'readonlytext' ) ) ) { - # array_diff is completely broken for arrays of arrays, sigh. - # Remove any 'readonlytext' error manually. - $out = array(); - foreach ( $result as $error ) { - if ( $error != array( 'readonlytext' ) ) { - $out [] = $error; - } - } - $wgOut->showPermissionsErrorPage( $out ); - - return; - } - - if ( $result == array( array( 'readonlytext' ) ) ) { - $wgOut->readOnlyPage(); - - return; - } - - $current = $details['current']; - $target = $details['target']; - $newId = $details['newid']; - $wgOut->setPageTitle( wfMsg( 'actioncomplete' ) ); - $wgOut->setRobotPolicy( 'noindex,nofollow' ); - - if ( $current->getUserText() === '' ) { - $old = wfMsg( 'rev-deleted-user' ); - } else { - $old = Linker::userLink( $current->getUser(), $current->getUserText() ) - . Linker::userToolLinks( $current->getUser(), $current->getUserText() ); - } - - $new = Linker::userLink( $target->getUser(), $target->getUserText() ) - . Linker::userToolLinks( $target->getUser(), $target->getUserText() ); - $wgOut->addHTML( wfMsgExt( 'rollback-success', array( 'parse', 'replaceafter' ), $old, $new ) ); - $wgOut->returnToMain( false, $this->getTitle() ); - - if ( !$wgRequest->getBool( 'hidediff', false ) && !$wgUser->getBoolOption( 'norollbackdiff', false ) ) { - $de = new DifferenceEngine( $this->getTitle(), $current->getId(), $newId, false, true ); - $de->showDiff( '', '' ); - } - } - /** * Generate the navigation links when browsing through an article revisions * It shows the information as: diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index b81d976ba9..69f61256be 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -264,6 +264,7 @@ $wgAutoloadLocalClasses = array( 'RevertAction' => 'includes/actions/RevertAction.php', 'RevertFileAction' => 'includes/actions/RevertAction.php', 'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php', + 'RollbackAction' => 'includes/actions/RollbackAction.php', 'UnwatchAction' => 'includes/actions/WatchAction.php', 'WatchAction' => 'includes/actions/WatchAction.php', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 35d1d01601..13e0122e21 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -5063,6 +5063,7 @@ $wgActions = array( 'purge' => true, 'revert' => true, 'revisiondelete' => true, + 'rollback' => true, 'unwatch' => true, 'watch' => true, ); diff --git a/includes/Wiki.php b/includes/Wiki.php index 251d1db5ad..7440d5f2f3 100644 --- a/includes/Wiki.php +++ b/includes/Wiki.php @@ -464,7 +464,6 @@ class MediaWiki { wfProfileOut( __METHOD__ . '-raw' ); break; case 'delete': - case 'rollback': case 'protect': case 'unprotect': case 'render': diff --git a/includes/WikiPage.php b/includes/WikiPage.php index d1e9b7012e..cf2c58ae59 100644 --- a/includes/WikiPage.php +++ b/includes/WikiPage.php @@ -1719,7 +1719,7 @@ class WikiPage extends Page { return $errors; } - return $this->commitRollback( $user, $fromP, $summary, $bot, $resultDetails ); + return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user ); } /** diff --git a/includes/actions/RollbackAction.php b/includes/actions/RollbackAction.php new file mode 100644 index 0000000000..485177c1b6 --- /dev/null +++ b/includes/actions/RollbackAction.php @@ -0,0 +1,122 @@ +getRequest(); + + $result = $this->page->doRollback( + $request->getVal( 'from' ), + $request->getText( 'summary' ), + $request->getVal( 'token' ), + $request->getBool( 'bot' ), + $details, + $this->getUser() + ); + + if ( in_array( array( 'actionthrottledtext' ), $result ) ) { + throw new ThrottledError; + } + + if ( isset( $result[0][0] ) && ( $result[0][0] == 'alreadyrolled' || $result[0][0] == 'cantrollback' ) ) { + $this->getOutput()->setPageTitle( wfMsg( 'rollbackfailed' ) ); + $errArray = $result[0]; + $errMsg = array_shift( $errArray ); + $this->getOutput()->addWikiMsgArray( $errMsg, $errArray ); + + if ( isset( $details['current'] ) ) { + $current = $details['current']; + + if ( $current->getComment() != '' ) { + $this->getOutput()->addWikiMsgArray( 'editcomment', array( + Linker::formatComment( $current->getComment() ) ), array( 'replaceafter' ) ); + } + } + + return; + } + + # Display permissions errors before read-only message -- there's no + # point in misleading the user into thinking the inability to rollback + # is only temporary. + if ( !empty( $result ) && $result !== array( array( 'readonlytext' ) ) ) { + # array_diff is completely broken for arrays of arrays, sigh. + # Remove any 'readonlytext' error manually. + $out = array(); + foreach ( $result as $error ) { + if ( $error != array( 'readonlytext' ) ) { + $out [] = $error; + } + } + $this->getOutput()->showPermissionsErrorPage( $out ); + + return; + } + + if ( $result == array( array( 'readonlytext' ) ) ) { + throw new ReadOnlyError; + } + + $current = $details['current']; + $target = $details['target']; + $newId = $details['newid']; + $this->getOutput()->setPageTitle( wfMsg( 'actioncomplete' ) ); + $this->getOutput()->setRobotPolicy( 'noindex,nofollow' ); + + if ( $current->getUserText() === '' ) { + $old = wfMsg( 'rev-deleted-user' ); + } else { + $old = Linker::userLink( $current->getUser(), $current->getUserText() ) + . Linker::userToolLinks( $current->getUser(), $current->getUserText() ); + } + + $new = Linker::userLink( $target->getUser(), $target->getUserText() ) + . Linker::userToolLinks( $target->getUser(), $target->getUserText() ); + $this->getOutput()->addHTML( wfMsgExt( 'rollback-success', array( 'parse', 'replaceafter' ), $old, $new ) ); + $this->getOutput()->returnToMain( false, $this->getTitle() ); + + if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) { + $de = new DifferenceEngine( $this->getTitle(), $current->getId(), $newId, false, true ); + $de->showDiff( '', '' ); + } + } + + protected function getDescription() { + return ''; + } +} -- 2.20.1