Merge "Don't modify $wgHooks on language object construction"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 11 Feb 2016 04:05:56 +0000 (04:05 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 11 Feb 2016 04:05:56 +0000 (04:05 +0000)
1  2 
includes/page/WikiPage.php
languages/Language.php
languages/classes/LanguageGan.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUz.php
languages/classes/LanguageZh.php

@@@ -21,7 -21,7 +21,7 @@@
   */
  
  /**
 - * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
 + * Interface for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
   */
  interface Page {
  }
@@@ -1793,8 -1793,6 +1793,8 @@@ class WikiPage implements Page, IDBAcce
  
                $changed = !$content->equals( $oldContent );
  
 +              $dbw = wfGetDB( DB_MASTER );
 +
                if ( $changed ) {
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
                                return $status;
                        }
  
 -                      $dbw = wfGetDB( DB_MASTER );
 -                      $dbw->begin( __METHOD__ );
 +                      $dbw->startAtomic( __METHOD__ );
                        // Get the latest page_latest value while locking it.
                        // Do a CAS style check to see if it's the same as when this method
                        // started. If it changed then bail out before touching the DB.
                        $latestNow = $this->lockAndGetLatest();
                        if ( $latestNow != $oldid ) {
 -                              $dbw->commit( __METHOD__ );
 +                              $dbw->endAtomic( __METHOD__ );
                                // Page updated or deleted in the mean time
                                $status->fatal( 'edit-conflict' );
  
  
                        $user->incEditCount();
  
 -                      $dbw->commit( __METHOD__ );
 +                      $dbw->endAtomic( __METHOD__ );
                        $this->mTimestamp = $now;
                } else {
                        // Bug 32948: revision ID must be set to page {{REVISIONID}} and
                        $revision->setId( $this->getLatest() );
                }
  
 -              // Update links tables, site stats, etc.
 -              $this->doEditUpdates(
 -                      $revision,
 -                      $user,
 -                      array(
 -                              'changed' => $changed,
 -                              'oldcountable' => $meta['oldCountable'],
 -                              'oldrevision' => $meta['oldRevision']
 -                      )
 -              );
 -
                if ( $changed ) {
                        // Return the new revision to the caller
                        $status->value['revision'] = $revision;
                        $this->mTitle->invalidateCache( $now );
                }
  
 -              // Trigger post-save hook
 -              $hook_args = array( &$this, &$user, $content, $summary,
 -                      $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
 -              ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
 -              Hooks::run( 'PageContentSaveComplete', $hook_args );
 +              // Do secondary updates once the main changes have been committed...
 +              $that = $this;
 +              $dbw->onTransactionIdle(
 +                      function () use (
 +                              $dbw, &$that, $revision, &$user, $content, $summary, &$flags,
 +                              $changed, $meta, &$status
 +                      ) {
 +                              // Do per-page updates in a transaction
 +                              $dbw->setFlag( DBO_TRX );
 +                              // Update links tables, site stats, etc.
 +                              $that->doEditUpdates(
 +                                      $revision,
 +                                      $user,
 +                                      array(
 +                                              'changed' => $changed,
 +                                              'oldcountable' => $meta['oldCountable'],
 +                                              'oldrevision' => $meta['oldRevision']
 +                                      )
 +                              );
 +                              // Trigger post-save hook
 +                              $params = array( &$that, &$user, $content, $summary, $flags & EDIT_MINOR,
 +                                      null, null, &$flags, $revision, &$status, $meta['baseRevId'] );
 +                              ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $params );
 +                              Hooks::run( 'PageContentSaveComplete', $params );
 +                      }
 +              );
  
                return $status;
        }
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgRCWatchCategoryMembership;
+               global $wgRCWatchCategoryMembership, $wgContLang;
  
                $options += array(
                        'changed' => true,
                        }
  
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $this->mTitle );
+                       }
                }
  
                if ( $options['created'] ) {
         * @param Title $title
         */
        public static function onArticleDelete( Title $title ) {
+               global $wgContLang;
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
  
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
                        MessageCache::singleton()->replace( $title->getDBkey(), false );
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $title );
+                       }
                }
  
                // Images
