Move the check for if a Maintenance script supports --batch-size away from addDefault...
[lhc/web/wiklou.git] / maintenance / addwiki.php
index b9c4850..5ca3a0d 100644 (file)
 <?php
+/**
+ * @defgroup Wikimedia Wikimedia
+ */
+
 /**
  * Add a new wiki
  * Wikimedia specific!
  *
+ * 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.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup Maintenance
+ * @ingroup Wikimedia
  */
 
-$wgNoDBParam = true;
-
-require_once( "commandLine.inc" );
-require_once( "rebuildInterwiki.inc" );
-require_once( "languages/Names.php" );
-if ( count( $args ) != 3 ) {
-       wfDie( "Usage: php addwiki.php <language> <site> <dbname>\nThe site for Wikipedia is 'wikipedia'.\n" );
-}
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
-addWiki( $args[0], $args[1], $args[2] );
+class AddWiki extends Maintenance {
+       public function __construct() {
+               global $wgNoDBParam;
 
-# -----------------------------------------------------------------
+               parent::__construct();
+               $this->mDescription = "Add a new wiki to the family. Wikimedia specific!";
+               $this->addArg( 'language', 'Language code of new site, e.g. en' );
+               $this->addArg( 'site', 'Type of site, e.g. wikipedia' );
+               $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' );
+               $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' );
 
-function addWiki( $lang, $site, $dbName )
-{
-       global $IP, $wgLanguageNames, $wgDefaultExternalStore;
-
-       if ( !isset( $wgLanguageNames[$lang] ) ) {
-               print "Language $lang not found in \$wgLanguageNames\n";
-               return;
+               $wgNoDBParam = true;
        }
-       $name = $wgLanguageNames[$lang];
-
-       $dbw = wfGetDB( DB_MASTER );
-       $common = "/home/wikipedia/common";
-       $maintenance = "$IP/maintenance";
-
-       print "Creating database $dbName for $lang.$site ($name)\n";
-       
-       # Set up the database
-       $dbw->query( "SET table_type=Innodb" );
-       $dbw->query( "CREATE DATABASE $dbName" );
-       $dbw->selectDB( $dbName );
-
-       print "Initialising tables\n";
-       dbsource( "$maintenance/tables.sql", $dbw );
-       dbsource( "$IP/extensions/OAI/update_table.sql", $dbw );
-       dbsource( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql", $dbw );
-       dbsource( "$IP/extensions/CheckUser/cu_changes.sql", $dbw );
-       dbsource( "$IP/extensions/CheckUser/cu_log.sql", $dbw );
-       dbsource( "$IP/extensions/TitleKey/titlekey.sql", $dbw );
-       dbsource( "$IP/extensions/Oversight/hidden.sql", $dbw );
-
-       $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
-
-       # Initialise external storage
-       if ( is_array( $wgDefaultExternalStore ) ) {
-               $stores = $wgDefaultExternalStore;
-       } elseif ( $stores ) {
-               $stores = array( $wgDefaultExternalStore );
-       } else {
-               $stores = array();
+
+       public function getDbType() {
+               return Maintenance::DB_ADMIN;
        }
-       if ( count( $stores ) ) {
-               require_once( 'ExternalStoreDB.php' );
-               print "Initialising external storage $store...\n";
-               global $wgDBuser, $wgDBpassword, $wgExternalServers;
-               foreach ( $stores as $storeURL ) {
-                       $m = array();
-                       if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
-                               continue;
+
+       public function execute() {
+               global $IP, $wgDefaultExternalStore, $wmfVersionNumber;
+               if ( !$wmfVersionNumber ) { // set in CommonSettings.php
+                       $this->error( '$wmfVersionNumber is not set, please use MWScript.php wrapper.', true );
+               }
+
+               $lang = $this->getArg( 0 );
+               $site = $this->getArg( 1 );
+               $dbName = $this->getArg( 2 );
+               $domain = $this->getArg( 3 );
+               $languageNames = Language::getLanguageNames();
+
+               if ( !isset( $languageNames[$lang] ) ) {
+                       $this->error( "Language $lang not found in Names.php", true );
+               }
+               $name = $languageNames[$lang];
+
+               $dbw = wfGetDB( DB_MASTER );
+               $common = "/home/wikipedia/common";
+
+               $this->output( "Creating database $dbName for $lang.$site ($name)\n" );
+
+               # Set up the database
+               $dbw->query( "SET table_type=Innodb" );
+               $dbw->query( "CREATE DATABASE $dbName" );
+               $dbw->selectDB( $dbName );
+
+               $this->output( "Initialising tables\n" );
+               $dbw->sourceFile( $this->getDir() . '/tables.sql' );
+               $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" );
+               $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" );
+               $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" );
+               $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" );
+               $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" );
+               $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" );
+               $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" );
+               $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" );
+               $dbw->sourceFile( "$IP/extensions/PrefStats/patches/PrefStats.sql" );
+               $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" );
+               $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTrackingEvents.sql" );
+               $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTracking.sql" );
+               $dbw->sourceFile( "$IP/extensions/UserDailyContribs/patches/UserDailyContribs.sql" );
+
+               $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" );
+
+               # Initialise external storage
+               if ( is_array( $wgDefaultExternalStore ) ) {
+                       $stores = $wgDefaultExternalStore;
+               } elseif ( $wgDefaultExternalStore ) {
+                       $stores = array( $wgDefaultExternalStore );
+               } else {
+                       $stores = array();
+               }
+               if ( count( $stores ) ) {
+                       global $wgDBuser, $wgDBpassword, $wgExternalServers;
+                       foreach ( $stores as $storeURL ) {
+                               $m = array();
+                               if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) {
+                                       continue;
+                               }
+
+                               $cluster = $m[1];
+                               $this->output( "Initialising external storage $cluster...\n" );
+
+                               # Hack
+                               $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
+                               $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
+
+                               $store = new ExternalStoreDB;
+                               $extdb = $store->getMaster( $cluster );
+                               $extdb->query( "SET table_type=InnoDB" );
+                               $extdb->query( "CREATE DATABASE $dbName" );
+                               $extdb->selectDB( $dbName );
+
+                               # Hack x2
+                               $blobsTable = $store->getTable( $extdb );
+                               $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql";
+                               $blobsFile = popen( $sedCmd, 'r' );
+                               $extdb->sourceStream( $blobsFile );
+                               pclose( $blobsFile );
+                               $extdb->commit();
                        }
-                       
-                       $cluster = $m[1];
-                       
-                       # Hack
-                       $wgExternalServers[$cluster][0]['user'] = $wgDBuser;
-                       $wgExternalServers[$cluster][0]['password'] = $wgDBpassword;
-                       
-                       $store = new ExternalStoreDB;
-                       $extdb =& $store->getMaster( $cluster );
-                       $extdb->query( "SET table_type=InnoDB" );
-                       $extdb->query( "CREATE DATABASE $dbName" );
-                       $extdb->selectDB( $dbName );
-                       dbsource( "$maintenance/storage/blobs.sql", $extdb );
-                       $extdb->immediateCommit();
                }
-       }
 
-       global $wgTitle, $wgArticle;
-       $wgTitle = Title::newFromText( wfMsgWeirdKey( "mainpage/$lang" ) );
-       print "Writing main page to " . $wgTitle->getPrefixedDBkey() . "\n";
-       $wgArticle = new Article( $wgTitle );
-       $ucsite = ucfirst( $site );
+               $title = Title::newFromText( wfMessage( 'mainpage' )->inLanguage( $lang )->useDatabase( false )->plain() );
+               $this->output( "Writing main page to " . $title->getPrefixedDBkey() . "\n" );
+               $article = new Article( $title );
+               $ucsite = ucfirst( $site );
+
+               $article->doEdit( $this->getFirstArticle( $ucsite, $name ), '', EDIT_NEW | EDIT_AUTOSUMMARY );
+
+               $this->output( "Adding to dblists\n" );
+
+               # Add to dblist
+               $file = fopen( "$common/all.dblist", "a" );
+               fwrite( $file, "$dbName\n" );
+               fclose( $file );
+
+               # Update the sublists
+               shell_exec( "cd $common && ./refresh-dblist" );
+
+               # Add to wikiversions.dat
+               $file = fopen( "$common/wikiversions.dat", "a" );
+               fwrite( $file, "$dbName php-$wmfVersionNumber\n" );
+               fclose( $file );
+               # Rebuild wikiversions.cdb
+               shell_exec( "cd $common/multiversion && ./refreshWikiversionsCDB" );
+
+               # print "Constructing interwiki SQL\n";
+               # Rebuild interwiki tables
+               # passthru( '/home/wikipedia/conf/interwiki/update' );
+
+               $time = wfTimestamp( TS_RFC2822 );
+               // These arguments need to be escaped twice: once for echo and once for at
+               $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) );
+               $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) );
+               $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) );
+               $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) );
+               $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) );
+               $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) );
+               shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" );
+
+               $this->output( "Script ended. You still have to:
+       * Add any required settings in InitialiseSettings.php
+       * Run sync-common-all
+       * Run /home/wikipedia/conf/interwiki/update
+       " );
+       }
 
