(bug 42168) Nicely handle missing revisions in ApiQueryRevisions.
authordaniel <daniel.kinzler@wikimedia.de>
Thu, 13 Dec 2012 16:50:45 +0000 (17:50 +0100)
committerdaniel <daniel.kinzler@wikimedia.de>
Thu, 20 Dec 2012 14:22:58 +0000 (15:22 +0100)
ApiQueryRevisions had fatal errors when the Content object of a revision was null.
Should be fixed now.

Change-Id: Ic41d03fc55413ba7ba1c96b4f06d71d79fb7c4eb

includes/api/ApiQueryRevisions.php

index 66ff3f0..cca7eb2 100644 (file)
@@ -496,14 +496,14 @@ class ApiQueryRevisions extends ApiQueryBase {
                        // Expand templates after getting section content because
                        // template-added sections don't count and Parser::preprocess()
                        // will have less input
-                       if ( $this->section !== false ) {
+                       if ( $content && $this->section !== false ) {
                                $content = $content->getSection( $this->section, false );
                                if ( !$content ) {
                                        $this->dieUsage( "There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection' );
                                }
                        }
                }
-               if ( $this->fld_content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $this->fld_content && $content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
                        $text = null;
 
                        if ( $this->generateXML ) {
@@ -567,13 +567,20 @@ class ApiQueryRevisions extends ApiQueryBase {
                                ApiResult::setContent( $vals, $text );
                        }
                } elseif ( $this->fld_content ) {
-                       $vals['texthidden'] = '';
+                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $vals['texthidden'] = '';
+                       } else {
+                               $vals['textmissing'] = '';
+                       }
                }
 
                if ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
                        global $wgAPIMaxUncachedDiffs;
                        static $n = 0; // Number of uncached diffs we've had
-                       if ( $n < $wgAPIMaxUncachedDiffs ) {
+
+                       if ( is_null( $content ) ) {
+                               $vals['textmissing'] = '';
+                       } elseif ( $n < $wgAPIMaxUncachedDiffs ) {
                                $vals['diff'] = array();
                                $context = new DerivativeContext( $this->getContext() );
                                $context->setTitle( $title );
@@ -786,7 +793,8 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        ApiBase::PROP_TYPE => 'string',
                                        ApiBase::PROP_NULLABLE => true
                                ),
-                               'texthidden' => 'boolean'
+                               'texthidden' => 'boolean',
+                               'textmissing' => 'boolean',
                        ),
                        'contentmodel' => array(
                                'contentmodel' => 'string'