moved transstat.php to maintenance/language/
[lhc/web/wiklou.git] / maintenance / InitialiseMessages.inc
old mode 100755 (executable)
new mode 100644 (file)
index f858083..22e26b9
@@ -2,7 +2,7 @@
 /**
  * Script to initialise the MediaWiki namespace
  *
- * This script is included from update.php and install.php. Do not run it 
+ * This script is included from update.php and install.php. Do not run it
  * by itself.
  *
  * @deprecated
  */
 
 /** */
-function initialiseMessages( $overwrite = false, $messageArray = false ) {
+function initialiseMessages( $overwrite = false, $messageArray = false, $outputCallback = false ) {
        global $wgContLang, $wgContLanguageCode;
-       global $wgContLangClass, $wgAllMessagesEn;
+       global $wgContLangClass;
        global $wgDisableLangConversion;
        global $wgForceUIMsgAsContentMsg;
        global $wgLanguageNames;
        global $IP;
 
-       # overwrite language conversion option so that all variants 
+       # overwrite language conversion option so that all variants
        # of the messages are initialised
        $wgDisableLangConversion = false;
 
        if ( $messageArray ) {
                $sortedArray = $messageArray;
        } else {
-               $sortedArray = $wgAllMessagesEn;
+               $sortedArray = Language::getMessagesFor( 'en' );
        }
-       
+
        ksort( $sortedArray );
        $messages=array();
 
@@ -37,11 +37,7 @@ function initialiseMessages( $overwrite = false, $messageArray = false ) {
                $variants[]=$wgContLanguageCode;
 
        foreach ($variants as $v) {
-               $langclass = 'Language'. str_replace( '-', '_', ucfirst( $v ) );
-               if( !class_exists($langclass) ) {
-                       die ("class $langclass not defined. perhaps you need to include the file $langclass.php in $wgContLangClass.php?");
-               }
-               $lang = new $langclass;
+               $lang = Language::factory( $v );
 
                if($v==$wgContLanguageCode)
                        $suffix='';
@@ -69,14 +65,14 @@ function initialiseMessages( $overwrite = false, $messageArray = false ) {
                        }
                }
        }
-       initialiseMessagesReal( $overwrite, $messages );
+       initialiseMessagesReal( $overwrite, $messages, $outputCallback );
 }
 
 /** */
-function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
-       global $wgContLang, $wgScript, $wgServer, $wgAllMessagesEn;
+function initialiseMessagesReal( $overwrite = false, $messageArray = false, $outputCallback = false ) {
+       global $wgContLang, $wgScript, $wgServer, $wgLanguageCode;
        global $wgOut, $wgArticle, $wgUser;
-       global $wgMessageCache, $wgMemc, $wgDBname, $wgUseMemCached;
+       global $wgMessageCache, $wgMemc, $wgUseMemCached;
 
        # Initialise $wgOut and $wgUser for a command line script
        $wgOut->disable();
@@ -84,22 +80,32 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
        $wgUser = new User;
        $wgUser->setLoaded( true ); # Don't load from DB
        $wgUser->setName( 'MediaWiki default' );
-       
+
        # Don't try to draw messages from the database we're initialising
        $wgMessageCache->disable();
        $wgMessageCache->disableTransform();
 
        $fname = 'initialiseMessages';
        $ns = NS_MEDIAWIKI;
-       # cur_user_text responsible for the modifications
-       # Don't change it unless you're prepared to update the DBs accordingly, otherwise the 
-       # default messages won't be overwritte
+       # 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';
 
-       
-       print "Initialising \"MediaWiki\" namespace...\n";
+       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' );
@@ -107,15 +113,13 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
 
        $timestamp = wfTimestampNow();
 
-       #$sql = "SELECT cur_title,cur_is_new,cur_user_text FROM $cur WHERE cur_namespace=$ns AND cur_title IN(";
-       # Get keys from $wgAllMessagesEn, which is more complete than the local language
        $first = true;
        if ( $messageArray ) {
                $sortedArray = $messageArray;
        } else {
-               $sortedArray = $wgAllMessagesEn;
+               $sortedArray = $wgContLang->getAllMessages();
        }
-       
+
        ksort( $sortedArray );
 
        # SELECT all existing messages
@@ -127,12 +131,12 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
        if ($maxitems)
                $chunks = array_chunk($sortedArray, $maxitems);
        else
-               $chucks = array($sortedArray);
+               $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_page=page_id AND page_title IN(";
+                       page_namespace=$ns AND rev_id=page_latest AND page_title IN(";
 
                foreach ( $chunk as $key => $enMsg ) {
                        if ( $key == '' ) {
@@ -153,7 +157,7 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
                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();
@@ -170,18 +174,29 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
        $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 => $enMsg ) {
+       foreach ( $sortedArray as $key => $message ) {
                if ( $key == '' ) {
                        continue; // Skip odd members
                }
                # Get message text
-               if ( $messageArray ) {
-                       $message = $enMsg;
-               } else {
+               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();
 
@@ -194,11 +209,16 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
                                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, 'sysop' );
+                       $newid = $article->insertOn( $dbw );
                        # FIXME: set restrictions
                        $revision = new Revision( array(
                                'page'      => $newid,
@@ -209,13 +229,14 @@ function initialiseMessagesReal( $overwrite = false, $messageArray = false ) {
                                ) );
                        $revid = $revision->insertOn( $dbw );
                        $article->updateRevisionOn( $dbw, $revision );
+                       ++$numInserted;
                }
        }
+       $dbw->commit();
 
        # Clear the relevant memcached key
-       print 'Clearing message cache...';
        $wgMessageCache->clear();
-       print "Done.\n";
+       $outputCallback( "Done. Updated: $numUpdated, inserted: $numInserted, kept: $numKept.\n" );
 }
 
 /** */