-       $wgArticle->insertNewArticle( <<<EOT
+       private function getFirstArticle( $ucsite, $name ) {
+               return <<<EOT
 ==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language==
 
 * Please '''do not start editing''' this new site. This site has a test project on the [[incubator:|Wikimedia Incubator]] (or on the [[betawikiversity:|BetaWikiversity]] or on the [[oldwikisource:|Old Wikisource]]) and it will be imported to here.
 
-* If you would like to help translating the interface to this language, please do not translate here, but go to [[betawiki:|Betawiki]], a special wiki for translating the interface. That way everyone can use it on every wiki using the [[mw:|same software]].
+* If you would like to help translating the interface to this language, please do not translate here, but go to [[translatewiki:|translatewiki]], a special wiki for translating the interface. That way everyone can use it on every wiki using the [[mw:|same software]].
 
 * For information about how to edit and for other general help, see [[m:Help:Contents|Help on Wikimedia's Meta-Wiki]] or [[mw:Help:Contents|Help on MediaWiki.org]].
 
@@ -114,136 +199,9 @@ function addWiki( $lang, $site, $dbName )
 
 See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects.
 
-[[aa:]]
-[[af:]]
-[[als:]]
-[[ar:]]
-[[de:]]
-[[en:]]
-[[as:]]
-[[ast:]]
-[[ay:]]
-[[az:]]
-[[bcl:]]
-[[be:]]
-[[bg:]]
-[[bn:]]
-[[bo:]]
-[[bs:]]
-[[cs:]]
-[[co:]]
-[[cs:]]
-[[cy:]]
-[[da:]]
-[[el:]]
-[[eo:]]
-[[es:]]
-[[et:]]
-[[eu:]]
-[[fa:]]
-[[fi:]]
-[[fr:]]
-[[fy:]]
-[[ga:]]
-[[gl:]]
-[[gn:]]
-[[gu:]]
-[[he:]]
-[[hi:]]
-[[hr:]]
-[[hsb:]]
-[[hy:]]
-[[ia:]]
-[[id:]]
-[[is:]]
-[[it:]]
-[[ja:]]
-[[ka:]]
-[[kk:]]
-[[km:]]
-[[kn:]]
-[[ko:]]
-[[ks:]]
-[[ku:]]
-[[ky:]]
-[[la:]]
-[[ln:]]
-[[lo:]]
-[[lt:]]
-[[lv:]]
-[[hu:]]
-[[mi:]]
-[[mk:]]
-[[ml:]]
-[[mn:]]
-[[mr:]]
-[[ms:]]
-[[mt:]]
-[[my:]]
-[[na:]]
-[[nah:]]
-[[nds:]]
-[[ne:]]
-[[nl:]]
-[[no:]]
-[[oc:]]
-[[om:]]
-[[pa:]]
-[[pl:]]
-[[ps:]]
-[[pt:]]
-[[qu:]]
-[[ro:]]
-[[ru:]]
-[[sa:]]
-[[si:]]
-[[sk:]]
-[[sl:]]
-[[sq:]]
-[[sr:]]
-[[sv:]]
-[[sw:]]
-[[ta:]]
-[[te:]]
-[[tg:]]
-[[th:]]
-[[tk:]]
-[[tl:]]
-[[tr:]]
-[[tt:]]
-[[ug:]]
-[[uk:]]
-[[ur:]]
-[[uz:]]
-[[vi:]]
-[[vo:]]
-[[xh:]]
-[[yo:]]
-[[za:]]
-[[zh:]]
-[[zu:]]
-
-EOT
-, '', false, false );
-
-       print "Adding to dblists\n";
-
-       # Add to dblist
-       $file = fopen( "$common/all.dblist", "a" );
-       fwrite( $file, "$dbName\n" );
-       fclose( $file );
-
-       # Update the sublists
-       shell_exec("cd $common && ./refresh-dblist");
-
-       #print "Constructing interwiki SQL\n";
-       # Rebuild interwiki tables
-       #passthru( '/home/wikipedia/conf/interwiki/update' );
-
-       print "Script ended. You still have to:
-* Add any required settings in InitialiseSettings.php
-* Run sync-common-all
-* Run /home/wikipedia/conf/interwiki/update
-";
+EOT;
+       }
 }
 
+$maintClass = "AddWiki";
+require_once( RUN_MAINTENANCE_IF_MAIN );