diff --combined languages/Language.php
@@@ -383,13 -383,20 +383,13 @@@ class Language 
         * @return bool
         */
        public static function isKnownLanguageTag( $tag ) {
 -              static $coreLanguageNames;
 -
                // Quick escape for invalid input to avoid exceptions down the line
                // when code tries to process tags which are not valid at all.
                if ( !self::isValidBuiltInCode( $tag ) ) {
                        return false;
                }
  
 -              if ( $coreLanguageNames === null ) {
 -                      global $IP;
 -                      include "$IP/languages/Names.php";
 -              }
 -
 -              if ( isset( $coreLanguageNames[$tag] )
 +              if ( isset( MediaWiki\Languages\Data\Names::$names[$tag] )
                        || self::fetchLanguageName( $tag, $tag ) !== ''
                ) {
                        return true;
         */
        private static function fetchLanguageNamesUncached( $inLanguage = null, $include = 'mw' ) {
                global $wgExtraLanguageNames;
 -              static $coreLanguageNames;
 -
 -              if ( $coreLanguageNames === null ) {
 -                      global $IP;
 -                      include "$IP/languages/Names.php";
 -              }
  
                // If passed an invalid language code to use, fallback to en
                if ( $inLanguage !== null && !Language::isValidCode( $inLanguage ) ) {
                        Hooks::run( 'LanguageGetTranslatedLanguageNames', array( &$names, $inLanguage ) );
                }
  
 -              $mwNames = $wgExtraLanguageNames + $coreLanguageNames;
 +              $mwNames = $wgExtraLanguageNames + MediaWiki\Languages\Data\Names::$names;
                foreach ( $mwNames as $mwCode => $mwName ) {
                        # - Prefer own MediaWiki native name when not using the hook
                        # - For other names just add if not added through the hook
                return $this->mConverter->getParsedTitle();
        }
  
+       /**
+        * Refresh the cache of conversion tables when
+        * MediaWiki:Conversiontable* is updated.
+        *
+        * @param Title $titleobj The Title of the page being updated
+        */
+       public function updateConversionTable( Title $title ) {
+               $this->mConverter->updateConversionTable( $title );
+       }
        /**
         * Prepare external link text for conversion. When the text is
         * a URL, it shouldn't be converted, and it'll be wrapped in
@@@ -21,6 -21,9 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -require_once __DIR__ . '/LanguageZh.php';
 -
  /**
   * @ingroup Language
   */
@@@ -54,9 -57,10 +54,9 @@@ class GanConverter extends LanguageConv
        }
  
        function loadDefaultTables() {
 -              require __DIR__ . '/../../includes/ZhConversion.php';
                $this->mTables = array(
 -                      'gan-hans' => new ReplacementArray( $zh2Hans ),
 -                      'gan-hant' => new ReplacementArray( $zh2Hant ),
 +                      'gan-hans' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hans ),
 +                      'gan-hant' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hant ),
                        'gan' => new ReplacementArray
                );
        }
@@@ -78,7 -82,6 +78,6 @@@
   */
  class LanguageGan extends LanguageZh {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'gan', 'gan-hans', 'gan-hant' );
@@@ -95,8 -98,6 +94,6 @@@
                        $variants, $variantfallbacks,
                        array(),
                        $ml );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  
        /**
@@@ -21,6 -21,8 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -
  /**
   * Conversion script between Latin and Syllabics for Inuktitut.
   * - Syllabics -> lowercase Latin
@@@ -190,8 -192,6 +190,6 @@@ class IuConverter extends LanguageConve
   */
  class LanguageIu extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'iu', 'ike-cans', 'ike-latn' );
  
                $flags = array();
                $this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  }
@@@ -21,6 -21,9 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -require_once __DIR__ . '/LanguageKk_cyrl.php';
 -
  define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
  define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
  define( 'KK_L_UC', 'AÄBCÇDEÉFGĞHIİÏJKLMNÑOÖPQRSŞTUÜVWXYÝZ' ); # Kazakh Latin uppercase
@@@ -392,7 -395,6 +392,6 @@@ class KkConverter extends LanguageConve
   */
  class LanguageKk extends LanguageKk_cyrl {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
                );
  
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  
        /**
@@@ -21,6 -21,9 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -require_once __DIR__ . '/LanguageKu_ku.php';
 -
  /**
   * Kurdish converter routines
   *
@@@ -230,7 -233,6 +230,6 @@@ class KuConverter extends LanguageConve
  class LanguageKu extends LanguageKu_ku {
  
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'ku', 'ku-arab', 'ku-latn' );
                );
  
                $this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  }
@@@ -21,6 -21,8 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -
  /**
   * Conversion script between Latin and Tifinagh for Tachelhit.
   * - Tifinagh -> lowercase Latin
@@@ -166,8 -168,6 +166,6 @@@ class ShiConverter extends LanguageConv
   */
  class LanguageShi extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'shi', 'shi-tfng', 'shi-latn' );
  
                $flags = array();
                $this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  }
@@@ -21,6 -21,8 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -
  /**
   * There are two levels of conversion for Serbian: the script level
   * (Cyrillics <-> Latin), and the variant level (ekavian
@@@ -198,8 -200,6 +198,6 @@@ class SrConverter extends LanguageConve
   */
  class LanguageSr extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'sr', 'sr-ec', 'sr-el' );
                        'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
                );
                $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  }
@@@ -21,6 -21,8 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -
  /**
   * @ingroup Language
   */
@@@ -132,7 -134,6 +132,6 @@@ class UzConverter extends LanguageConve
   */
  class LanguageUz extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
                );
  
                $this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  }
@@@ -21,6 -21,9 +21,6 @@@
   * @ingroup Language
   */
  
 -require_once __DIR__ . '/../LanguageConverter.php';
 -require_once __DIR__ . '/LanguageZh_hans.php';
 -
  /**
   * @ingroup Language
   */
@@@ -60,15 -63,16 +60,15 @@@ class ZhConverter extends LanguageConve
        }
  
        function loadDefaultTables() {
 -              require __DIR__ . "/../../includes/ZhConversion.php";
                $this->mTables = array(
 -                      'zh-hans' => new ReplacementArray( $zh2Hans ),
 -                      'zh-hant' => new ReplacementArray( $zh2Hant ),
 -                      'zh-cn' => new ReplacementArray( $zh2CN ),
 -                      'zh-hk' => new ReplacementArray( $zh2HK ),
 -                      'zh-mo' => new ReplacementArray( $zh2HK ),
 -                      'zh-my' => new ReplacementArray( $zh2CN ),
 -                      'zh-sg' => new ReplacementArray( $zh2CN ),
 -                      'zh-tw' => new ReplacementArray( $zh2TW ),
 +                      'zh-hans' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hans ),
 +                      'zh-hant' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2Hant ),
 +                      'zh-cn' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
 +                      'zh-hk' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2HK ),
 +                      'zh-mo' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2HK ),
 +                      'zh-my' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
 +                      'zh-sg' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2CN ),
 +                      'zh-tw' => new ReplacementArray( MediaWiki\Languages\Data\ZhConversion::$zh2TW ),
                        'zh' => new ReplacementArray
                );
        }
   */
  class LanguageZh extends LanguageZh_hans {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
  
                $variants = array(
                                                                $variants, $variantfallbacks,
                                                                array(),
                                                                $ml );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
  
        /**