* The MediaWiki namespace is no longer pre-filled with default messages on install...
authorTim Starling <tstarling@users.mediawiki.org>
Fri, 5 Jan 2007 18:08:29 +0000 (18:08 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Fri, 5 Jan 2007 18:08:29 +0000 (18:08 +0000)
* Swapped the order of dimensions in the 2-d array $wgMessageCache->mExtensionMessages.

RELEASE-NOTES
config/index.php
includes/MessageCache.php
maintenance/InitialiseMessages.inc [deleted file]
maintenance/deleteDefaultMessages.php [new file with mode: 0644]
maintenance/rebuildMessages.php [deleted file]
maintenance/updaters.inc

index c2cca1a..83a4f5d 100644 (file)
@@ -464,6 +464,10 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
 * (bug 8485) Correct Lingala number formatting
 * When links are underlined, the entire link text should be underlined, even
   if it contains elements with a background color set.
+* The MediaWiki namespace is no longer pre-filled with default messages on 
+  install. All default messages will be removed from the MediaWiki namespace 
+  on upgrade.
+
 
 == Languages updated ==
 
index a6e644b..53e77d4 100644 (file)
@@ -640,8 +640,6 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                require_once( "includes/Setup.php" );
                chdir( "config" );
 
-               require_once( "maintenance/InitialiseMessages.inc" );
-
                $wgTitle = Title::newFromText( "Installation script" );
                error_reporting( E_ALL );
                print "<li>Loading class: $dbclass";
@@ -909,8 +907,6 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                ) );
                        $revid = $revision->insertOn( $wgDatabase );
                        $article->updateRevisionOn( $wgDatabase, $revision );
-
-                       initialiseMessages( false, false, 'printListItem' );
                }
 
                /* Write out the config file now that all is well */
index dbae08d..fd79790 100644 (file)
 define( 'MSG_LOAD_TIMEOUT', 60);
 define( 'MSG_LOCK_TIMEOUT', 10);
 define( 'MSG_WAIT_TIMEOUT', 10);
+define( 'MSG_CACHE_VERSION', 1 );
 
 /**
  * Message cache
- * Performs various useful MediaWiki namespace-related functions
+ * Performs various MediaWiki namespace-related functions
  *
  * @package MediaWiki
  */
@@ -79,7 +80,7 @@ class MessageCache {
                if ( $hash == $localHash ) {
                        // All good, get the rest of it
                        $serialized = fread( $file, 10000000 );
-                       $this->mCache = unserialize( $serialized );
+                       $this->setCache( unserialize( $serialized ) );
                }
                fclose( $file );
        }
@@ -130,6 +131,7 @@ class MessageCache {
                        return;
                }
                require("$wgLocalMessageCache/messages-" . wfWikiID());
