* @return mixed string on success, false on failure
*/
public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+ $currentRev = Revision::newFromTitle( $this->mTitle );
+ if ( !$currentRev ) {
+ return false; // no page
+ }
$undo_text = $undo->getText();
$undoafter_text = $undoafter->getText();
- $cur_text = $this->getContent();
+ $cur_text = $currentRev->getText();
if ( $cur_text == $undo_text ) {
# No use doing a merge if it's just a straight revert.
if ( $oldid === $this->getLatest() && $this->useParserCache( false ) ) {
$this->mParserOutput = $parserCache->get( $this, $parserOptions );
if ( $this->mParserOutput ) {
- wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
+ wfDebug( __METHOD__ . ": showing parser cache for current rev permalink\n" );
$wgOut->addParserOutput( $this->mParserOutput );
$wgOut->setRevisionId( $this->mLatest );
- $this->showViewFooter();
- $this->viewUpdates();
- wfProfileOut( __METHOD__ );
- return;
+ $outputDone = true;
+ break;
}
}
}
$this->checkTouched();
$key = $parserCache->getKey( $this, $parserOptions );
- $poolCounter = PoolCounter::factory( 'Article::view', $key );
- $dirtyCallback = $useParserCache ? array( $this, 'tryDirtyCache' ) : false;
- $status = $poolCounter->executeProtected( array( $this, 'doViewParse' ), $dirtyCallback );
-
- if ( !$status->isOK() ) {
+ $poolArticleView = new PoolWorkArticleView( $this, $key, $useParserCache, $parserOptions );
+
+ if ( !$poolArticleView->execute() ) {
# Connection or timeout error
- $this->showPoolError( $status );
wfProfileOut( __METHOD__ );
return;
} else {
$useParserCache = $this->useParserCache( $oldid );
$this->outputWikiText( $this->getContent(), $useParserCache, $parserOptions );
+
+ return true;
}
/**
if ( $wgOut->isPrintable() ) {
$options->setIsPrintable( true );
- $parserOptions->setEditSection( false );
+ $options->setEditSection( false );
}
$output = $parserCache->getDirty( $this, $options );
}
}
- /**
- * Show an error page for an error from the pool counter.
- * @param $status Status
- */
- public function showPoolError( $status ) {
- global $wgOut;
-
- $wgOut->clearHTML(); // for release() errors
- $wgOut->enableClientCache( false );
- $wgOut->setRobotPolicy( 'noindex,nofollow' );
- $wgOut->addWikiText(
- '<div class="errorbox">' .
- $status->getWikiText( false, 'view-pool-error' ) .
- '</div>'
- );
- }
-
/**
* View redirect
*
wfDebug( __METHOD__ . "\n" );
$dbw = wfGetDB( DB_MASTER );
- $ns = $this->mTitle->getNamespace();
$t = $this->mTitle->getDBkey();
$id = $id ? $id : $this->mTitle->getArticleID( GAID_FOR_UPDATE );
}
}
+
+class PoolWorkArticleView extends PoolCounterWork {
+ private $mArticle;
+
+ function __construct( $article, $key, $useParserCache, $parserOptions ) {
+ parent::__construct( __CLASS__, $key );
+ $this->mArticle = $article;
+ $this->cacheable = $useParserCache;
+ $this->parserOptions = $parserOptions;
+ }
+
+ function doWork() {
+ return $this->mArticle->doViewParse();
+ }
+
+ function getCachedWork() {
+ global $wgOut;
+
+ $parserCache = ParserCache::singleton();
+ $this->mArticle->mParserOutput = $parserCache->get( $this->mArticle, $this->parserOptions );
+
+ if ( $this->mArticle->mParserOutput !== false ) {
+ wfDebug( __METHOD__ . ": showing contents parsed by someone else\n" );
+ $wgOut->addParserOutput( $this->mArticle->mParserOutput );
+ # Ensure that UI elements requiring revision ID have
+ # the correct version information.
+ $wgOut->setRevisionId( $this->mArticle->getLatest() );
+ return true;
+ }
+ return false;
+ }
+
+ function fallback() {
+ return $this->mArticle->tryDirtyCache();
+ }
+
+ function error( $status ) {
+ global $wgOut;
+
+ $wgOut->clearHTML(); // for release() errors
+ $wgOut->enableClientCache( false );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
+
+ if ( $status instanceof Status ) {
+ $errortext = $status->getWikiText( false, 'view-pool-error' );
+ } else {
+ $errortext = wfMsgNoTrans( 'view-pool-error', '' );
+ }
+ $wgOut->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+
+ return false;
+ }
+}