From e40cbbea6582cc288e1570cd696817cbc0cfabb4 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Wed, 6 May 2015 15:33:37 -0400 Subject: [PATCH] ApiPageSet: Indicate why a title was invalid May as well. Bug: T98198 Change-Id: Ib17088a9685c48d7db647896ecd59aced7911374 --- includes/api/ApiImageRotate.php | 2 +- includes/api/ApiPageSet.php | 39 ++++++++++++++------ includes/api/ApiQuery.php | 4 +- includes/api/ApiSetNotificationTimestamp.php | 4 +- 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/includes/api/ApiImageRotate.php b/includes/api/ApiImageRotate.php index 865d39fafe..c8390b6fcd 100644 --- a/includes/api/ApiImageRotate.php +++ b/includes/api/ApiImageRotate.php @@ -60,7 +60,7 @@ class ApiImageRotate extends ApiBase { $result = array(); - self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' ); + self::addValues( $result, $pageSet->getInvalidTitlesAndReasons(), 'invalid' ); self::addValues( $result, $pageSet->getSpecialTitles(), 'special', 'title' ); self::addValues( $result, $pageSet->getMissingPageIDs(), 'missing', 'pageid' ); self::addValues( $result, $pageSet->getMissingRevisionIDs(), 'missing', 'revid' ); diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index e6f218d62b..5efe7885e7 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -58,7 +58,7 @@ class ApiPageSet extends ApiBase { private $mGoodTitles = array(); private $mMissingPages = array(); // [ns][dbkey] => fake page_id private $mMissingTitles = array(); - private $mInvalidTitles = array(); + private $mInvalidTitles = array(); // [fake_page_id] => array( 'title' => $title, 'invalidreason' => $reason ) private $mMissingPageIDs = array(); private $mRedirectTitles = array(); private $mSpecialTitles = array(); @@ -396,9 +396,22 @@ class ApiPageSet extends ApiBase { /** * Titles that were deemed invalid by Title::newFromText() * The array's index will be unique and negative for each item + * @deprecated since 1.26, use self::getInvalidTitlesAndReasons() * @return string[] Array of strings (not Title objects) */ public function getInvalidTitles() { + wfDeprecated( __METHOD__, '1.26' ); + return array_map( function ( $t ) { + return $t['title']; + }, $this->mInvalidTitles ); + } + + /** + * Titles that were deemed invalid by Title::newFromText() + * The array's index will be unique and negative for each item + * @return array[] Array of arrays with 'title' and 'invalidreason' properties + */ + public function getInvalidTitlesAndReasons() { return $this->mInvalidTitles; } @@ -552,7 +565,7 @@ class ApiPageSet extends ApiBase { * * @param array $invalidChecks List of types of invalid titles to include. * Recognized values are: - * - invalidTitles: Titles from $this->getInvalidTitles() + * - invalidTitles: Titles and reasons from $this->getInvalidTitlesAndReasons() * - special: Titles from $this->getSpecialTitles() * - missingIds: ids from $this->getMissingPageIDs() * - missingRevIds: ids from $this->getMissingRevisionIDs() @@ -566,7 +579,7 @@ class ApiPageSet extends ApiBase { ) { $result = array(); if ( in_array( "invalidTitles", $invalidChecks ) ) { - self::addValues( $result, $this->getInvalidTitles(), 'invalid', 'title' ); + self::addValues( $result, $this->getInvalidTitlesAndReasons(), 'invalid' ); } if ( in_array( "special", $invalidChecks ) ) { self::addValues( $result, $this->getSpecialTitles(), 'special', 'title' ); @@ -1077,17 +1090,21 @@ class ApiPageSet extends ApiBase { foreach ( $titles as $title ) { if ( is_string( $title ) ) { - $titleObj = Title::newFromText( $title, $this->mDefaultNamespace ); + try { + $titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace ); + } catch ( MalformedTitleException $ex ) { + // Handle invalid titles gracefully + $this->mAllPages[0][$title] = $this->mFakePageId; + $this->mInvalidTitles[$this->mFakePageId] = array( + 'title' => $title, + 'invalidreason' => $ex->getMessage(), + ); + $this->mFakePageId--; + continue; // There's nothing else we can do + } } else { $titleObj = $title; } - if ( !$titleObj ) { - // Handle invalid titles gracefully - $this->mAllPages[0][$title] = $this->mFakePageId; - $this->mInvalidTitles[$this->mFakePageId] = $title; - $this->mFakePageId--; - continue; // There's nothing else we can do - } $unconvertedTitle = $titleObj->getPrefixedText(); $titleWasConverted = false; if ( $titleObj->isExternal() ) { diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index bfe32052cb..304d0f0a66 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -407,8 +407,8 @@ class ApiQuery extends ApiBase { $pages[$fakeId] = $vals; } // Report any invalid titles - foreach ( $pageSet->getInvalidTitles() as $fakeId => $title ) { - $pages[$fakeId] = array( 'title' => $title, 'invalid' => true ); + foreach ( $pageSet->getInvalidTitlesAndReasons() as $fakeId => $data ) { + $pages[$fakeId] = $data + array( 'invalid' => true ); } // Report any missing page ids foreach ( $pageSet->getMissingPageIDs() as $pageid ) { diff --git a/includes/api/ApiSetNotificationTimestamp.php b/includes/api/ApiSetNotificationTimestamp.php index 86a3f6aa04..fa6fabf6f6 100644 --- a/includes/api/ApiSetNotificationTimestamp.php +++ b/includes/api/ApiSetNotificationTimestamp.php @@ -112,9 +112,7 @@ class ApiSetNotificationTimestamp extends ApiBase { : wfTimestamp( TS_ISO_8601, $timestamp ); } else { // First, log the invalid titles - foreach ( $pageSet->getInvalidTitles() as $title ) { - $r = array(); - $r['title'] = $title; + foreach ( $pageSet->getInvalidTitlesAndReasons() as $r ) { $r['invalid'] = true; $result[] = $r; } -- 2.20.1