+               $this->setCache( $this->mCache);
        }
        
        function saveToScript($array, $hash) {
@@ -161,6 +163,17 @@ class MessageCache {
                return $string;
        }
 
+       /**
+        * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
+        */
+       function setCache( $cache ) {
+               if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
+                       $this->mCache = $cache;
+               } else {
+                       $this->mCache = false;
+               }
+       }
+
        /**
         * Loads messages either from memcached or the database, if not disabled
         * On error, quietly switches to a fallback mode
@@ -177,110 +190,104 @@ class MessageCache {
                        }
                        return true;
                }
+               if ( !$this->mUseCache ) {
+                       $this->mDeferred = false;
+                       return true;
+               }
+
                $fname = 'MessageCache::load';
                wfProfileIn( $fname );
                $success = true;
 
-               if ( $this->mUseCache ) {
-                       $this->mCache = false;
+               $this->mCache = false;
 
-                       # Try local cache
-                       wfProfileIn( $fname.'-fromlocal' );
-                       $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" );
-                       if ( $hash ) {
-                               if ($wgLocalMessageCacheSerialized) {
-                                       $this->loadFromLocal( $hash );
-                               } else {
-                                       $this->loadFromScript( $hash );
-                               }
-                               if ( $this->mCache ) {
-                                       wfDebug( "MessageCache::load(): got from local cache\n" );
-                               }
+               # Try local cache
+               wfProfileIn( $fname.'-fromlocal' );
+               $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" );
+               if ( $hash ) {
+                       if ($wgLocalMessageCacheSerialized) {
+                               $this->loadFromLocal( $hash );
+                       } else {
+                               $this->loadFromScript( $hash );
                        }
-                       wfProfileOut( $fname.'-fromlocal' );
-
-                       # Try memcached
-                       if ( !$this->mCache ) {
-                               wfProfileIn( $fname.'-fromcache' );
-                               $this->mCache = $this->mMemc->get( $this->mMemcKey );
-                               if ( $this->mCache ) {
-                                       wfDebug( "MessageCache::load(): got from global cache\n" );
-                                       # Save to local cache
-                                       if ( $wgLocalMessageCache !== false ) {
-                                               $serialized = serialize( $this->mCache );
-                                               if ( !$hash ) {
-                                                       $hash = md5( $serialized );
-                                                       $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
-                                               }
-                                               if ($wgLocalMessageCacheSerialized) {
-                                                       $this->saveToLocal( $serialized,$hash );
-                                               } else {
-                                                       $this->saveToScript( $this->mCache, $hash );
-                                               }
-                                       }
-                               }
-                               wfProfileOut( $fname.'-fromcache' );
+                       if ( $this->mCache ) {
+                               wfDebug( "MessageCache::load(): got from local cache\n" );
                        }
-
-
-                       # If there's nothing in memcached, load all the messages from the database
-                       if ( !$this->mCache ) {
-                               wfDebug( "MessageCache::load(): loading all messages\n" );
-                               $this->lock();
-                               # Other threads don't need to load the messages if another thread is doing it.
-                               $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT );
-                               if ( $success ) {
-                                       wfProfileIn( $fname.'-load' );
-                                       $this->loadFromDB();
-                                       wfProfileOut( $fname.'-load' );
-
-                                       # Save in memcached
-                                       # Keep trying if it fails, this is kind of important
-                                       wfProfileIn( $fname.'-save' );
-                                       for ($i=0; $i<20 &&
-                                                  !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
-                                            $i++ ) {
-                                               usleep(mt_rand(500000,1500000));
-                                       }
-
-                                       # Save to local cache
-                                       if ( $wgLocalMessageCache !== false ) {
-                                               $serialized = serialize( $this->mCache );
+               }
+               wfProfileOut( $fname.'-fromlocal' );
+
+               # Try memcached
+               if ( !$this->mCache ) {
+                       wfProfileIn( $fname.'-fromcache' );
+                       $this->setCache( $this->mMemc->get( $this->mMemcKey ) );
+                       if ( $this->mCache ) {
+                               wfDebug( "MessageCache::load(): got from global cache\n" );
+                               # Save to local cache
+                               if ( $wgLocalMessageCache !== false ) {
+                                       $serialized = serialize( $this->mCache );
+                                       if ( !$hash ) {
                                                $hash = md5( $serialized );
                                                $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
-                                               if ($wgLocalMessageCacheSerialized) {
-                                                       $this->saveToLocal( $serialized,$hash );
-                                               } else {
-                                                       $this->saveToScript( $this->mCache, $hash );
-                                               }
                                        }
-
-                                       wfProfileOut( $fname.'-save' );
-                                       if ( $i == 20 ) {
-                                               $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 );
-                                               wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
+                                       if ($wgLocalMessageCacheSerialized) {
+                                               $this->saveToLocal( $serialized,$hash );
+                                       } else {
+                                               $this->saveToScript( $this->mCache, $hash );
                                        }
                                }
-                               $this->unlock();
                        }
+                       wfProfileOut( $fname.'-fromcache' );
+               }
+
+
+               # If there's nothing in memcached, load all the messages from the database
+               if ( !$this->mCache ) {
+                       wfDebug( "MessageCache::load(): cache is empty\n" );
+                       $this->lock();
+                       # Other threads don't need to load the messages if another thread is doing it.
+                       $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT );
+                       if ( $success ) {
+                               wfProfileIn( $fname.'-load' );
+                               wfDebug( "MessageCache::load(): loading all messages from DB\n" );
+                               $this->loadFromDB();
+                               wfProfileOut( $fname.'-load' );
+
+                               # Save in memcached
+                               # Keep trying if it fails, this is kind of important
+                               wfProfileIn( $fname.'-save' );
+                               for ($i=0; $i<20 &&
+                                                  !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
+                                        $i++ ) {
+                                       usleep(mt_rand(500000,1500000));
+                               }
 
-                       if ( !is_array( $this->mCache ) ) {
-                               wfDebug( "MessageCache::load(): individual message mode\n" );
-                               # If it is 'loading' or 'error', switch to individual message mode, otherwise disable
-                               # Causing too much DB load, disabling -- TS
-                               $this->mDisable = true;
-                               /*
-                               if ( $this->mCache == "loading" ) {
-                                       $this->mUseCache = false;
-                               } elseif ( $this->mCache == "error" ) {
-                                       $this->mUseCache = false;
-                                       $success = false;
+                               # Save to local cache
+                               if ( $wgLocalMessageCache !== false ) {
+                                       $serialized = serialize( $this->mCache );
+                                       $hash = md5( $serialized );
+                                       $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
+                                       if ($wgLocalMessageCacheSerialized) {
+                                               $this->saveToLocal( $serialized,$hash );
+                                       } else {
+                                               $this->saveToScript( $this->mCache, $hash );
+                                       }
+                               }
+
+                               wfProfileOut( $fname.'-save' );
+                               if ( $i == 20 ) {
+                                       $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 );
+                                       wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
                                } else {
-                                       $this->mDisable = true;
-                                       $success = false;
-                               }*/
-                               $this->mCache = false;
+                                       $this->mMemc->delete( $this->mMemcKey.'-status' );
+                               }
                        }
