(Bug 41574) Supply Title object to Revision if possible.
authordaniel <daniel.kinzler@wikimedia.de>
Thu, 1 Nov 2012 12:48:18 +0000 (13:48 +0100)
committerdaniel <daniel.kinzler@wikimedia.de>
Thu, 1 Nov 2012 12:48:18 +0000 (13:48 +0100)
The Revision object needs the Title to determine the default content model.
Providing the Title explicitely wherever possible avoids an extra database
lookup. Most importanlty, this fixes fatal errors that ocurr when the
database lookup fails due to slave lag or transaction state.

Change-Id: I516e82f7a893b274c513b128b8a46db491160b55

includes/ChangesList.php
includes/Import.php
includes/Revision.php
includes/Title.php
includes/WikiPage.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialMergeHistory.php
tests/phpunit/includes/WikiPageTest.php

index e7395c0..6b7e99c 100644 (file)
@@ -514,12 +514,12 @@ class ChangesList extends ContextSource {
                        if ( $this->getUser()->isAllowed('rollback') && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
                        {
                                $rev = new Revision( array(
+                                       'title'     => $page,
                                        'id'        => $rc->mAttribs['rc_this_oldid'],
                                        'user'      => $rc->mAttribs['rc_user'],
                                        'user_text' => $rc->mAttribs['rc_user_text'],
                                        'deleted'   => $rc->mAttribs['rc_deleted']
                                ) );
-                               $rev->setTitle( $page );
                                $s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
                        }
                }
index 71498ac..2017466 100644 (file)
@@ -1397,6 +1397,7 @@ class WikiRevision {
                # @todo FIXME: Use original rev_id optionally (better for backups)
                # Insert the row
                $revision = new Revision( array(
+                       'title'      => $this->title,
                        'page'       => $pageId,
                        'content_model'  => $this->getModel(),
                        'content_format' => $this->getFormat(),
index 431be69..e841d33 100644 (file)
@@ -178,6 +178,13 @@ class Revision implements IDBAccessObject {
                        unset( $attribs['content_format'] );
                }
 
+               if ( !isset( $attribs['title'] )
+                       && isset( $row->ar_namespace )
+                       && isset( $row->ar_title ) ) {
+
+                       $attribs['title'] = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+               }
+
                if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
index 00fdc3a..b484045 100644 (file)
@@ -3816,6 +3816,7 @@ class Title {
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $redirectRevision = new Revision( array(
+                                       'title'   => $this, // for determining the default content model
                                        'page'    => $newid,
                                        'comment' => $comment,
                                        'content'    => $redirectContent ) );
index b525ff1..df3086a 100644 (file)
@@ -2163,6 +2163,7 @@ class WikiPage extends Page implements IDBAccessObject {
 
                $dbw = wfGetDB( DB_MASTER );
                $revision = new Revision( array(
+                       'title'      => $this->getTitle(), // for determining the default content model
                        'page'       => $this->getId(),
                        'text'       => $serialized,
                        'length'     => $content->getSize(),
index 3d39e37..bdeb7fe 100644 (file)
@@ -135,7 +135,10 @@ class DeletedContribsPager extends IndexPager {
        function formatRow( $row ) {
                wfProfileIn( __METHOD__ );
 
+               $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+
                $rev = new Revision( array(
+                               'title'      => $page,
                                'id'         => $row->ar_rev_id,
                                'comment'    => $row->ar_comment,
                                'user'       => $row->ar_user,
@@ -145,8 +148,6 @@ class DeletedContribsPager extends IndexPager {
                                'deleted'    => $row->ar_deleted,
                                ) );
 
-               $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
-
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
                $logs = SpecialPage::getTitleFor( 'Log' );
index bc9a3d9..85e1d65 100644 (file)
@@ -380,6 +380,7 @@ class SpecialMergeHistory extends SpecialPage {
                        if ( $redirectContent ) {
                                $redirectPage = WikiPage::factory( $targetTitle );
                                $redirectRevision = new Revision( array(
+                                       'title'   => $targetTitle,
                                        'page'    => $this->mTargetID,
                                        'comment' => $comment,
                                        'content' => $redirectContent ) );
index 6dc1568..d7c4d56 100644 (file)
@@ -60,7 +60,8 @@ class WikiPageTest extends MediaWikiLangTestCase {
         */
        protected function newPage( $title, $model = null ) {
                if ( is_string( $title ) ) {
-                       $title = Title::newFromText( $title );
+                       $ns = $this->getDefaultWikitextNS();
+                       $title = Title::newFromText( $title, $ns );
                }
 
                $p = new WikiPage( $title );
@@ -79,11 +80,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @return WikiPage
         */
        protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) ) {
-                       $page = Title::newFromText( $page );
-               }
-
-               if ( $page instanceof Title ) {
+               if ( is_string( $page ) || $page instanceof Title ) {
                        $page = $this->newPage( $page, $model );
                }
 
@@ -94,9 +91,8 @@ class WikiPageTest extends MediaWikiLangTestCase {
        }
 
        public function testDoEditContent() {
-               $title = Title::newFromText( "WikiPageTest_testDoEditContent" );
-
-               $page = $this->newPage( $title );
+               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
+               $title = $page->getTitle();
 
                $content = ContentHandler::makeContent( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
                                                . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
@@ -543,10 +539,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @dataProvider provideIsCountable
         */
        public function testIsCountable( $title, $model, $text, $mode, $expected ) {
-               global $wgArticleCountMethod;
+               global $wgContentHandlerUseDB;
 
-               $oldArticleCountMethod = $wgArticleCountMethod;
-               $wgArticleCountMethod = $mode;
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
+
+               $title = Title::newFromText( $title );
+
+               if ( !$wgContentHandlerUseDB && ContentHandler::getDefaultModelFor( $title ) != $model ) {
+                       $this->markTestSkipped( "Can not use non-default content model $model for "
+                               . $title->getPrefixedDBkey() . " with \wgArticleCountMethod disabled." );
+               }
 
                $page = $this->createPage( $title, $text, $model );
                $hasLinks = wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
@@ -557,8 +559,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $v = $page->isCountable();
                $w = $page->isCountable( $editInfo );
 
-               $wgArticleCountMethod = $oldArticleCountMethod;
-
                $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
                                                                                        . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );