Avoid fatal when finding no base revision for a null revision.
authordaniel <dkinzler@wikimedia.org>
Thu, 4 Oct 2018 10:49:50 +0000 (12:49 +0200)
committerdaniel <dkinzler@wikimedia.org>
Thu, 4 Oct 2018 17:54:31 +0000 (19:54 +0200)
Bug: T205675
Change-Id: Iae67649a1be9597086033ad34d9d00556ba35730

includes/MovePage.php
includes/Revision.php
includes/Storage/RevisionStore.php

index 2ad3158..ecd12c6 100644 (file)
@@ -536,7 +536,8 @@ class MovePage {
                # Save a null revision in the page's history notifying of the move
                $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $user );
                if ( !is_object( $nullRevision ) ) {
-                       throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
+                       throw new MWException( 'Failed to create null revision while moving page ID '
+                               . $oldid . ' to ' . $nt->getPrefixedDBkey() );
                }
 
                $nullRevId = $nullRevision->insertOn( $dbw );
index a55b1c4..e45c6dc 100644 (file)
@@ -1179,7 +1179,7 @@ class Revision implements IDBAccessObject {
 
                $rec = self::getRevisionStore()->newNullRevision( $dbw, $title, $comment, $minor, $user );
 
-               return new Revision( $rec );
+               return $rec ? new Revision( $rec ) : null;
        }
 
        /**
index bab1b5e..d9db8bd 100644 (file)
@@ -48,6 +48,7 @@ use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use RecentChange;
 use Revision;
+use RuntimeException;
 use stdClass;
 use Title;
 use User;
@@ -1058,13 +1059,15 @@ class RevisionStore
        ) {
                $this->checkDatabaseWikiId( $dbw );
 
+               $pageId = $title->getArticleID();
+
                // T51581: Lock the page table row to ensure no other process
                // is adding a revision to the page at the same time.
                // Avoid locking extra tables, compare T191892.
                $pageLatest = $dbw->selectField(
                        'page',
                        'page_latest',
-                       [ 'page_id' => $title->getArticleID() ],
+                       [ 'page_id' => $pageId ],
                        __METHOD__,
                        [ 'FOR UPDATE' ]
                );
@@ -1081,6 +1084,15 @@ class RevisionStore
                        $title
                );
 
+               if ( !$oldRevision ) {
+                       $msg = "Failed to load latest revision ID $pageLatest of page ID $pageId.";
+                       $this->logger->error(
+                               $msg,
+                               [ 'exception' => new RuntimeException( $msg ) ]
+                       );
+                       return null;
+               }
+
                // Construct the new revision
                $timestamp = wfTimestampNow(); // TODO: use a callback, so we can override it for testing.
                $newRevision = MutableRevisionRecord::newFromParentRevision( $oldRevision );