+                       $this->unlock();
+               }
+
+               if ( !is_array( $this->mCache ) ) {
+                       wfDebug( "MessageCache::load(): unable to load cache, disabled\n" );
+                       $this->mDisable = true;
+                       $this->mCache = false;
                }
                wfProfileOut( $fname );
                $this->mDeferred = false;
@@ -291,48 +298,42 @@ class MessageCache {
         * Loads all or main part of cacheable messages from the database
         */
        function loadFromDB() {
-               global $wgLang;
+               global $wgLang, $wgMaxMsgCacheEntrySize;
 
-               $fname = 'MessageCache::loadFromDB';
+               wfProfileIn( __METHOD__ );
                $dbr =& wfGetDB( DB_SLAVE );
-               if ( !$dbr ) {
-                       throw new MWException( 'Invalid database object' );
-               }
-               $res = $dbr->select( array( 'page', 'revision', 'text' ),
-                       array( 'page_title', 'old_text', 'old_flags' ),
-                       'page_is_redirect=0 AND page_namespace='.NS_MEDIAWIKI.' AND page_latest=rev_id AND rev_text_id=old_id',
-                       $fname
-               );
-
                $this->mCache = array();
-               for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {
-                       $this->mCache[$row->page_title] = Revision::getRevisionText( $row );
-               }
 
-               # Negative caching
-               # Go through the language array and the extension array and make a note of
-               # any keys missing from the cache
-               $allMessages = Language::getMessagesFor( 'en' );
-               foreach ( $allMessages as $key => $unused ) {
-                       $uckey = $wgLang->ucfirst( $key );
-                       if ( !array_key_exists( $uckey, $this->mCache ) ) {
-                               $this->mCache[$uckey] = false;
-                       }
+               # Load titles for all oversized pages in the MediaWiki namespace
+               $res = $dbr->select( 'page', 'page_title',
+                       array( 
+                               'page_len > ' . intval( $wgMaxMsgCacheEntrySize ),
+                               'page_is_redirect' => 0,
+                               'page_namespace' => NS_MEDIAWIKI,
+                       ), 
+                       __METHOD__ );
+               while ( $row = $dbr->fetchObject( $res ) ) {
+                       $this->mCache[$row->page_title] = '!TOO BIG';
                }
+               $dbr->freeResult( $res );
 
-               # Make sure all extension messages are available
-               MessageCache::loadAllMessages();
+               # Load text for the remaining pages
+               $res = $dbr->select( array( 'page', 'revision', 'text' ),
+                       array( 'page_title', 'old_text', 'old_flags' ),
+                       array( 
+                               'page_is_redirect' => 0,
+                               'page_namespace' => NS_MEDIAWIKI,
+                               'page_latest=rev_id',
+                               'rev_text_id=old_id',
+                               'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ) ), 
+                       __METHOD__ );
 
-               # Add them to the cache
-               foreach ( $this->mExtensionMessages as $key => $unused ) {
-                       $uckey = $wgLang->ucfirst( $key );
-                       if ( !array_key_exists( $uckey, $this->mCache ) &&
-                        ( isset( $this->mExtensionMessages[$key][$wgLang->getCode()] ) || isset( $this->mExtensionMessages[$key]['en'] ) )  ) {
-                               $this->mCache[$uckey] = false;
-                       }
+               for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {
+                       $this->mCache[$row->page_title] = ' ' . Revision::getRevisionText( $row );
                }
-
+               $this->mCache['VERSION'] = MSG_CACHE_VERSION;
                $dbr->freeResult( $res );
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -351,21 +352,26 @@ class MessageCache {
                return $this->mKeys;
        }
 
-       /**
-        * @deprecated
-        */
-       function isCacheable( $key ) {
-               return true;
-       }
-
        function replace( $title, $text ) {
                global $wgLocalMessageCache, $wgLocalMessageCacheSerialized, $parserMemc;
+               global $wgMaxMsgCacheEntrySize;
 
+               wfProfileIn( __METHOD__ );
                $this->lock();
                $this->load();
                $parserMemc->delete(wfMemcKey('sidebar'));
                if ( is_array( $this->mCache ) ) {
-                       $this->mCache[$title] = $text;
+                       if ( $text === false ) {
+                               # Article was deleted
+                               unset( $this->mCache[$title] );
+                               $this->mMemc->delete( "$this->mMemcKey:{$title}" );
+                       } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
+                               $this->mCache[$title] = '!TOO BIG';
+                               $this->mMemc->set( "$this->mMemcKey:{$title}", ' '.$text, $this->mExpiry );
+                       } else {
+                               $this->mCache[$title] = ' ' . $text;
+                               $this->mMemc->delete( "$this->mMemcKey:{$title}" );
+                       }
                        $this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
 
                        # Save to local cache
@@ -379,10 +385,9 @@ class MessageCache {
                                        $this->saveToScript( $this->mCache, $hash );
                                }
                        }
-
-
                }
                $this->unlock();
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -411,9 +416,18 @@ class MessageCache {
                $this->mMemc->delete( $lockKey );
        }
 
-       function get( $key, $useDB = true, $forcontent = true, $isfullkey = false ) {
+       /**
+        * Get a message from either the content language or the user language.
+        *
+        * @param string $key The message cache key
+        * @param bool $useDB Get the message from the DB, false to use only the localisation
+        * @param bool $forContent Get the message from the content language rather than the 
+        *                         user language
+        * @param bool $isFullKey Specifies whether $key is a two part key "lang/msg".
+        */
+       function get( $key, $useDB = true, $forContent = true, $isFullKey = false ) {
                global $wgContLanguageCode, $wgContLang, $wgLang;
-               if( $forcontent ) {
+               if( $forContent ) {
                        $lang =& $wgContLang;
                } else {
                        $lang =& $wgLang;
@@ -429,20 +443,21 @@ class MessageCache {
                }
 
                $message = false;
+
+               # Try the MediaWiki namespace
                if( !$this->mDisable && $useDB ) {
                        $title = $wgContLang->ucfirst( $key );
-                       if(!$isfullkey && ($langcode != $wgContLanguageCode) ) {
+                       if(!$isFullKey && ($langcode != $wgContLanguageCode) ) {
                                $title .= '/' . $langcode;
                        }
-                       $message = $this->getFromCache( $title );
+                       $message = $this->getMsgFromNamespace( $title );
                }
                # Try the extension array
-               if( $message === false && array_key_exists( $key, $this->mExtensionMessages ) ) {
-                       if ( isset( $this->mExtensionMessages[$key][$langcode] ) ) {
-                               $message = $this->mExtensionMessages[$key][$langcode];
-                       } elseif ( isset( $this->mExtensionMessages[$key]['en'] ) ) {
-                               $message = $this->mExtensionMessages[$key]['en'];
-                       }
+               if( $message === false && isset( $this->mExtensionMessages[$langcode][$key] ) ) {
+                       $message = $this->mExtensionMessages[$langcode][$key];
+               }
+               if ( $message === false && isset( $this->mExtensionMessages['en'][$key] ) ) {
+                       $message = $this->mExtensionMessages['en'][$key];
                }
 
                # Try the array in the language object
@@ -474,8 +489,8 @@ class MessageCache {
                # Is this a custom message? Try the default language in the db...
                if( ($message === false || $message === '-' ) &&
                        !$this->mDisable && $useDB &&
-                       !$isfullkey && ($langcode != $wgContLanguageCode) ) {
-                       $message = $this->getFromCache( $wgContLang->ucfirst( $key ) );
+                       !$isFullKey && ($langcode != $wgContLanguageCode) ) {
+                       $message = $this->getMsgFromNamespace( $wgContLang->ucfirst( $key ) );
                }
 
                # Final fallback
@@ -488,46 +503,70 @@ class MessageCache {
                return $message;
        }
 
-       function getFromCache( $title ) {
+       /**
+        * Get a message from the MediaWiki namespace, with caching. The key must 
+        * first be converted to two-part lang/msg form if necessary.
+        *
+        * @param string $title Message cache key with initial uppercase letter
+        */
+       function getMsgFromNamespace( $title ) {
                $message = false;
+               $type = false;
 
                # Try the cache
-               if( $this->mUseCache && is_array( $this->mCache ) && array_key_exists( $title, $this->mCache ) ) {
-                       return $this->mCache[$title];
+               if( $this->mUseCache && isset( $this->mCache[$title] ) ) {
+                       $entry = $this->mCache[$title];
+                       $type = substr( $entry, 0, 1 );
+                       if ( $type == ' ' ) {
+                               return substr( $entry, 1 );
+                       }
+               }
+
+               # Call message hooks, in case they are defined
+               wfRunHooks('MessagesPreLoad', array( $title, &$message ) );
+               if ( $message !== false ) {
+                       return $message;
+               }
+
+               # If there is no cache entry and no placeholder, it doesn't exist
+               if ( $type != '!' && $message === false ) {
+                       return false;
                }
 
-               # Try individual message cache
+               $memcKey = $this->mMemcKey . ':' . $title;
+
+               # Try the individual message cache
                if ( $this->mUseCache ) {
-                       $message = $this->mMemc->get( $this->mMemcKey . ':' . $title );
-                       if ( $message == '###NONEXISTENT###' ) {
-                               $this->mCache[$title] = false;
-                               return false;
-                       } elseif( !is_null( $message ) ) {
-                               $this->mCache[$title] = $message;
-                               return $message;
-                       } else {
-                               $message = false;
+                       $entry = $this->mMemc->get( $memcKey );
+                       if ( $entry ) {
+                               $type = substr( $entry, 0, 1 );
+
+                               if ( $type == ' ' ) {
+                                       $message = substr( $entry, 1 );
+                                       $this->mCache[$title] = $message;
+                                       return $message;
+                               } elseif ( $entry == '!NONEXISTENT' ) {
+                                       return false;
+                               } else {
+                                       # Corrupt/obsolete entry, delete it
+                                       $this->mMemc->delete( $memcKey );
+                               }
+
                        }
                }
 
-               # Call message Hooks, in case they are defined
-               wfRunHooks('MessagesPreLoad',array($title,&$message));
-
-               # If it wasn't in the cache, load each message from the DB individually
+               # Try loading it from the DB
                $revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
                if( $revision ) {
                        $message = $revision->getText();
                        if ($this->mUseCache) {
-                               $this->mCache[$title]=$message;
-                               /* individual messages may be often
-                                  recached until proper purge code exists
-                               */
-                               $this->mMemc->set( $this->mMemcKey . ':' . $title, $message, 300 );
+                               $this->mCache[$title] = ' ' . $message;
+                               $this->mMemc->set( $memcKey, $message, $this->mExpiry );
                        }
                } else {
                        # Negative caching
                        # Use some special text instead of false, because false gets converted to '' somewhere
-                       $this->mMemc->set( $this->mMemcKey . ':' . $title, '###NONEXISTENT###', $this->mExpiry );
+                       $this->mMemc->set( $memcKey, '!NONEXISTENT', $this->mExpiry );
                        $this->mCache[$title] = false;
                }
 
@@ -565,7 +604,7 @@ class MessageCache {
         * @param string $lang The messages language, English by default
         */
        function addMessage( $key, $value, $lang = 'en' ) {
-               $this->mExtensionMessages[$key][$lang] = $value;
+               $this->mExtensionMessages[$lang][$key] = $value;
        }
 
        /**
@@ -576,8 +615,10 @@ class MessageCache {
         */
        function addMessages( $messages, $lang = 'en' ) {
                wfProfileIn( __METHOD__ );
-               foreach ( $messages as $key => $value ) {
-                       $this->addMessage( $key, $value, $lang );
+               if ( isset( $this->mExtensionMessages[$lang] ) ) {
+                       $this->mExtensionMessages[$lang] = $messages + $this->mExtensionMessages[$lang];
+               } else {
+                       $this->mExtensionMessages[$lang] = $messages;
                }
                wfProfileOut( __METHOD__ );
        }
@@ -590,12 +631,11 @@ class MessageCache {
        function getExtensionMessagesFor( $lang = 'en' ) {
                wfProfileIn( __METHOD__ );
                $messages = array();
-               foreach( $this->mExtensionMessages as $key => $message ) {
-                       if ( isset( $message[$lang] ) ) {
-                               $messages[$key] = $message[$lang];
-                       } elseif ( isset( $message['en'] ) ) {
-                               $messages[$key] = $message['en'];
-                       }
+               if ( isset( $this->mExtensionMessages[$lang] ) ) {
+                       $messages = $this->mExtensionMessages[$lang];
+               }
+               if ( $lang != 'en' ) {
+                       $messages = $messages + $this->mExtensionMessages['en'];
                }
                wfProfileOut( __METHOD__ );
                return $messages;
diff --git a/maintenance/InitialiseMessages.inc b/maintenance/InitialiseMessages.inc
deleted file mode 100644 (file)
index d711aa7..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-/**
- * Script to initialise the MediaWiki namespace
- *
- * This script is included from update.php and install.php. Do not run it
- * by itself.
- *
- * @deprecated
- * @package MediaWiki
- * @subpackage Maintenance
- */
-
-/** */
-function initialiseMessages( $overwrite = false, $messageArray = false, $outputCallback = false ) {
-       global $wgContLang, $wgContLanguageCode;
-       global $wgContLangClass;
-       global $wgDisableLangConversion;
-       global $wgForceUIMsgAsContentMsg;
-       global $wgLanguageNames;
-       global $IP;
-
-       # overwrite language conversion option so that all variants
-       # of the messages are initialised
-       $wgDisableLangConversion = false;
-
-       if ( $messageArray ) {
-               $sortedArray = $messageArray;
-       } else {
-               $sortedArray = Language::getMessagesFor( 'en' );
-       }
-
-       ksort( $sortedArray );
-       $messages=array();
-
-       $variants = $wgContLang->getVariants();
-       if(!in_array($wgContLanguageCode, $variants))
-               $variants[]=$wgContLanguageCode;
-
-       foreach ($variants as $v) {
-               $lang = Language::factory( $v );
-
-               if($v==$wgContLanguageCode)
-                       $suffix='';
-               else
-                       $suffix="/$v";
-               foreach ($sortedArray as $key => $msg) {
-                       $messages[$key.$suffix] = $lang->getMessage($key);
-               }
-       }
-
-       require_once('languages/Names.php');
-
-    /*
-         initialize all messages in $wgForceUIMsgAsContentMsg for all
-         languages in Names.php
-    */
-       if( is_array( $wgForceUIMsgAsContentMsg ) ) {
-               foreach( $wgForceUIMsgAsContentMsg as $uikey ) {
-                       foreach( $wgLanguageNames as $code => $name) {
-                               if( $code == $wgContLanguageCode )
-                                       continue;
-                               $msg = $wgContLang->getMessage( $uikey );
-                               if( $msg )
-                                       $messages[$uikey. '/' . $code] = $msg;
-                       }
-               }
-       }
-       initialiseMessagesReal( $overwrite, $messages, $outputCallback );
-}
-
-/** */
-function initialiseMessagesReal( $overwrite = false, $messageArray = false, $outputCallback = false ) {
-       global $wgContLang, $wgScript, $wgServer, $wgLanguageCode;
-       global $wgOut, $wgArticle, $wgUser;
-       global $wgMessageCache, $wgMemc, $wgUseMemCached;
-
-       # Initialise $wgOut and $wgUser for a command line script
-       $wgOut->disable();
-
-       $wgUser = User::newFromName( 'MediaWiki default' );
-       if ( $wgUser->isAnon() ) {
-               $wgUser->addToDatabase();
-       }
-
-       # Don't try to draw messages from the database we're initialising
-       $wgMessageCache->disable();
-       $wgMessageCache->disableTransform();
-
-       $fname = 'initialiseMessages';
-       $ns = NS_MEDIAWIKI;
-       # username responsible for the modifications
-       # Don't change it unless you're prepared to update the DBs accordingly, otherwise the
-       # default messages won't be overwritten
-       $username = 'MediaWiki default';
-
-       if ( !$outputCallback ) {
-               # Print is not a function, and there doesn't appear to be any built-in 
-               # workalikes, so let's just make our own anonymous function to do the 
-               # same thing. 
-               $outputCallback = create_function( '$s', 'print $s;' );
-       }
-
-       $outputCallback( "Initialising \"MediaWiki\" namespace for language code $wgLanguageCode...\n" );
-
-       # Check that the serialized data files are OK
-       if ( Language::isLocalisationOutOfDate( $wgLanguageCode ) ) {
-               $outputCallback( "Warning: serialized data file may be out of date.\n" );
-       }
-
-       $dbr =& wfGetDB( DB_SLAVE );
-       $dbw =& wfGetDB( DB_MASTER );
-       $page = $dbr->tableName( 'page' );
-       $revision = $dbr->tableName( 'revision' );
-
-       $timestamp = wfTimestampNow();
-
-       $first = true;
-       if ( $messageArray ) {
-               $sortedArray = $messageArray;
-       } else {
-               $sortedArray = $wgContLang->getAllMessages();
-       }
-
-       ksort( $sortedArray );
-
-       # SELECT all existing messages
-       # Can't afford to be locking all rows for update, this script can take quite a long time to complete
-       $rows = array();
-       $nitems = count($sortedArray);
-       $maxitems = $dbr->maxListLen();
-       $pos = 0;
-       if ($maxitems)
-               $chunks = array_chunk($sortedArray, $maxitems);
-       else
-               $chunks = array($sortedArray);
-
-       foreach ($chunks as $chunk) {
-               $first = true;
-               $sql = "SELECT page_title,page_is_new,rev_user_text FROM $page, $revision WHERE
-                       page_namespace=$ns AND rev_id=page_latest AND page_title IN(";
-
-               foreach ( $chunk as $key => $enMsg ) {
-                       if ( $key == '' ) {
-                               continue; // Skip odd members
-                       }
-                       if ( $first ) {
-                               $first = false;
-                       } else {
-                               $sql .= ',';
-                       }
-                       $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ) );
-                       $enctitle = $dbr->strencode($titleObj->getDBkey());
-                       $sql .= "'$enctitle'";
-               }
-
-               $sql .= ')';
-               $res = $dbr->query( $sql );
-               while ($row = $dbr->fetchObject($res))
-                       $rows[] = $row;
-       }
-
-       # Read the results into an array
-       # Decide whether or not each one needs to be overwritten
-       $existingTitles = array();
-       foreach ($rows as $row) {
-               if ( $row->rev_user_text != $username  && $row->rev_user_text != 'Template namespace initialisation script' ) {
-                       $existingTitles[$row->page_title] = 'keep';
-               } else {
-                       $existingTitles[$row->page_title] = 'chuck';
-               }
-       }
-
-       # Insert queries are done in one multi-row insert
-       # Here's the start of it:
-       $arr = array();
-       $talk = $wgContLang->getNsText( NS_TALK );
-       $mwtalk = $wgContLang->getNsText( NS_MEDIAWIKI_TALK );
-
-       $numUpdated = 0;
-       $numKept = 0;
-       $numInserted = 0;
-       
-       # Merge these into a single transaction for speed
-       $dbw->begin();
-
-       # Process each message
-       foreach ( $sortedArray as $key => $message ) {
-               if ( $key == '' ) {
-                       continue; // Skip odd members
-               }
-               # Get message text
-               if ( !$messageArray ) {
-                       $message = wfMsgNoDBForContent( $key );
-               }
-               if ( is_null( $message ) ) {
-                       # This happens sometimes with out of date serialized data files
-                       $outputCallback( "Warning: Skipping null message $key\n" );
-                       continue;
-               }
-
-               $titleObj = Title::newFromText( $wgContLang->ucfirst( $key ), NS_MEDIAWIKI );
-               $title = $titleObj->getDBkey();
-
-               # Update messages which already exist
-               if ( array_key_exists( $title, $existingTitles ) ) {
-                       if ( $existingTitles[$title] == 'chuck' || $overwrite) {
-                               # Don't bother writing a new revision if we're the same
-                               # as the current text!
-                               $revision = Revision::newFromTitle( $titleObj );
-                               if( is_null( $revision ) || $revision->getText() != $message ) {
-                                       $article = new Article( $titleObj );
-                                       $article->quickEdit( $message );
-                                       ++$numUpdated;
-                               } else {
-                                       ++$numKept;
-                               }
-                       } else {
-                               ++$numKept;
-                       }
-               } else {
-                       $article = new Article( $titleObj );
-                       $newid = $article->insertOn( $dbw );
-                       # FIXME: set restrictions
-                       $revision = new Revision( array(
-                               'page'      => $newid,
-                               'text'      => $message,
-                               'user'      => 0,
-                               'user_text' => $username,
-                               'comment'   => '',
-                               ) );
-                       $revid = $revision->insertOn( $dbw );
-                       $article->updateRevisionOn( $dbw, $revision );
-                       ++$numInserted;
-               }
-       }
-       $dbw->commit();
-
-       # Clear the relevant memcached key
-       $wgMessageCache->clear();
-       $outputCallback( "Done. Updated: $numUpdated, inserted: $numInserted, kept: $numKept.\n" );
-}
-
-/** */
-function loadLanguageFile( $filename ) {
-       $contents = file_get_contents( $filename );
-       # Remove header line
-       $p = strpos( $contents, "\n" ) + 1;
-       $contents = substr( $contents, $p );
-       # Unserialize
-       return unserialize( $contents );
-}
-
-/** */
-function doUpdates() {
-       global $wgDeferredUpdateList;
-       foreach ( $wgDeferredUpdateList as $up ) { $up->doUpdate(); }
-}
-?>
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
new file mode 100644 (file)
index 0000000..fdad54c
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Deletes all pages in the MediaWiki namespace which were last edited by 
+ * "MediaWiki default".
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       require_once( 'commandLine.inc' );
+       deleteDefaultMessages();
+}
+
+function deleteDefaultMessages() {
+       $user = 'MediaWiki default';
+       $reason = 'No longer required';
+
+       global $wgUser;
+       $wgUser = User::newFromName( $user );
+       $dbr =& wfGetDB( DB_SLAVE );
+       $res = $dbr->select( array( 'page', 'revision' ),
+               array( 'page_namespace', 'page_title' ),
+               array(
+                       'page_namespace' => NS_MEDIAWIKI,
+                       'page_latest=rev_id',
+                       'rev_user_text' => 'MediaWiki default',
+               )
+       );
+
+       $dbw =& wfGetDB( DB_MASTER );
+
+       while ( $row = $dbr->fetchObject( $res ) ) {
+               if ( function_exists( 'wfWaitForSlaves' ) ) {
+                       wfWaitForSlaves( 5 );
+               }
+               $dbw->ping();
+               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $article = new Article( $title );
+               $dbw->begin();
+               $article->doDeleteArticle( $reason );
+               $dbw->commit();
+       }
+}
+?>
diff --git a/maintenance/rebuildMessages.php b/maintenance/rebuildMessages.php
deleted file mode 100644 (file)
index d009098..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-/**
- * @todo document
- * @package MediaWiki
- * @subpackage Maintenance
- */
-
-/** */
-$options = array( 'update' => null, 'rebuild' => null );
-require_once( "commandLine.inc" );
-include_once( "InitialiseMessages.inc" );
-
-$wgTitle = Title::newFromText( "Rebuild messages script" );
-
-if ( isset( $args[0] ) ) {
-       # Retain script compatibility
-       $response = array_shift( $args );
-       if ( $response == "update" ) {
-               $response = 1;
-       } elseif ( $response == "rebuild" ) {
-               $response = 2;
-       }
-} else {
-       $response = 0;
-}
-if ( isset( $args[0] ) ) {
-       $messages = loadLanguageFile( array_shift( $args ) );
-} else {
-       $messages = false;
-}
-if( isset( $options['update'] ) ) $response = 1;
-if( isset( $options['rebuild'] ) ) $response = 2;
-
-if ( $response == 0 ) {
-       $dbr =& wfGetDB( DB_SLAVE );
-       $row = $dbr->selectRow( "page", array("count(*) as c"), array("page_namespace" => NS_MEDIAWIKI) );
-       print "Current namespace size: {$row->c}\n";
-
-       print <<<END
-Usage:   php rebuildMessages.php <action> [filename]
-
-Action must be one of:
-  --update   Update messages to include latest additions to MessagesXX.php
-  --rebuild  Delete all messages and reinitialise namespace
-
-If a message dump file is given, messages will be read from it to supplement
-the defaults in MediaWiki's Language*.php. The file should contain a serialized
-PHP associative array, as produced by dumpMessages.php.
-
-
-END;
-       exit(0);
-}
-
-switch ( $response ) {
-       case 1:
-               initialiseMessages( false, $messages );
-               break;
-       case 2:
-               initialiseMessages( true, $messages );
-               break;
-}
-
-exit();
-
-?>
index 1f474d0..7909b13 100644 (file)
@@ -6,9 +6,14 @@
 
  /** */
 
+if ( !defined( 'MEDIAWIKI' ) ) {
+       echo "This file is not a valid entry point\n";
+       exit( 1 );
+}
+
 require_once 'convertLinks.inc';
-require_once 'InitialiseMessages.inc';
 require_once 'userDupes.inc';
+require_once 'deleteDefaultMessages.php';
 
 $wgRenamedTables = array(
 #           from             to                  patch file
@@ -833,7 +838,7 @@ function purge_cache() {
 }
 
 function do_all_updates( $shared = false, $purge = true ) {
-       global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype;
+       global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype, $IP;
 
        $doUser = !$wgSharedDB || $doShared;
 
@@ -900,7 +905,9 @@ function do_all_updates( $shared = false, $purge = true ) {
        
        do_backlinking_indices_update(); flush();
 
-       initialiseMessages(); flush();
+       echo "Deleting old default messages..."; flush();
+       deleteDefaultMessages();
+       echo "Done\n"; flush();
        
        if( $purge ) {
                purge_cache();