Merge "installer: Fix setting a custom $wgMetaNamespace"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 7 Apr 2018 08:49:43 +0000 (08:49 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 7 Apr 2018 08:49:43 +0000 (08:49 +0000)
39 files changed:
RELEASE-NOTES-1.31
includes/TitleArray.php
includes/TitleArrayFromResult.php
includes/api/ApiBase.php
includes/pager/IndexPager.php
includes/parser/Parser.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/user/UserArray.php
includes/user/UserArrayFromResult.php
languages/Language.php
languages/i18n/en.json
tests/common/TestsAutoLoader.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/PHPUnit4And6Compat.php [new file with mode: 0644]

index 029eea5..051f6d0 100644 (file)
@@ -120,7 +120,9 @@ production.
   returned regardless.
 
 === Action API internal changes in 1.31 ===
-* …
+* ApiBase::getProfileDBTime was removed (deprecated since 1.25)
+* ApiBase::getModuleProfileName was removed (deprecated since 1.25)
+* ApiBase::getProfileTime was removed (deprecated since 1.25)
 
 === Languages updated in 1.31 ===
 MediaWiki supports over 350 languages. Many localisations are updated
index bf2344b..a1eabe5 100644 (file)
@@ -24,7 +24,7 @@
  * @file
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 /**
  * The TitleArray class only exists to provide the newFromResult method at pre-
@@ -32,7 +32,7 @@ use Wikimedia\Rdbms\ResultWrapper;
  */
 abstract class TitleArray implements Iterator {
        /**
-        * @param ResultWrapper $res A SQL result including at least page_namespace and
+        * @param IResultWrapper $res A SQL result including at least page_namespace and
         *   page_title -- also can have page_id, page_len, page_is_redirect,
         *   page_latest (if those will be used).  See Title::newFromRow.
         * @return TitleArrayFromResult
@@ -49,7 +49,7 @@ abstract class TitleArray implements Iterator {
        }
 
        /**
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         * @return TitleArrayFromResult
         */
        protected static function newFromResult_internal( $res ) {
index 189fb40..ee60f7b 100644 (file)
  * @file
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 class TitleArrayFromResult extends TitleArray implements Countable {
-       /** @var ResultWrapper */
+       /** @var IResultWrapper */
        public $res;
 
        public $key;
@@ -41,7 +41,7 @@ class TitleArrayFromResult extends TitleArray implements Countable {
        }
 
        /**
-        * @param bool|ResultWrapper $row
+        * @param bool|IResultWrapper $row
         * @return void
         */
        protected function setCurrent( $row ) {
index 22202c0..9d6314d 100644 (file)
@@ -2589,16 +2589,6 @@ abstract class ApiBase extends ContextSource {
                return false;
        }
 
-       /**
-        * @deprecated since 1.25, always returns empty string
-        * @param IDatabase|bool $db
-        * @return string
-        */
-       public function getModuleProfileName( $db = false ) {
-               wfDeprecated( __METHOD__, '1.25' );
-               return '';
-       }
-
        /**
         * @deprecated since 1.25
         */
@@ -2622,15 +2612,6 @@ abstract class ApiBase extends ContextSource {
                wfDeprecated( __METHOD__, '1.25' );
        }
 
-       /**
-        * @deprecated since 1.25, always returns 0
-        * @return float
-        */
-       public function getProfileTime() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return 0;
-       }
-
        /**
         * @deprecated since 1.25
         */
@@ -2645,15 +2626,6 @@ abstract class ApiBase extends ContextSource {
                wfDeprecated( __METHOD__, '1.25' );
        }
 
-       /**
-        * @deprecated since 1.25, always returns 0
-        * @return float
-        */
-       public function getProfileDBTime() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return 0;
-       }
-
        /**
         * Call wfTransactionalTimeLimit() if this request was POSTed
         * @since 1.26
index d1c98f2..6880d58 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Pager
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -124,7 +124,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Result object for the query. Warning: seek before use.
         *
-        * @var ResultWrapper
+        * @var IResultWrapper
         */
        public $mResult;
 
@@ -232,7 +232,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        }
 
        /**
-        * @return ResultWrapper The result wrapper.
+        * @return IResultWrapper The result wrapper.
         */
        function getResult() {
                return $this->mResult;
@@ -292,9 +292,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @param bool $isFirst False if there are rows before those fetched (i.e.
         *     if a "previous" link would make sense)
         * @param int $limit Exact query limit
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
-       function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
+       function extractResultInfo( $isFirst, $limit, IResultWrapper $res ) {
                $numRows = $res->numRows();
                if ( $numRows ) {
                        # Remove any table prefix from index field
@@ -359,7 +359,7 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @param string $offset Index offset, inclusive
         * @param int $limit Exact query limit
         * @param bool $descending Query direction, false for ascending, true for descending
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function reallyDoQuery( $offset, $limit, $descending ) {
                list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
@@ -406,7 +406,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        /**
         * Pre-process results; useful for performing batch existence checks, etc.
         *
-        * @param ResultWrapper $result
+        * @param IResultWrapper $result
         */
        protected function preprocessResults( $result ) {
        }
index d34257f..b66031c 100644 (file)
@@ -1471,7 +1471,7 @@ class Parser {
        /**
         * @throws MWException
         * @param array $m
-        * @return HTML|string
+        * @return string HTML
         */
        public function magicLinkCallback( $m ) {
                if ( isset( $m[1] ) && $m[1] !== '' ) {
index 65a300a..e2de9ec 100644 (file)
@@ -1093,7 +1093,7 @@ abstract class Skin extends ContextSource {
        /* these are used extensively in SkinTemplate, but also some other places */
 
        /**
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return string
         */
        static function makeMainPageUrl( $urlaction = '' ) {
@@ -1110,7 +1110,7 @@ abstract class Skin extends ContextSource {
         * URL with the protocol specified.
         *
         * @param string $name Name of the Special page
-        * @param string $urlaction Query to append
+        * @param string|string[] $urlaction Query to append
         * @param string|null $proto Protocol to use or null for a local URL
         * @return string
         */
@@ -1126,7 +1126,7 @@ abstract class Skin extends ContextSource {
        /**
         * @param string $name
         * @param string $subpage
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return string
         */
        static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) {
@@ -1136,7 +1136,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * @param string $name
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return string
         */
        static function makeI18nUrl( $name, $urlaction = '' ) {
@@ -1147,7 +1147,7 @@ abstract class Skin extends ContextSource {
 
        /**
         * @param string $name
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return string
         */
        static function makeUrl( $name, $urlaction = '' ) {
@@ -1174,7 +1174,7 @@ abstract class Skin extends ContextSource {
        /**
         * this can be passed the NS number as defined in Language.php
         * @param string $name
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @param int $namespace
         * @return string
         */
@@ -1188,7 +1188,7 @@ abstract class Skin extends ContextSource {
        /**
         * these return an array with the 'href' and boolean 'exists'
         * @param string $name
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return array
         */
        static function makeUrlDetails( $name, $urlaction = '' ) {
@@ -1204,7 +1204,7 @@ abstract class Skin extends ContextSource {
        /**
         * Make URL details where the article exists (or at least it's convenient to think so)
         * @param string $name Article name
-        * @param string $urlaction
+        * @param string|string[] $urlaction
         * @return array
         */
        static function makeKnownUrlDetails( $name, $urlaction = '' ) {
index b9d20be..c38b0da 100644 (file)
@@ -22,7 +22,7 @@
  */
 use MediaWiki\Logger\LoggerFactory;
 use Wikimedia\Rdbms\DBQueryTimeoutError;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -866,7 +866,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
         *
-        * @return bool|ResultWrapper Result or false
+        * @return bool|IResultWrapper Result or false
         */
        public function getRows() {
                $opts = $this->getOptions();
@@ -1455,7 +1455,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @param array $query_options Array of query options; see IDatabase::select $options
         * @param array $join_conds Array of join conditions; see IDatabase::select $join_conds
         * @param FormOptions $opts
-        * @return bool|ResultWrapper Result or false
+        * @return bool|IResultWrapper Result or false
         */
        protected function doMainQuery( $tables, $fields, $conds,
                $query_options, $join_conds, FormOptions $opts
@@ -1526,7 +1526,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Send output to the OutputPage object, only called if not used feeds
         *
-        * @param ResultWrapper $rows Database rows
+        * @param IResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        public function webOutput( $rows, $opts ) {
@@ -1545,7 +1545,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /**
         * Build and output the actual changes list.
         *
-        * @param ResultWrapper $rows Database rows
+        * @param IResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        abstract public function outputChangesList( $rows, $opts );
index 59abefd..49aaffd 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -39,7 +39,7 @@ abstract class ImageQueryPage extends QueryPage {
         * @param OutputPage $out OutputPage to print to
         * @param Skin $skin User skin to use [unused]
         * @param IDatabase $dbr (read) connection to use
-        * @param ResultWrapper $res Result pointer
+        * @param IResultWrapper $res Result pointer
         * @param int $num Number of available result rows
         * @param int $offset Paging offset
         */
index f7f0499..7d6db05 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -36,7 +36,7 @@ abstract class PageQueryPage extends QueryPage {
         * This should be done for live data and cached data.
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index b20f222..f642106 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\DBError;
 
@@ -387,7 +387,7 @@ abstract class QueryPage extends SpecialPage {
         * Run the query and return the result
         * @param int|bool $limit Numerical limit or false for no limit
         * @param int|bool $offset Numerical offset or false for no offset
-        * @return ResultWrapper
+        * @return IResultWrapper
         * @since 1.18
         */
        public function reallyDoQuery( $limit, $offset = false ) {
@@ -439,7 +439,7 @@ abstract class QueryPage extends SpecialPage {
         * Somewhat deprecated, you probably want to be using execute()
         * @param int|bool $offset
         * @param int|bool $limit
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        public function doQuery( $offset = false, $limit = false ) {
                if ( $this->isCached() && $this->isCacheable() ) {
@@ -453,7 +453,7 @@ abstract class QueryPage extends SpecialPage {
         * Fetch the query results from the query cache
         * @param int|bool $limit Numerical limit or false for no limit
         * @param int|bool $offset Numerical offset or false for no offset
-        * @return ResultWrapper
+        * @return IResultWrapper
         * @since 1.18
         */
        public function fetchFromCache( $limit, $offset = false ) {
@@ -685,7 +685,7 @@ abstract class QueryPage extends SpecialPage {
         * @param OutputPage $out OutputPage to print to
         * @param Skin $skin User skin to use
         * @param IDatabase $dbr Database (read) connection to use
-        * @param ResultWrapper $res Result pointer
+        * @param IResultWrapper $res Result pointer
         * @param int $num Number of available result rows
         * @param int $offset Paging offset
         */
@@ -751,7 +751,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * Do any necessary preprocessing of the result object.
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
        }
@@ -853,12 +853,12 @@ abstract class QueryPage extends SpecialPage {
         * title and optional the namespace field) and executes the batch. This operation will pre-cache
         * LinkCache information like page existence and information for stub color and redirect hints.
         *
-        * @param ResultWrapper $res The ResultWrapper object to process. Needs to include the title
+        * @param IResultWrapper $res The ResultWrapper object to process. Needs to include the title
         *  field and namespace field, if the $ns parameter isn't set.
         * @param null $ns Use this namespace for the given titles in the ResultWrapper object,
         *  instead of the namespace value of $res.
         */
-       protected function executeLBFromResultWrapper( ResultWrapper $res, $ns = null ) {
+       protected function executeLBFromResultWrapper( IResultWrapper $res, $ns = null ) {
                if ( !$res->numRows() ) {
                        return;
                }
index 8b60387..83ffe40 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -41,7 +41,7 @@ abstract class WantedQueryPage extends QueryPage {
        /**
         * Cache page existence for performance
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index cf9ae07..3e1909b 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -167,7 +167,7 @@ class BrokenRedirectsPage extends QueryPage {
         * Cache page content model for performance
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index d73ac19..77c59f0 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -202,7 +202,7 @@ class DoubleRedirectsPage extends QueryPage {
         * Cache page content model and gender distinction for performance
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
index cda0854..ef95254 100644 (file)
@@ -22,7 +22,7 @@
  * @author Brion Vibber
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -225,7 +225,7 @@ class LinkSearchPage extends QueryPage {
         * Pre-fill the link cache
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index d5fb001..4c847e9 100644 (file)
@@ -24,7 +24,7 @@
  * @author Brian Wolff
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -75,7 +75,7 @@ class ListDuplicatedFilesPage extends QueryPage {
         * Pre-fill the link cache
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index f81c03c..48f3640 100644 (file)
@@ -24,7 +24,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -76,7 +76,7 @@ class ListredirectsPage extends QueryPage {
         * Cache page existence for performance
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
index 15749b2..943fa57 100644 (file)
@@ -22,7 +22,7 @@
  * @author Brian Wolff
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -114,7 +114,7 @@ class MediaStatisticsPage extends QueryPage {
         * @param OutputPage $out
         * @param Skin $skin (deprecated presumably)
         * @param IDatabase $dbr
-        * @param ResultWrapper $res Results from query
+        * @param IResultWrapper $res Results from query
         * @param int $num Number of results
         * @param int $offset Paging offset (Should always be 0 in our case)
         */
@@ -356,7 +356,7 @@ class MediaStatisticsPage extends QueryPage {
         * Initialize total values so we can figure out percentages later.
         *
         * @param IDatabase $dbr
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        public function preprocessResults( $dbr, $res ) {
                $this->executeLBFromResultWrapper( $res );
index bebed12..123c174 100644 (file)
@@ -24,7 +24,7 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -69,7 +69,7 @@ class MostcategoriesPage extends QueryPage {
 
        /**
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index 5e56694..c963838 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -72,7 +72,7 @@ class MostinterwikisPage extends QueryPage {
         * Pre-fill the link cache
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index fbfaa73..c4553a4 100644 (file)
@@ -25,7 +25,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -78,7 +78,7 @@ class MostlinkedPage extends QueryPage {
         * Pre-fill the link cache
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index 956207f..f238f6c 100644 (file)
@@ -24,7 +24,7 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -59,7 +59,7 @@ class MostlinkedCategoriesPage extends QueryPage {
         * Fetch user page links and cache their existence
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index dee1c8e..4544468 100644 (file)
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -79,7 +79,7 @@ class MostlinkedTemplatesPage extends QueryPage {
         * Pre-cache page existence to speed up link generation
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index d6d4c27..cb2f420 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
@@ -389,7 +389,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        /**
         * Build and output the actual changes list.
         *
-        * @param ResultWrapper $rows Database rows
+        * @param IResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        public function outputChangesList( $rows, $opts ) {
@@ -722,7 +722,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         *
         * @deprecated since 1.31
         *
-        * @param ResultWrapper &$rows Database rows
+        * @param IResultWrapper &$rows Database rows
         * @param FormOptions $opts
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
index e9c15e7..d90f72c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -124,7 +124,7 @@ class ShortPagesPage extends QueryPage {
 
        /**
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $this->executeLBFromResultWrapper( $res );
index 6e6ad77..540dbc6 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 /**
  * Special page allowing users with the appropriate permissions to view
@@ -306,7 +306,7 @@ class SpecialUndelete extends SpecialPage {
        /**
         * Generic list of deleted pages
         *
-        * @param ResultWrapper $result
+        * @param IResultWrapper $result
         * @return bool
         */
        private function showList( $result ) {
index fea7e21..0ea7dfa 100644 (file)
@@ -24,7 +24,7 @@
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -50,7 +50,7 @@ class UnwatchedpagesPage extends QueryPage {
         * Pre-cache page existence to speed up link generation
         *
         * @param IDatabase $db
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
index 7b3f25c..3fe6c1e 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -477,7 +477,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        /**
         * Build and output the actual changes list.
         *
-        * @param ResultWrapper $rows Database rows
+        * @param IResultWrapper $rows Database rows
         * @param FormOptions $opts
         */
        public function outputChangesList( $rows, $opts ) {
index 4234292..5789c28 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 class BlockListPager extends TablePager {
 
@@ -289,7 +289,7 @@ class BlockListPager extends TablePager {
 
        /**
         * Do a LinkBatch query to minimise database load when generating all these links
-        * @param ResultWrapper $result
+        * @param IResultWrapper $result
         */
        function preprocessResults( $result ) {
                # Do a link batch query
index 520e88d..e31498a 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -113,7 +113,7 @@ class ContribsPager extends RangeChronologicalPager {
         * @param string $offset Index offset, inclusive
         * @param int $limit Exact query limit
         * @param bool $descending Query direction, false for ascending, true for descending
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
                list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo(
index d642e66..f3de64d 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 
 class DeletedContribsPager extends IndexPager {
@@ -96,7 +96,7 @@ class DeletedContribsPager extends IndexPager {
         * @param string $offset Index offset, inclusive
         * @param int $limit Exact query limit
         * @param bool $descending Query direction, false for ascending, true for descending
-        * @return ResultWrapper
+        * @return IResultWrapper
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
                $data = [ parent::reallyDoQuery( $offset, $limit, $descending ) ];
index 75c2f77..3225256 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 
 class ImageListPager extends TablePager {
@@ -356,8 +356,8 @@ class ImageListPager extends TablePager {
         *
         * Note: This will throw away some results
         *
-        * @param ResultWrapper $res1
-        * @param ResultWrapper $res2
+        * @param IResultWrapper $res1
+        * @param IResultWrapper $res2
         * @param int $limit
         * @param bool $ascending See note about $asc in $this->reallyDoQuery
         * @return FakeResultWrapper $res1 and $res2 combined
index f3a7f9f..66d9c7a 100644 (file)
  * @file
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 abstract class UserArray implements Iterator {
        /**
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         * @return UserArrayFromResult
         */
        static function newFromResult( $res ) {
@@ -86,7 +86,7 @@ abstract class UserArray implements Iterator {
        }
 
        /**
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         * @return UserArrayFromResult
         */
        protected static function newFromResult_internal( $res ) {
index 527df7f..0830e42 100644 (file)
  * @file
  */
 
-use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IResultWrapper;
 
 class UserArrayFromResult extends UserArray implements Countable {
-       /** @var ResultWrapper */
+       /** @var IResultWrapper */
        public $res;
 
        /** @var int */
@@ -33,7 +33,7 @@ class UserArrayFromResult extends UserArray implements Countable {
        public $current;
 
        /**
-        * @param ResultWrapper $res
+        * @param IResultWrapper $res
         */
        function __construct( $res ) {
                $this->res = $res;
index fc8ef87..b71defa 100644 (file)
@@ -4822,7 +4822,7 @@ class Language {
         * @param string $details HTML safe text between brackets
         * @param bool $oppositedm Add the direction mark opposite to your
         *   language, to display text properly
-        * @return HTML escaped string
+        * @return string HTML escaped
         */
        function specialList( $page, $details, $oppositedm = true ) {
                if ( !$details ) {
index 27f9814..80b33b4 100644 (file)
        "password-login-forbidden": "The use of this username and password has been forbidden.",
        "mailmypassword": "Reset password",
        "passwordremindertitle": "New temporary password for {{SITENAME}}",
-       "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
+       "passwordremindertext": "Someone (from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
        "noemail": "There is no email address recorded for user \"$1\".",
        "noemailcreate": "You need to provide a valid email address.",
        "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
index 1173e1c..b626063 100644 (file)
@@ -63,6 +63,7 @@ $wgAutoloadClasses += [
        'TestUserRegistry' => "$testDir/phpunit/includes/TestUserRegistry.php",
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
        'MediaWikiCoversValidator' => "$testDir/phpunit/MediaWikiCoversValidator.php",
+       'PHPUnit4And6Compat' => "$testDir/phpunit/PHPUnit4And6Compat.php",
 
        # tests/phpunit/includes
        'RevisionDbTestBase' => "$testDir/phpunit/includes/RevisionDbTestBase.php",
@@ -184,3 +185,35 @@ $wgAutoloadClasses += [
        'ParserTestTopLevelSuite' => "$testDir/phpunit/suites/ParserTestTopLevelSuite.php",
 ];
 // phpcs:enable
+
+/**
+ * Alias any PHPUnit 4 era PHPUnit_... class
+ * to it's PHPUnit 6 replacement. For most classes
+ * this is a direct _ -> \ replacement, but for
+ * some others we might need to maintain a manual
+ * mapping. Once we drop support for PHPUnit 4 this
+ * should be considered deprecated and eventually removed.
+ */
+spl_autoload_register( function ( $class ) {
+       if ( strpos( $class, 'PHPUnit_' ) !== 0 ) {
+               // Skip if it doesn't start with the old prefix
+               return;
+       }
+
+       // Classes that don't map 100%
+       $map = [
+               'PHPUnit_Framework_TestSuite_DataProvider' => 'PHPUnit\Framework\DataProviderTestSuite'
+       ];
+
+       if ( isset( $map[$class] ) ) {
+               $newForm = $map[$class];
+       } else {
+               $newForm = str_replace( '_', '\\', $class );
+       }
+
+       if ( class_exists( $newForm ) ) {
+               // If the new class name exists, alias
+               // the old name to it.
+               class_alias( $newForm, $class );
+       }
+} );
index ffba861..47b6218 100644 (file)
@@ -17,6 +17,7 @@ use Wikimedia\TestingAccessWrapper;
 abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
+       use PHPUnit4And6Compat;
 
        /**
         * The service locator created by prepareServices(). This service locator will
@@ -1558,44 +1559,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                }
        }
 
-       /**
-        * @since 1.18
-        *
-        * @param string $func
-        * @param array $args
-        *
-        * @return mixed
-        * @throws MWException
-        */
-       public function __call( $func, $args ) {
-               static $compatibility = [
-                       'createMock' => 'createMock2',
-               ];
-
-               if ( isset( $compatibility[$func] ) ) {
-                       return call_user_func_array( [ $this, $compatibility[$func] ], $args );
-               } else {
-                       throw new MWException( "Called non-existent $func method on " . static::class );
-               }
-       }
-
-       /**
-        * Return a test double for the specified class.
-        *
-        * @param string $originalClassName
-        * @return PHPUnit_Framework_MockObject_MockObject
-        * @throws Exception
-        */
-       private function createMock2( $originalClassName ) {
-               return $this->getMockBuilder( $originalClassName )
-                       ->disableOriginalConstructor()
-                       ->disableOriginalClone()
-                       ->disableArgumentCloning()
-                       // New in phpunit-mock-objects 3.2 (phpunit 5.4.0)
-                       // ->disallowMockingUnknownTypes()
-                       ->getMock();
-       }
-
        private static function unprefixTable( &$tableName, $ind, $prefix ) {
                $tableName = substr( $tableName, strlen( $prefix ) );
        }
diff --git a/tests/phpunit/PHPUnit4And6Compat.php b/tests/phpunit/PHPUnit4And6Compat.php
new file mode 100644 (file)
index 0000000..ac2c4f5
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Copyright (C) 2018 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/**
+ * @since 1.31
+ */
+trait PHPUnit4And6Compat {
+       /**
+        * @see PHPUnit_Framework_TestCase::setExpectedException
+        *
+        * This function was renamed to expectException() in PHPUnit 6, so this
+        * is a temporary backwards-compatibility layer while we transition.
+        */
+       public function setExpectedException( $name, $message = '', $code = null ) {
+               if ( is_callable( [ $this, 'expectException' ] ) ) {
+                       $this->expectException( $name );
+                       if ( $message !== '' ) {
+                               $this->expectExceptionMessage( $message );
+                       }
+                       if ( $code !== null ) {
+                               $this->expectExceptionCode( $code );
+                       }
+               } else {
+                       parent::setExpectedException( $name, $message, $code );
+               }
+       }
+
+       /**
+        * @see PHPUnit_Framework_TestCase::getMock
+        *
+        * @return PHPUnit_Framework_MockObject_MockObject
+        */
+       public function getMock( $originalClassName, $methods = [], array $arguments = [],
+               $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true,
+               $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false,
+               $proxyTarget = null
+       ) {
+               if ( is_callable( 'parent::getMock' ) ) {
+                       return parent::getMock(
+                               $originalClassName, $methods, $arguments, $mockClassName,
+                               $callOriginalConstructor, $callOriginalClone, $callAutoload,
+                               $cloneArguments, $callOriginalMethods, $proxyTarget
+                       );
+               } else {
+                       $builder = $this->getMockBuilder( $originalClassName )
+                               ->setMethods( $methods )
+                               ->setConstructorArgs( $arguments )
+                               ->setMockClassName( $mockClassName )
+                               ->setProxyTarget( $proxyTarget );
+                       if ( $callOriginalConstructor ) {
+                               $builder->enableOriginalConstructor();
+                       } else {
+                               $builder->disableOriginalConstructor();
+                       }
+                       if ( $callOriginalClone ) {
+                               $builder->enableOriginalClone();
+                       } else {
+                               $builder->disableOriginalClone();
+                       }
+                       if ( $callAutoload ) {
+                               $builder->enableAutoload();
+                       } else {
+                               $builder->disableAutoload();
+                       }
+                       if ( $cloneArguments ) {
+                               $builder->enableArgumentCloning();
+                       } else {
+                               $builder->disableArgumentCloning();
+                       }
+                       if ( $callOriginalMethods ) {
+                               $builder->enableProxyingToOriginalMethods();
+                       } else {
+                               $builder->disableProxyingToOriginalMethods();
+                       }
+
+                       return $builder->getMock();
+               }
+       }
+
+       /**
+        * Return a test double for the specified class. This
+        * is a forward port of the createMock function that
+        * was introduced in PHPUnit 5.4.
+        *
+        * @param string $originalClassName
+        * @return PHPUnit_Framework_MockObject_MockObject
+        * @throws Exception
+        */
+       public function createMock( $originalClassName ) {
+               if ( is_callable( 'parent::createMock' ) ) {
+                       return parent::createMock( $originalClassName );
+               }
+               // Compat for PHPUnit <= 5.4
+               return $this->getMockBuilder( $originalClassName )
+                       ->disableOriginalConstructor()
+                       ->disableOriginalClone()
+                       ->disableArgumentCloning()
+                       // New in phpunit-mock-objects 3.2 (phpunit 5.4.0)
+                       // ->disallowMockingUnknownTypes()
+                       ->getMock();
+       }
+}