Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixUsabilityPrefs2.php |
— | — | @@ -0,0 +1,118 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require( dirname( __FILE__ ) . '/../Maintenance.php' ); |
| 5 | + |
| 6 | +class FixUsabilityPrefs extends Maintenance { |
| 7 | + function __construct() { |
| 8 | + parent::__construct(); |
| 9 | + } |
| 10 | + |
| 11 | + function execute() { |
| 12 | + $dbw = wfGetDB( DB_MASTER ); |
| 13 | + |
| 14 | + echo "Fixing usebetatoolbar\n"; |
| 15 | + |
| 16 | + $batchSize = 100; |
| 17 | + $allIds = array(); |
| 18 | + while ( true ) { |
| 19 | + $dbw->begin(); |
| 20 | + $res = $dbw->select( 'user_properties', array( 'up_user' ), |
| 21 | + array( 'up_property' => 'usebetatoolbar', 'up_value' => '' ), |
| 22 | + __METHOD__, |
| 23 | + array( 'LIMIT' => $batchSize, 'FOR UPDATE' ) ); |
| 24 | + if ( !$res->numRows() ) { |
| 25 | + $dbw->commit(); |
| 26 | + break; |
| 27 | + } |
| 28 | + |
| 29 | + $ids = array(); |
| 30 | + foreach ( $res as $row ) { |
| 31 | + $ids[] = $row->up_user; |
| 32 | + } |
| 33 | + $dbw->update( 'user_properties', array( 'up_value' => 0 ), |
| 34 | + array( 'up_property' => 'usebetatoolbar', 'up_user' => $ids ), |
| 35 | + __METHOD__ ); |
| 36 | + $dbw->commit(); |
| 37 | + $allIds = array_merge( $allIds, $ids ); |
| 38 | + wfWaitForSlaves( 10 ); |
| 39 | + } |
| 40 | + |
| 41 | + echo "Fixing wikieditor-*\n"; |
| 42 | + |
| 43 | + $likeWikieditor = $dbw->buildLike( 'wikieditor-', $dbw->anyString() ); |
| 44 | + while ( true ) { |
| 45 | + $dbw->begin(); |
| 46 | + $res = $dbw->select( 'user_properties', array( 'DISTINCT up_user' ), |
| 47 | + array( "up_property $likeWikieditor" ), |
| 48 | + __METHOD__, |
| 49 | + array( 'LIMIT' => $batchSize, 'FOR UPDATE' ) ); |
| 50 | + if ( !$res->numRows() ) { |
| 51 | + $dbw->commit(); |
| 52 | + break; |
| 53 | + } |
| 54 | + |
| 55 | + $ids = array(); |
| 56 | + foreach ( $res as $row ) { |
| 57 | + $ids[] = $row->up_user; |
| 58 | + } |
| 59 | + $dbw->delete( 'user_properties', |
| 60 | + array( "up_property $likeWikieditor", 'up_user' => $ids ), |
| 61 | + __METHOD__ ); |
| 62 | + $dbw->commit(); |
| 63 | + $allIds = array_merge( $allIds, $ids ); |
| 64 | + wfWaitForSlaves( 10 ); |
| 65 | + } |
| 66 | + |
| 67 | + $allIds = array_unique( $allIds ); |
| 68 | + |
| 69 | + echo "Fixing usenavigabletoc\n"; |
| 70 | + |
| 71 | + while ( true ) { |
| 72 | + $dbw->begin(); |
| 73 | + $res = $dbw->select( 'user_properties', array( 'DISTINCT up_user' ), |
| 74 | + array( "up_property" => "usenavigabletoc" ), |
| 75 | + __METHOD__, |
| 76 | + array( 'LIMIT' => $batchSize, 'FOR UPDATE' ) ); |
| 77 | + if ( !$res->numRows() ) { |
| 78 | + $dbw->commit(); |
| 79 | + break; |
| 80 | + } |
| 81 | + |
| 82 | + $ids = array(); |
| 83 | + foreach ( $res as $row ) { |
| 84 | + $ids[] = $row->up_user; |
| 85 | + } |
| 86 | + $dbw->delete( 'user_properties', |
| 87 | + array( "up_property" => "usenavigabletoc", 'up_user' => $ids ), |
| 88 | + __METHOD__ ); |
| 89 | + $dbw->commit(); |
| 90 | + $allIds = array_merge( $allIds, $ids ); |
| 91 | + wfWaitForSlaves( 10 ); |
| 92 | + } |
| 93 | + |
| 94 | + |
| 95 | + echo "Invalidating user cache\n"; |
| 96 | + $i = 0; |
| 97 | + foreach ( $allIds as $id ) { |
| 98 | + $user = User::newFromId( $id ); |
| 99 | + if ( !$user->isLoggedIn() ) { |
| 100 | + continue; |
| 101 | + } |
| 102 | + $dbw->begin(); |
| 103 | + $user->invalidateCache(); |
| 104 | + $dbw->commit(); |
| 105 | + $i++; |
| 106 | + if ( $i % 1000 == 0 ) { |
| 107 | + wfWaitForSlaves( 10 ); |
| 108 | + } |
| 109 | + } |
| 110 | + |
| 111 | + echo "Done\n"; |
| 112 | + |
| 113 | + } |
| 114 | +} |
| 115 | + |
| 116 | +$maintClass = 'FixUsabilityPrefs'; |
| 117 | +require_once( DO_MAINTENANCE ); |
| 118 | + |
| 119 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixUsabilityPrefs2.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 120 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/getJobQueueLengths.php |
— | — | @@ -0,0 +1,28 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * Get the length of the job queue on all wikis in $wgConf |
| 6 | + */ |
| 7 | + |
| 8 | +require_once( dirname( __FILE__ ) .'/WikimediaMaintenance.php' ); |
| 9 | + |
| 10 | +class GetJobQueueLengths extends WikimediaMaintenance { |
| 11 | + function __construct() { |
| 12 | + parent::__construct(); |
| 13 | + $this->mDescription = 'Get the length of the job queue on all wikis in $wgConf'; |
| 14 | + } |
| 15 | + |
| 16 | + function execute() { |
| 17 | + global $wgConf; |
| 18 | + foreach ( $wgConf->getLocalDatabases() as $wiki ) { |
| 19 | + $lb = wfGetLB( $wiki ); |
| 20 | + $db = $lb->getConnection( DB_MASTER, array(), $wiki ); |
| 21 | + $count = intval( $db->selectField( 'job', 'COUNT(*)', '', __METHOD__ ) ); |
| 22 | + $this->output( "$wiki $count\n" ); |
| 23 | + $lb->reuseConnection( $db ); |
| 24 | + } |
| 25 | + } |
| 26 | +} |
| 27 | + |
| 28 | +$maintClass = 'GetJobQueueLengths'; |
| 29 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/getJobQueueLengths.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 30 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/socket-test.php |
— | — | @@ -0,0 +1,10 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require( dirname( __FILE__ ) . '/commandLine.inc' ); |
| 5 | +$msg = 'test ' . str_repeat( 'TTTT ', 10000 ); |
| 6 | +#wfErrorLog( $msg, 'udp://10.0.6.30:8420/test' ); |
| 7 | + |
| 8 | +$sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); |
| 9 | +socket_sendto( $sock, $msg, strlen( $msg ), 0, '10.0.6.30', 8420 ); |
| 10 | + |
| 11 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/socket-test.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 12 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/jeluf.php |
— | — | @@ -0,0 +1,103 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * This script starts pending jobs. |
| 5 | + * |
| 6 | + * Usage: |
| 7 | + * --maxjobs <num> (default 10000) |
| 8 | + * --type <job_cmd> |
| 9 | + * |
| 10 | + * This program is free software; you can redistribute it and/or modify |
| 11 | + * it under the terms of the GNU General Public License as published by |
| 12 | + * the Free Software Foundation; either version 2 of the License, or |
| 13 | + * (at your option) any later version. |
| 14 | + * |
| 15 | + * This program is distributed in the hope that it will be useful, |
| 16 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | + * GNU General Public License for more details. |
| 19 | + * |
| 20 | + * You should have received a copy of the GNU General Public License along |
| 21 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 22 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 23 | + * http://www.gnu.org/copyleft/gpl.html |
| 24 | + * |
| 25 | + * @ingroup Maintenance |
| 26 | + */ |
| 27 | + |
| 28 | +require_once( dirname(__FILE__) . '/Maintenance.php' ); |
| 29 | + |
| 30 | +class RunJobs extends Maintenance { |
| 31 | + public function __construct() { |
| 32 | + parent::__construct(); |
| 33 | + $this->mDescription = "Run pending jobs"; |
| 34 | + $this->addOption( 'maxjobs', 'Maximum number of jobs to run', false, true ); |
| 35 | + $this->addOption( 'type', 'Type of job to run', false, true ); |
| 36 | + $this->addOption( 'procs', 'Number of processes to use', false, true ); |
| 37 | + } |
| 38 | + |
| 39 | + public function memoryLimit() { |
| 40 | + // Don't eat all memory on the machine if we get a bad job. |
| 41 | + return "150M"; |
| 42 | + } |
| 43 | + |
| 44 | + public function execute() { |
| 45 | + global $wgTitle; |
| 46 | + if ( $this->hasOption( 'procs' ) ) { |
| 47 | + $procs = intval( $this->getOption('procs') ); |
| 48 | + if ( $procs < 1 || $procs > 1000 ) { |
| 49 | + $this->error( "Invalid argument to --procs", true ); |
| 50 | + } |
| 51 | + $fc = new ForkController( $procs ); |
| 52 | + if ( $fc->start( $procs ) != 'child' ) { |
| 53 | + exit( 0 ); |
| 54 | + } |
| 55 | + } |
| 56 | + $maxJobs = $this->getOption( 'maxjobs', 10000 ); |
| 57 | + $type = $this->getOption( 'type', false ); |
| 58 | + $wgTitle = Title::newFromText( 'RunJobs.php' ); |
| 59 | + $dbw = wfGetDB( DB_MASTER ); |
| 60 | + $n = 0; |
| 61 | + $conds = ''; |
| 62 | + if ($type !== false) |
| 63 | + $conds = "job_cmd = " . $dbw->addQuotes($type); |
| 64 | + |
| 65 | + while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) { |
| 66 | + $offset=0; |
| 67 | + for (;;) { |
| 68 | + $job = ($type == false) ? |
| 69 | + Job::pop($offset) |
| 70 | + : Job::pop_type($type); |
| 71 | + |
| 72 | + if ($job == false) |
| 73 | + break; |
| 74 | + |
| 75 | + wfWaitForSlaves( 5 ); |
| 76 | + $t = microtime( true ); |
| 77 | + $offset=$job->id; |
| 78 | + $status = $job->run(); |
| 79 | + $t = microtime( true ) - $t; |
| 80 | + $timeMs = intval( $t * 1000 ); |
| 81 | + if ( !$status ) { |
| 82 | + $this->runJobsLog( $job->toString() . " t=$timeMs error={$job->error}" ); |
| 83 | + } else { |
| 84 | + $this->runJobsLog( $job->toString() . " t=$timeMs good" ); |
| 85 | + } |
| 86 | + if ( $maxJobs && ++$n > $maxJobs ) { |
| 87 | + break 2; |
| 88 | + } |
| 89 | + } |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | + /** |
| 94 | + * Log the job message |
| 95 | + * @param $msg String The message to log |
| 96 | + */ |
| 97 | + private function runJobsLog( $msg ) { |
| 98 | + $this->output( wfTimestamp( TS_DB ) . " $msg\n" ); |
| 99 | + wfDebugLog( 'runJobs', $msg ); |
| 100 | + } |
| 101 | +} |
| 102 | + |
| 103 | +$maintClass = "RunJobs"; |
| 104 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/jeluf.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 105 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/purgeStaleMemcachedText.php |
— | — | @@ -0,0 +1,34 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require_once( dirname( __FILE__ ) . '/commandLine.inc' ); |
| 5 | + |
| 6 | +function purgeStaleMemcachedText() { |
| 7 | + global $wgMemc, $wgDBname; |
| 8 | + $db = wfGetDB( DB_MASTER ); |
| 9 | + $maxTextId = $db->selectField( 'text', 'max(old_id)' ); |
| 10 | + $latestReplicatedTextId = $db->selectField( array( 'recentchanges', 'revision' ), 'rev_text_id', |
| 11 | + array( 'rev_id = rc_this_oldid', "rc_timestamp < '20101225183000'"), 'purgeStaleMemcachedText', |
| 12 | + array( 'ORDER BY' => 'rc_timestamp DESC' ) ); |
| 13 | + $latestReplicatedTextId -= 100; # A bit of paranoia |
| 14 | + |
| 15 | + echo "Going to purge text entries from $latestReplicatedTextId to $maxTextId in $wgDBname\n"; |
| 16 | + |
| 17 | + for ( $i = $latestReplicatedTextId; $i < $maxTextId; $i++ ) { |
| 18 | + $key = wfMemcKey( 'revisiontext', 'textid', $i ); |
| 19 | + |
| 20 | + while (1) { |
| 21 | + if (! $wgMemc->delete( $key ) ) { |
| 22 | + echo "Memcache delete for $key returned false\n"; |
| 23 | + } |
| 24 | + if ( $wgMemc->get( $key ) ) { |
| 25 | + echo "There's still content in $key!\n"; |
| 26 | + } else { |
| 27 | + break; |
| 28 | + } |
| 29 | + } |
| 30 | + |
| 31 | + } |
| 32 | +} |
| 33 | + |
| 34 | +purgeStaleMemcachedText(); |
| 35 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/purgeStaleMemcachedText.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 36 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/wiktionary-interwiki.sql |
— | — | @@ -0,0 +1,184 @@ |
| 2 | +-- For convenience, here are the *in-project* interwiki prefixes |
| 3 | +-- for Wiktionary. |
| 4 | + |
| 5 | +REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES |
| 6 | +('w','http://www.wikipedia.org/wiki/$1',1), |
| 7 | +('m','http://meta.wikipedia.org/wiki/$1',1), |
| 8 | +('meta','http://meta.wikipedia.org/wiki/$1',1), |
| 9 | +('sep11','http://sep11.wikipedia.org/wiki/$1',1), |
| 10 | +('simple','http://simple.wiktionary.org/wiki/$1',1), |
| 11 | +('aa','http://aa.wiktionary.org/wiki/$1',1), |
| 12 | +('ab','http://ab.wiktionary.org/wiki/$1',1), |
| 13 | +('af','http://af.wiktionary.org/wiki/$1',1), |
| 14 | +('ak','http://ak.wiktionary.org/wiki/$1',1), |
| 15 | +('als','http://als.wiktionary.org/wiki/$1',1), |
| 16 | +('am','http://am.wiktionary.org/wiki/$1',1), |
| 17 | +('an','http://an.wiktionary.org/wiki/$1',1), |
| 18 | +('ang','http://ang.wiktionary.org/wiki/$1',1), |
| 19 | +('ar','http://ar.wiktionary.org/wiki/$1',1), |
| 20 | +('as','http://as.wiktionary.org/wiki/$1',1), |
| 21 | +('ast','http://ast.wiktionary.org/wiki/$1',1), |
| 22 | +('av','http://av.wiktionary.org/wiki/$1',1), |
| 23 | +('ay','http://ay.wiktionary.org/wiki/$1',1), |
| 24 | +('az','http://az.wiktionary.org/wiki/$1',1), |
| 25 | +('ba','http://ba.wiktionary.org/wiki/$1',1), |
| 26 | +('be','http://be.wiktionary.org/wiki/$1',1), |
| 27 | +('bg','http://bg.wiktionary.org/wiki/$1',1), |
| 28 | +('bh','http://bh.wiktionary.org/wiki/$1',1), |
| 29 | +('bi','http://bi.wiktionary.org/wiki/$1',1), |
| 30 | +('bm','http://bm.wiktionary.org/wiki/$1',1), |
| 31 | +('bn','http://bn.wiktionary.org/wiki/$1',1), |
| 32 | +('bo','http://bo.wiktionary.org/wiki/$1',1), |
| 33 | +('br','http://br.wiktionary.org/wiki/$1',1), |
| 34 | +('bs','http://bs.wiktionary.org/wiki/$1',1), |
| 35 | +('ca','http://ca.wiktionary.org/wiki/$1',1), |
| 36 | +('ch','http://ch.wiktionary.org/wiki/$1',1), |
| 37 | +('chr','http://chr.wiktionary.org/wiki/$1',1), |
| 38 | +('co','http://co.wiktionary.org/wiki/$1',1), |
| 39 | +('cr','http://cr.wiktionary.org/wiki/$1',1), |
| 40 | +('cs','http://cs.wiktionary.org/wiki/$1',1), |
| 41 | +('csb','http://csb.wiktionary.org/wiki/$1',1), |
| 42 | +('cy','http://cy.wiktionary.org/wiki/$1',1), |
| 43 | +('da','http://da.wiktionary.org/wiki/$1',1), |
| 44 | +('de','http://de.wiktionary.org/wiki/$1',1), |
| 45 | +('dk','http://da.wiktionary.org/wiki/$1',1), |
| 46 | +('dv','http://dv.wiktionary.org/wiki/$1',1), |
| 47 | +('dz','http://dz.wiktionary.org/wiki/$1',1), |
| 48 | +('el','http://el.wiktionary.org/wiki/$1',1), |
| 49 | +('en','http://en.wiktionary.org/wiki/$1',1), |
| 50 | +('eo','http://eo.wiktionary.org/wiki/$1',1), |
| 51 | +('es','http://es.wiktionary.org/wiki/$1',1), |
| 52 | +('et','http://et.wiktionary.org/wiki/$1',1), |
| 53 | +('eu','http://eu.wiktionary.org/wiki/$1',1), |
| 54 | +('fa','http://fa.wiktionary.org/wiki/$1',1), |
| 55 | +('fi','http://fi.wiktionary.org/wiki/$1',1), |
| 56 | +('fj','http://fj.wiktionary.org/wiki/$1',1), |
| 57 | +('fo','http://fo.wiktionary.org/wiki/$1',1), |
| 58 | +('fr','http://fr.wiktionary.org/wiki/$1',1), |
| 59 | +('fy','http://fy.wiktionary.org/wiki/$1',1), |
| 60 | +('ga','http://ga.wiktionary.org/wiki/$1',1), |
| 61 | +('gd','http://gd.wiktionary.org/wiki/$1',1), |
| 62 | +('gl','http://gl.wiktionary.org/wiki/$1',1), |
| 63 | +('gn','http://gn.wiktionary.org/wiki/$1',1), |
| 64 | +('gu','http://gu.wiktionary.org/wiki/$1',1), |
| 65 | +('gv','http://gv.wiktionary.org/wiki/$1',1), |
| 66 | +('ha','http://ha.wiktionary.org/wiki/$1',1), |
| 67 | +('he','http://he.wiktionary.org/wiki/$1',1), |
| 68 | +('hi','http://hi.wiktionary.org/wiki/$1',1), |
| 69 | +('hr','http://hr.wiktionary.org/wiki/$1',1), |
| 70 | +('hsb','http://hsb.wiktionary.org/wiki/$1',1), |
| 71 | +('hu','http://hu.wiktionary.org/wiki/$1',1), |
| 72 | +('hy','http://hy.wiktionary.org/wiki/$1',1), |
| 73 | +('ia','http://ia.wiktionary.org/wiki/$1',1), |
| 74 | +('id','http://id.wiktionary.org/wiki/$1',1), |
| 75 | +('ie','http://ie.wiktionary.org/wiki/$1',1), |
| 76 | +('ik','http://ik.wiktionary.org/wiki/$1',1), |
| 77 | +('io','http://io.wiktionary.org/wiki/$1',1), |
| 78 | +('is','http://is.wiktionary.org/wiki/$1',1), |
| 79 | +('it','http://it.wiktionary.org/wiki/$1',1), |
| 80 | +('iu','http://iu.wiktionary.org/wiki/$1',1), |
| 81 | +('ja','http://ja.wiktionary.org/wiki/$1',1), |
| 82 | +('jbo','http://jbo.wiktionary.org/wiki/$1',1), |
| 83 | +('jv','http://jv.wiktionary.org/wiki/$1',1), |
| 84 | +('ka','http://ka.wiktionary.org/wiki/$1',1), |
| 85 | +('kk','http://kk.wiktionary.org/wiki/$1',1), |
| 86 | +('kl','http://kl.wiktionary.org/wiki/$1',1), |
| 87 | +('km','http://km.wiktionary.org/wiki/$1',1), |
| 88 | +('kn','http://kn.wiktionary.org/wiki/$1',1), |
| 89 | +('ko','http://ko.wiktionary.org/wiki/$1',1), |
| 90 | +('ks','http://ks.wiktionary.org/wiki/$1',1), |
| 91 | +('ku','http://ku.wiktionary.org/wiki/$1',1), |
| 92 | +('kw','http://kw.wiktionary.org/wiki/$1',1), |
| 93 | +('ky','http://ky.wiktionary.org/wiki/$1',1), |
| 94 | +('la','http://la.wiktionary.org/wiki/$1',1), |
| 95 | +('lb','http://lb.wiktionary.org/wiki/$1',1), |
| 96 | +('li','http://li.wiktionary.org/wiki/$1',1), |
| 97 | +('ln','http://ln.wiktionary.org/wiki/$1',1), |
| 98 | +('lo','http://lo.wiktionary.org/wiki/$1',1), |
| 99 | +('lt','http://lt.wiktionary.org/wiki/$1',1), |
| 100 | +('lv','http://lv.wiktionary.org/wiki/$1',1), |
| 101 | +('mg','http://mg.wiktionary.org/wiki/$1',1), |
| 102 | +('mh','http://mh.wiktionary.org/wiki/$1',1), |
| 103 | +('mi','http://mi.wiktionary.org/wiki/$1',1), |
| 104 | +('mk','http://mk.wiktionary.org/wiki/$1',1), |
| 105 | +('ml','http://ml.wiktionary.org/wiki/$1',1), |
| 106 | +('mn','http://mn.wiktionary.org/wiki/$1',1), |
| 107 | +('mo','http://mo.wiktionary.org/wiki/$1',1), |
| 108 | +('mr','http://mr.wiktionary.org/wiki/$1',1), |
| 109 | +('ms','http://ms.wiktionary.org/wiki/$1',1), |
| 110 | +('mt','http://mt.wiktionary.org/wiki/$1',1), |
| 111 | +('my','http://my.wiktionary.org/wiki/$1',1), |
| 112 | +('na','http://na.wiktionary.org/wiki/$1',1), |
| 113 | +('nah','http://nah.wiktionary.org/wiki/$1',1), |
| 114 | +('nb', 'http://no.wiktionary.org/wiki/$1',1), |
| 115 | +('nds','http://nds.wiktionary.org/wiki/$1',1), |
| 116 | +('ne','http://ne.wiktionary.org/wiki/$1',1), |
| 117 | +('nl','http://nl.wiktionary.org/wiki/$1',1), |
| 118 | +('nn','http://nn.wiktionary.org/wiki/$1',1), |
| 119 | +('no','http://no.wiktionary.org/wiki/$1',1), |
| 120 | +('oc','http://oc.wiktionary.org/wiki/$1',1), |
| 121 | +('om','http://om.wiktionary.org/wiki/$1',1), |
| 122 | +('or','http://or.wiktionary.org/wiki/$1',1), |
| 123 | +('pa','http://pa.wiktionary.org/wiki/$1',1), |
| 124 | +('pi','http://pi.wiktionary.org/wiki/$1',1), |
| 125 | +('pl','http://pl.wiktionary.org/wiki/$1',1), |
| 126 | +('ps','http://ps.wiktionary.org/wiki/$1',1), |
| 127 | +('pt','http://pt.wiktionary.org/wiki/$1',1), |
| 128 | +('qu','http://qu.wiktionary.org/wiki/$1',1), |
| 129 | +('rm','http://rm.wiktionary.org/wiki/$1',1), |
| 130 | +('rn','http://rn.wiktionary.org/wiki/$1',1), |
| 131 | +('ro','http://ro.wiktionary.org/wiki/$1',1), |
| 132 | +('roa-rup','http://roa-rup.wiktionary.org/wiki/$1',1), |
| 133 | +('ru','http://ru.wiktionary.org/wiki/$1',1), |
| 134 | +('rw','http://rw.wiktionary.org/wiki/$1',1), |
| 135 | +('sa','http://sa.wiktionary.org/wiki/$1',1), |
| 136 | +('sc','http://sc.wiktionary.org/wiki/$1',1), |
| 137 | +('scn','http://scn.wiktionary.org/wiki/$1',1), |
| 138 | +('sd','http://sd.wiktionary.org/wiki/$1',1), |
| 139 | +('sg','http://sg.wiktionary.org/wiki/$1',1), |
| 140 | +('sh','http://sh.wiktionary.org/wiki/$1',1), |
| 141 | +('si','http://si.wiktionary.org/wiki/$1',1), |
| 142 | +('sk','http://sk.wiktionary.org/wiki/$1',1), |
| 143 | +('sl','http://sl.wiktionary.org/wiki/$1',1), |
| 144 | +('sm','http://sm.wiktionary.org/wiki/$1',1), |
| 145 | +('sn','http://sn.wiktionary.org/wiki/$1',1), |
| 146 | +('so','http://so.wiktionary.org/wiki/$1',1), |
| 147 | +('sq','http://sq.wiktionary.org/wiki/$1',1), |
| 148 | +('sr','http://sr.wiktionary.org/wiki/$1',1), |
| 149 | +('ss','http://ss.wiktionary.org/wiki/$1',1), |
| 150 | +('st','http://st.wiktionary.org/wiki/$1',1), |
| 151 | +('su','http://su.wiktionary.org/wiki/$1',1), |
| 152 | +('sv','http://sv.wiktionary.org/wiki/$1',1), |
| 153 | +('sw','http://sw.wiktionary.org/wiki/$1',1), |
| 154 | +('ta','http://ta.wiktionary.org/wiki/$1',1), |
| 155 | +('te','http://te.wiktionary.org/wiki/$1',1), |
| 156 | +('tg','http://tg.wiktionary.org/wiki/$1',1), |
| 157 | +('th','http://th.wiktionary.org/wiki/$1',1), |
| 158 | +('ti','http://ti.wiktionary.org/wiki/$1',1), |
| 159 | +('tk','http://tk.wiktionary.org/wiki/$1',1), |
| 160 | +('tl','http://tl.wiktionary.org/wiki/$1',1), |
| 161 | +('tn','http://tn.wiktionary.org/wiki/$1',1), |
| 162 | +('to','http://to.wiktionary.org/wiki/$1',1), |
| 163 | +('tpi','http://tpi.wiktionary.org/wiki/$1',1), |
| 164 | +('tr','http://tr.wiktionary.org/wiki/$1',1), |
| 165 | +('ts','http://ts.wiktionary.org/wiki/$1',1), |
| 166 | +('tt','http://tt.wiktionary.org/wiki/$1',1), |
| 167 | +('tw','http://tw.wiktionary.org/wiki/$1',1), |
| 168 | +('ug','http://ug.wiktionary.org/wiki/$1',1), |
| 169 | +('uk','http://uk.wiktionary.org/wiki/$1',1), |
| 170 | +('ur','http://ur.wiktionary.org/wiki/$1',1), |
| 171 | +('uz','http://uz.wiktionary.org/wiki/$1',1), |
| 172 | +('vi','http://vi.wiktionary.org/wiki/$1',1), |
| 173 | +('vo','http://vo.wiktionary.org/wiki/$1',1), |
| 174 | +('wa','http://wa.wiktionary.org/wiki/$1',1), |
| 175 | +('wo','http://wo.wiktionary.org/wiki/$1',1), |
| 176 | +('xh','http://xh.wiktionary.org/wiki/$1',1), |
| 177 | +('yi','http://yi.wiktionary.org/wiki/$1',1), |
| 178 | +('yo','http://yo.wiktionary.org/wiki/$1',1), |
| 179 | +('za','http://za.wiktionary.org/wiki/$1',1), |
| 180 | +('zh','http://zh.wiktionary.org/wiki/$1',1), |
| 181 | +('zh-cn','http://zh.wiktionary.org/wiki/$1',1), |
| 182 | +('zh-min-nan','http://zh-min-nan.wiktionary.org/wiki/$1',1), |
| 183 | +('zh-tw','http://zh.wiktionary.org/wiki/$1',1), |
| 184 | +('zu','http://zu.wiktionary.org/wiki/$1',1); |
| 185 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/wiktionary-interwiki.sql |
___________________________________________________________________ |
Added: svn:keywords |
1 | 186 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 187 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/rebuildInterwiki.php |
— | — | @@ -0,0 +1,303 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Rebuild interwiki table using the file on meta and the language list |
| 5 | + * Wikimedia specific! |
| 6 | + * |
| 7 | + * This program is free software; you can redistribute it and/or modify |
| 8 | + * it under the terms of the GNU General Public License as published by |
| 9 | + * the Free Software Foundation; either version 2 of the License, or |
| 10 | + * (at your option) any later version. |
| 11 | + * |
| 12 | + * This program is distributed in the hope that it will be useful, |
| 13 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | + * GNU General Public License for more details. |
| 16 | + * |
| 17 | + * You should have received a copy of the GNU General Public License along |
| 18 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 20 | + * http://www.gnu.org/copyleft/gpl.html |
| 21 | + * |
| 22 | + * @file |
| 23 | + * @todo document |
| 24 | + * @ingroup Maintenance |
| 25 | + * @ingroup Wikimedia |
| 26 | + */ |
| 27 | +require_once( dirname( __FILE__ ) . '/WikimediaMaintenance.php' ); |
| 28 | + |
| 29 | +class RebuildInterwiki extends DumpInterwiki { |
| 30 | + |
| 31 | + /** |
| 32 | + * @var array |
| 33 | + */ |
| 34 | + protected $specials, $languageAliases, $prefixRewrites, |
| 35 | + $langlist, $dblist; |
| 36 | + |
| 37 | + public function __construct() { |
| 38 | + parent::__construct(); |
| 39 | + $this->mDescription = "Rebuild the interwiki table using the file on meta and the language list."; |
| 40 | + $this->addOption( 'langlist', 'File with one language code per line', false, true ); |
| 41 | + $this->addOption( 'dblist', 'File with one db per line', false, true ); |
| 42 | + $this->addOption( 'd', 'Output folder', false, true ); |
| 43 | + $this->addOption( 'protocolrelative', 'Output wikimedia interwiki urls as protocol relative', false, false ); |
| 44 | + } |
| 45 | + |
| 46 | + function execute() { |
| 47 | + # List of language prefixes likely to be found in multi-language sites |
| 48 | + $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) ); |
| 49 | + |
| 50 | + # List of all database names |
| 51 | + $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) ); |
| 52 | + |
| 53 | + # Special-case databases |
| 54 | + //$this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) ); |
| 55 | + |
| 56 | + $this->makeInterwikiSQL( $this->getOption( 'd', '/home/wikipedia/conf/interwiki/sql' ) ); |
| 57 | + |
| 58 | + if ( $this->hasOption( 'protocolrelative' ) ) { |
| 59 | + $this->urlprotocol = ''; |
| 60 | + } else { |
| 61 | + $this->urlprotocol = 'http:'; |
| 62 | + } |
| 63 | + } |
| 64 | + |
| 65 | + /** |
| 66 | + * @param $destDir string |
| 67 | + */ |
| 68 | + function makeInterwikiSQL( $destDir ) { |
| 69 | + $this->output( "Making new interwiki SQL files in $destDir\n" ); |
| 70 | + |
| 71 | + # Multi-language sites |
| 72 | + # db suffix => db suffix, iw prefix, hostname |
| 73 | + $sites = array( |
| 74 | + 'wiki' => new WMFSite( 'wiki', 'w', 'wikipedia.org' ), |
| 75 | + 'wiktionary' => new WMFSite( 'wiktionary', 'wikt', 'wiktionary.org' ), |
| 76 | + 'wikiquote' => new WMFSite( 'wikiquote', 'q', 'wikiquote.org' ), |
| 77 | + 'wikibooks' => new WMFSite( 'wikibooks', 'b', 'wikibooks.org' ), |
| 78 | + 'wikinews' => new WMFSite( 'wikinews', 'n', 'wikinews.org' ), |
| 79 | + 'wikisource' => new WMFSite( 'wikisource', 's', 'wikisource.org' ), |
| 80 | + 'wikimedia' => new WMFSite( 'wikimedia', 'chapter', 'wikimedia.org' ), |
| 81 | + 'wikiversity' => new WMFSite( 'wikiversity', 'v', 'wikiversity.org' ), |
| 82 | + ); |
| 83 | + |
| 84 | + # Special-case hostnames |
| 85 | + $this->specials = array( |
| 86 | + 'sourceswiki' => 'sources.wikipedia.org', |
| 87 | + 'quotewiki' => 'wikiquote.org', |
| 88 | + 'textbookwiki' => 'wikibooks.org', |
| 89 | + 'sep11wiki' => 'sep11.wikipedia.org', |
| 90 | + 'metawiki' => 'meta.wikimedia.org', |
| 91 | + 'commonswiki' => 'commons.wikimedia.org', |
| 92 | + 'specieswiki' => 'species.wikimedia.org', |
| 93 | + ); |
| 94 | + |
| 95 | + # Extra interwiki links that can't be in the intermap for some reason |
| 96 | + $extraLinks = array( |
| 97 | + array( 'm', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ), |
| 98 | + array( 'meta', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ), |
| 99 | + array( 'sep11', $this->urlprotocol . '//sep11.wikipedia.org/wiki/$1', 1 ), |
| 100 | + ); |
| 101 | + |
| 102 | + # Language aliases, usually configured as redirects to the real wiki in apache |
| 103 | + # Interlanguage links are made directly to the real wiki |
| 104 | + # Something horrible happens if you forget to list an alias here, I can't |
| 105 | + # remember what |
| 106 | + $this->languageAliases = array( |
| 107 | + 'zh-cn' => 'zh', |
| 108 | + 'zh-tw' => 'zh', |
| 109 | + 'dk' => 'da', |
| 110 | + 'nb' => 'no', |
| 111 | + ); |
| 112 | + |
| 113 | + # Special case prefix rewrites, for the benefit of Swedish which uses s:t |
| 114 | + # as an abbreviation for saint |
| 115 | + $this->prefixRewrites = array( |
| 116 | + 'svwiki' => array( 's' => 'src' ), |
| 117 | + ); |
| 118 | + |
| 119 | + # Construct a list of reserved prefixes |
| 120 | + $reserved = array(); |
| 121 | + foreach ( $this->langlist as $lang ) { |
| 122 | + $reserved[$lang] = 1; |
| 123 | + } |
| 124 | + foreach ( $this->languageAliases as $alias => $lang ) { |
| 125 | + $reserved[$alias] = 1; |
| 126 | + } |
| 127 | + foreach ( $sites as $site ) { |
| 128 | + $reserved[$site->lateral] = 1; |
| 129 | + } |
| 130 | + |
| 131 | + # Extract the intermap from meta |
| 132 | + $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 ); |
| 133 | + $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) ); |
| 134 | + |
| 135 | + if ( !$lines || count( $lines ) < 2 ) { |
| 136 | + $this->error( "m:Interwiki_map not found", true ); |
| 137 | + } |
| 138 | + |
| 139 | + $iwArray = array(); |
| 140 | + |
| 141 | + foreach ( $lines as $line ) { |
| 142 | + $matches = array(); |
| 143 | + if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(https?:\/\/.*?)\s*$/', $line, $matches ) ) { |
| 144 | + $prefix = strtolower( $matches[1] ); |
| 145 | + $url = $matches[2]; |
| 146 | + if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia|wikinews|wikiversity|wikimediafoundation|mediawiki)\.org/', $url ) ) { |
| 147 | + $local = 1; |
| 148 | + } else { |
| 149 | + $local = 0; |
| 150 | + } |
| 151 | + |
| 152 | + if ( empty( $reserved[$prefix] ) ) { |
| 153 | + $iwArray[$prefix] = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local ); |
| 154 | + } |
| 155 | + } |
| 156 | + } |
| 157 | + |
| 158 | + foreach ( $this->dblist as $db ) { |
| 159 | + $sql = "-- Generated by rebuildInterwiki.php"; |
| 160 | + if ( isset( $this->specials[$db] ) ) { |
| 161 | + # Special wiki |
| 162 | + # Has interwiki links and interlanguage links to wikipedia |
| 163 | + |
| 164 | + $host = $this->specials[$db]; |
| 165 | + $sql .= "\n--$host\n\n"; |
| 166 | + $sql .= "USE $db;\n" . |
| 167 | + "TRUNCATE TABLE interwiki;\n" . |
| 168 | + "INSERT INTO interwiki (iw_prefix, iw_url, iw_local) VALUES \n"; |
| 169 | + $first = true; |
| 170 | + |
| 171 | + # Intermap links |
| 172 | + foreach ( $iwArray as $iwEntry ) { |
| 173 | + $sql .= $this->makeLink( $iwEntry, $first, $db ); |
| 174 | + } |
| 175 | + |
| 176 | + # Links to multilanguage sites |
| 177 | + foreach ( $sites as $targetSite ) { |
| 178 | + $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( 'en', $this->urlprotocol ), 1 ), $first, $db ); |
| 179 | + } |
| 180 | + |
| 181 | + # Interlanguage links to wikipedia |
| 182 | + $sql .= $this->makeLanguageLinks( $sites['wiki'], $first, $db ); |
| 183 | + |
| 184 | + # Extra links |
| 185 | + foreach ( $extraLinks as $link ) { |
| 186 | + $sql .= $this->makeLink( $link, $first, $db ); |
| 187 | + } |
| 188 | + |
| 189 | + $sql .= ";\n"; |
| 190 | + } else { |
| 191 | + # Find out which site this DB belongs to |
| 192 | + $site = false; |
| 193 | + foreach ( $sites as $candidateSite ) { |
| 194 | + $suffix = $candidateSite->suffix; |
| 195 | + if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) { |
| 196 | + $site = $candidateSite; |
| 197 | + break; |
| 198 | + } |
| 199 | + } |
| 200 | + if ( !$site ) { |
| 201 | + print "Invalid database $db\n"; |
| 202 | + continue; |
| 203 | + } |
| 204 | + $lang = $matches[1]; |
| 205 | + $host = "$lang." . $site->url; |
| 206 | + $sql .= "\n--$host\n\n"; |
| 207 | + |
| 208 | + $sql .= "USE $db;\n" . |
| 209 | + "TRUNCATE TABLE interwiki;\n" . |
| 210 | + "INSERT INTO interwiki (iw_prefix,iw_url,iw_local) VALUES\n"; |
| 211 | + $first = true; |
| 212 | + |
| 213 | + # Intermap links |
| 214 | + foreach ( $iwArray as $iwEntry ) { |
| 215 | + # Suppress links with the same name as the site |
| 216 | + if ( ( $suffix == 'wiki' && $iwEntry['iw_prefix'] != 'wikipedia' ) || |
| 217 | + ( $suffix != 'wiki' && $suffix != $iwEntry['iw_prefix'] ) ) |
| 218 | + { |
| 219 | + $sql .= $this->makeLink( $iwEntry, $first, $db ); |
| 220 | + } |
| 221 | + } |
| 222 | + |
| 223 | + # Lateral links |
| 224 | + foreach ( $sites as $targetSite ) { |
| 225 | + # Suppress link to self |
| 226 | + if ( $targetSite->suffix != $site->suffix ) { |
| 227 | + $sql .= $this->makeLink( array( $targetSite->lateral, $targetSite->getURL( $lang, $this->urlprotocol ), 1 ), $first, $db ); |
| 228 | + } |
| 229 | + } |
| 230 | + |
| 231 | + # Interlanguage links |
| 232 | + $sql .= $this->makeLanguageLinks( $site, $first, $db ); |
| 233 | + |
| 234 | + # w link within wikipedias |
| 235 | + # Other sites already have it as a lateral link |
| 236 | + if ( $site->suffix == "wiki" ) { |
| 237 | + $sql .= $this->makeLink( array( "w", "{$this->urlprotocol}//en.wikipedia.org/wiki/$1", 1 ), $first, $db ); |
| 238 | + } |
| 239 | + |
| 240 | + # Extra links |
| 241 | + foreach ( $extraLinks as $link ) { |
| 242 | + $sql .= $this->makeLink( $link, $first, $db ); |
| 243 | + } |
| 244 | + $sql .= ";\n"; |
| 245 | + } |
| 246 | + file_put_contents( "$destDir/$db.sql", $sql ); |
| 247 | + } |
| 248 | + } |
| 249 | + |
| 250 | + # ------------------------------------------------------------------------------------------ |
| 251 | + |
| 252 | + /** |
| 253 | + * Returns part of an INSERT statement, corresponding to all interlanguage links to a particular site |
| 254 | + * |
| 255 | + * @param $site WMFSite |
| 256 | + * @param $first |
| 257 | + * @param $source |
| 258 | + * @return string |
| 259 | + */ |
| 260 | + function makeLanguageLinks( &$site, &$first, $source ) { |
| 261 | + $sql = ""; |
| 262 | + |
| 263 | + # Actual languages with their own databases |
| 264 | + foreach ( $this->langlist as $targetLang ) { |
| 265 | + $sql .= $this->makeLink( array( $targetLang, $site->getURL( $targetLang, $this->urlprotocol ), 1 ), $first, $source ); |
| 266 | + } |
| 267 | + |
| 268 | + # Language aliases |
| 269 | + foreach ( $this->languageAliases as $alias => $lang ) { |
| 270 | + $sql .= $this->makeLink( array( $alias, $site->getURL( $lang, $this->urlprotocol ), 1 ), $first, $source ); |
| 271 | + } |
| 272 | + return $sql; |
| 273 | + } |
| 274 | + |
| 275 | + /** |
| 276 | + * Make SQL for a single link from an array |
| 277 | + * |
| 278 | + * @param $entry |
| 279 | + * @param $first |
| 280 | + * @param $source |
| 281 | + * @return string |
| 282 | + */ |
| 283 | + function makeLink( $entry, &$first, $source ) { |
| 284 | + |
| 285 | + if ( isset( $this->prefixRewrites[$source] ) && isset($entry[0]) && isset( $this->prefixRewrites[$source][$entry[0]] ) ) { |
| 286 | + $entry[0] = $this->prefixRewrites[$source][$entry[0]]; |
| 287 | + } |
| 288 | + |
| 289 | + $sql = ""; |
| 290 | + # Add comma |
| 291 | + if ( $first ) { |
| 292 | + $first = false; |
| 293 | + } else { |
| 294 | + $sql .= ",\n"; |
| 295 | + } |
| 296 | + $dbr = wfGetDB( DB_SLAVE ); |
| 297 | + $sql .= "(" . $dbr->makeList( $entry ) . ")"; |
| 298 | + return $sql; |
| 299 | + } |
| 300 | +} |
| 301 | + |
| 302 | +$maintClass = "RebuildInterwiki"; |
| 303 | +require_once( RUN_MAINTENANCE_IF_MAIN ); |
| 304 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/rebuildInterwiki.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 305 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 306 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/purgeStaleMemcachedFlaggedRevs.php |
— | — | @@ -0,0 +1,39 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require_once( dirname( __FILE__ ) . '/commandLine.inc' ); |
| 5 | + |
| 6 | +function purgeStaleMemcachedText() { |
| 7 | + global $wgMemc, $wgDBname; |
| 8 | + $db = wfGetDB( DB_MASTER ); |
| 9 | + $maxTextId = $db->selectField( 'text', 'max(old_id)' ); |
| 10 | + $latestReplicatedTextId = $db->selectField( array( 'recentchanges', 'revision' ), 'rev_text_id', |
| 11 | + array( 'rev_id = rc_this_oldid', "rc_timestamp < '20101225183000'"), 'purgeStaleMemcachedText', |
| 12 | + array( 'ORDER BY' => 'rc_timestamp DESC' ) ); |
| 13 | + $latestReplicatedTextId -= 100; # A bit of paranoia |
| 14 | + |
| 15 | + echo "Going to purge text entries from $latestReplicatedTextId to $maxTextId in $wgDBname\n"; |
| 16 | + |
| 17 | + for ( $i = $latestReplicatedTextId; $i < $maxTextId; $i++ ) { |
| 18 | + $keys = array(); |
| 19 | + $keys[] = wfMemcKey( 'flaggedrevs', 'countPending', $i ); |
| 20 | + $keys[] = wfMemcKey( 'flaggedrevs', 'includesSynced', $i ); |
| 21 | + $keys[] = wfMemcKey( 'flaggedrevs', 'overrideRedirect', $i ); |
| 22 | + $keys[] = wfMemcKey( 'unreviewedPages', 'underReview', $i ); |
| 23 | + |
| 24 | + foreach ( $keys as $key ) { |
| 25 | + while (1) { |
| 26 | + if (! $wgMemc->delete( $key ) ) { |
| 27 | + echo "Memcache delete for $key returned false\n"; |
| 28 | + } |
| 29 | + if ( $wgMemc->get( $key ) ) { |
| 30 | + echo "There's still content in $key!\n"; |
| 31 | + } else { |
| 32 | + break; |
| 33 | + } |
| 34 | + } |
| 35 | + } |
| 36 | + } |
| 37 | +} |
| 38 | + |
| 39 | +purgeStaleMemcachedText(); |
| 40 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/purgeStaleMemcachedFlaggedRevs.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 41 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/clearMessageBlobs.php |
— | — | @@ -0,0 +1,63 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * Clear the msg_resource table on all wikis if any message file has been updated. |
| 6 | + */ |
| 7 | + |
| 8 | +require_once( dirname( __FILE__ ) .'/../Maintenance.php' ); |
| 9 | + |
| 10 | +class ClearMessageBlobs extends Maintenance { |
| 11 | + function __construct() { |
| 12 | + parent::__construct(); |
| 13 | + } |
| 14 | + |
| 15 | + function execute() { |
| 16 | + global $wgExtensionMessagesFiles, $IP; |
| 17 | + |
| 18 | + $maxTime = 0; |
| 19 | + |
| 20 | + foreach ( $wgExtensionMessagesFiles as $file ) { |
| 21 | + if ( !file_exists( $file ) ) { |
| 22 | + continue; |
| 23 | + } |
| 24 | + $maxTime = max( $maxTime, filemtime( $file ) ); |
| 25 | + } |
| 26 | + |
| 27 | + foreach ( glob( "$IP/languages/messages/Messages*.php" ) as $file ) { |
| 28 | + $maxTime = max( $maxTime, filemtime( $file ) ); |
| 29 | + } |
| 30 | + |
| 31 | + # LocalisationUpdate |
| 32 | + foreach ( glob( "$IP/cache/l10n/*.cache" ) as $file ) { |
| 33 | + $maxTime = max( $maxTime, filemtime( $file ) ); |
| 34 | + } |
| 35 | + |
| 36 | + if ( !file_exists( "$IP/cache/message-timestamp" ) ) { |
| 37 | + $this->clearBlobs(); |
| 38 | + } else { |
| 39 | + $oldTime = intval( trim( file_get_contents( "$IP/cache/message-timestamp" ) ) ); |
| 40 | + if ( $maxTime > $oldTime ) { |
| 41 | + $this->clearBlobs(); |
| 42 | + } |
| 43 | + } |
| 44 | + |
| 45 | + file_put_contents( "$IP/cache/message-timestamp", "$maxTime\n" ); |
| 46 | + } |
| 47 | + |
| 48 | + function clearBlobs() { |
| 49 | + global $wgConf; |
| 50 | + |
| 51 | + echo "Clearing blobs...\n"; |
| 52 | + foreach ( $wgConf->getLocalDatabases() as $wiki ) { |
| 53 | + $lb = wfGetLB( $wiki ); |
| 54 | + $db = $lb->getConnection( DB_MASTER, array(), $wiki ); |
| 55 | + $db->query( "TRUNCATE TABLE " . $db->tableName( 'msg_resource' ), __METHOD__ ); |
| 56 | + $db->query( "TRUNCATE TABLE " . $db->tableName( 'msg_resource_links' ), __METHOD__ ); |
| 57 | + $lb->reuseConnection( $db ); |
| 58 | + } |
| 59 | + echo "Done.\n"; |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +$maintClass = 'ClearMessageBlobs'; |
| 64 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/clearMessageBlobs.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 65 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/storageTypeStatsSum.py |
— | — | @@ -0,0 +1,113 @@ |
| 2 | +#!/usr/bin/python |
| 3 | + |
| 4 | + |
| 5 | +""" |
| 6 | + |
| 7 | + For more detail, see http://wikitech.wikimedia.org/view/Text_storage_data |
| 8 | + |
| 9 | + |
| 10 | + reads in a file which should contain the output of |
| 11 | + ben@hume:~$ /home/w/bin/foreachwiki maintenance/storage/storageTypeStats.php > /tmp/storageTypeStats.log |
| 12 | + Parses it and sums up the values for all wikis. |
| 13 | + prints this sum to stdout. |
| 14 | + |
| 15 | + Example content: |
| 16 | + |
| 17 | +ben@fenari:~/storageStats$ cat sample_output.txt |
| 18 | +----------------------------------------------------------------- |
| 19 | +aawiki |
| 20 | +----------------------------------------------------------------- |
| 21 | +aawiki: Using bin size of 100 |
| 22 | +aawiki: 0^M1000^M2000^M3000^M4000^M5000^M6000^M7000^M8000^M9000^M10000^M |
| 23 | +aawiki: |
| 24 | +aawiki: Flags Class Count old_id range |
| 25 | +aawiki: ------------------------------------------------------------------------------------------------------------------------ |
| 26 | +aawiki: gzip [none] 4568 0 - 4700 |
| 27 | +aawiki: [none] [none] 1615 4600 - 6300 |
| 28 | +aawiki: utf-8,gzip [none] 1883 5300 - 8300 |
| 29 | +aawiki: external,utf-8 CGZ pointer 626 6200 - 10300 |
| 30 | +aawiki: external,utf-8 DHB pointer 368 9100 - 10300 |
| 31 | +aawiki: utf-8,gzip,external simple pointer 975 8200 - 10400 |
| 32 | +aawiki: external,utf8 DHB pointer 211 9400 - 10200 |
| 33 | +----------------------------------------------------------------- |
| 34 | +aawikibooks |
| 35 | +----------------------------------------------------------------- |
| 36 | +aawikibooks: Using bin size of 100 |
| 37 | +aawikibooks: 0^M1000^M2000^M3000^M |
| 38 | +aawikibooks: |
| 39 | +aawikibooks: Flags Class Count old_id range |
| 40 | +aawikibooks: ------------------------------------------------------------------------------------------------------------------------ |
| 41 | +aawikibooks: [none] [none] 881 0 - 1000 |
| 42 | +aawikibooks: external,utf-8 CGZ pointer 187 0 - 3400 |
| 43 | +aawikibooks: external,utf-8 DHB pointer 34 3200 - 3400 |
| 44 | +aawikibooks: object historyblobcurstub 898 900 - 1900 |
| 45 | +aawikibooks: utf-8,gzip [none] 900 1800 - 2900 |
| 46 | +aawikibooks: utf-8,gzip,external simple pointer 431 2800 - 3400 |
| 47 | +aawikibooks: external,utf8 DHB pointer 25 3300 - 3400 |
| 48 | + |
| 49 | +""" |
| 50 | + |
| 51 | + |
| 52 | +import re |
| 53 | +import optparse |
| 54 | + |
| 55 | +## |
| 56 | +## set up argument parsing. Require --input (or -i) and a filename. |
| 57 | +usage = "usage: %prog <input>" |
| 58 | +desc = """Sum the storage types across all wikis. The input file should |
| 59 | +contain the output of: |
| 60 | + foreachwiki maintenance/storage/storageTypeStats.php |
| 61 | +""" |
| 62 | + |
| 63 | +parser = optparse.OptionParser(usage=usage, description=desc) |
| 64 | +(opts, args) = parser.parse_args() |
| 65 | +if len(args) != 1: |
| 66 | + print "I can't do anything without a file to parse. Sorry!" |
| 67 | + parser.print_help() |
| 68 | + exit(1) |
| 69 | + |
| 70 | +input = args[0] |
| 71 | + |
| 72 | +try: |
| 73 | + file=open(input, 'r') |
| 74 | + |
| 75 | + # create a bunch of regexes to match various sections of the file |
| 76 | + # a section starts with nothing on the line but the name of the wiki db |
| 77 | + #aawikibooks |
| 78 | + start_section = re.compile("^(?P<dbname>[a-z0-9_]+)$") |
| 79 | + #aawikibooks: external,utf-8 DHB pointer 34 3200 - 3400 |
| 80 | + counter = re.compile("^[a-z0-9_]*: *(?P<flags>[^ ]+) +(?P<class>[^ ]+ [^ ]*) +(?P<count>\d+) +.*") |
| 81 | + |
| 82 | + # create a bunch of counters |
| 83 | + wiki_count=0 |
| 84 | + content_counters = dict() |
| 85 | + |
| 86 | + # ok, parse the file and collect stats! |
| 87 | + for line in file: |
| 88 | + match = start_section.match(line) |
| 89 | + if match: |
| 90 | + # this isn't actually used yet, but is in here for when we |
| 91 | + # want more interesting stats and collect per-db |
| 92 | + wiki_count += 1 |
| 93 | + db_name=match.group('dbname') |
| 94 | + match = counter.match(line) |
| 95 | + if match: |
| 96 | + # sum all unique class,flags combinations |
| 97 | + key = "%s/%s" % (match.group('flags'), match.group('class')) |
| 98 | + try: |
| 99 | + content_counters[key] += int(match.group('count')) |
| 100 | + except KeyError: |
| 101 | + content_counters[key] = int(match.group('count')) |
| 102 | + |
| 103 | + |
| 104 | +except IOError, e: |
| 105 | + print "omg io error %s!" % e |
| 106 | + raise e |
| 107 | + |
| 108 | +print "Results:" |
| 109 | +print " Count Type" |
| 110 | +print "------------------------------------------" |
| 111 | +for key in sorted(content_counters.keys()): |
| 112 | + print "%12d %s" % (content_counters[key], key) |
| 113 | +print "all done!" |
| 114 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/storageTypeStatsSum.py |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 115 | + native |
Added: svn:executable |
2 | 116 | + * |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/make-all-blobs |
— | — | @@ -0,0 +1,18 @@ |
| 2 | +#!/bin/bash |
| 3 | + |
| 4 | +if [ -z $1 ];then |
| 5 | + echo "Usage: make-all-blobs <server> [<table name>]" |
| 6 | + exit 1 |
| 7 | +fi |
| 8 | +server=$1 |
| 9 | +if [ -z $2 ]; then |
| 10 | + table=blobs |
| 11 | +else |
| 12 | + table=$2 |
| 13 | +fi |
| 14 | + |
| 15 | +for db in `</home/wikipedia/common/all.dblist`;do |
| 16 | + echo "CREATE DATABASE IF NOT EXISTS $db" | mysql -u wikiadmin -p`wikiadmin_pass` -h $server && \ |
| 17 | + sed "s/blobs\>/$table/" blobs.sql | mysql -u wikiadmin -p`wikiadmin_pass` -h $server $db |
| 18 | +done |
| 19 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/make-all-blobs |
___________________________________________________________________ |
Added: svn:mergeinfo |
1 | 20 | Merged /branches/wmf-deployment/maintenance/storage/make-all-blobs:r60970 |
2 | 21 | Merged /branches/REL1_15/phase3/maintenance/storage/make-all-blobs:r51646 |
3 | 22 | Merged /branches/wmf/1.16wmf4/maintenance/storage/make-all-blobs:r67177,69199,76243,77266 |
4 | 23 | Merged /trunk/phase3/maintenance/storage/make-all-blobs:r52290,52402,52404,52718,52737,52759,52776,52791,52800,52808,52812-52813,52815-52819,52822,52846,52850,52852-52853,52855-52857,52859,52924,52986,53128-53129,53190,53197,53199,53203-53204,53210-53211,53247,53249,53252,53267,53270,53293,53305,53344,53369,53427,53502-53504,53506,53777,54384,54494,54592,54599-54602,54604,54613,54764,54793,54806,55178,55626,56325,56862,56867,57154-57447,57541,57916,58151,58219,58633,58816,77555,77558-77560,77563-77565,77573 |
Added: svn:eol-style |
5 | 24 | + native |
Added: svn:executable |
6 | 25 | + * |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/storageTypeStatsDiff.py |
— | — | @@ -0,0 +1,113 @@ |
| 2 | +#!/usr/bin/python |
| 3 | + |
| 4 | + |
| 5 | +""" |
| 6 | + |
| 7 | + For more detail, see http://wikitech.wikimedia.org/view/Text_storage_data |
| 8 | + |
| 9 | + reads in two files which should contain the output of storageTypeStatsSum.py |
| 10 | + Parses them both and calculates the difference for each storage type |
| 11 | + prints this to stdout. |
| 12 | + |
| 13 | + For best results, give the old and new files their dates for names, eg: |
| 14 | + ben@fenari:~/storageStats$ ./storageTypeStatsDiff.py 2010-02-18 2011-08-31 |
| 15 | + |
| 16 | + Example content: |
| 17 | + |
| 18 | +ben@fenari:~/storageStats$ cat 2010-02-18 |
| 19 | +Results: |
| 20 | + Count Type |
| 21 | +------------------------------------------ |
| 22 | + 9 0,external/simple pointer |
| 23 | + 435 0/[none] |
| 24 | + 1482941 [none]/[none] |
| 25 | + 968957 gzip/[none] |
| 26 | + 178234 object,external/simple pointer |
| 27 | + 1800 object,utf-8/[none] |
| 28 | + 17076928 utf-8,gzip/[none] |
| 29 | + 1269 utf-8/[none] |
| 30 | +all done! |
| 31 | + |
| 32 | +ben@fenari:~/storageStats$ cat 2011-08-31 |
| 33 | +Results: |
| 34 | + Count Type |
| 35 | +------------------------------------------ |
| 36 | + 9 0,external/simple pointer |
| 37 | + 1435 0/[none] |
| 38 | + 1002341 [none]/[none] |
| 39 | + 1234212 object,external/simple pointer |
| 40 | + 213 object,external/blob |
| 41 | + 20 object,utf-8/[none] |
| 42 | + 123428 utf-8,gzip/[none] |
| 43 | + 123 utf-8/[none] |
| 44 | +all done! |
| 45 | + |
| 46 | +""" |
| 47 | + |
| 48 | + |
| 49 | +import re |
| 50 | +import optparse |
| 51 | + |
| 52 | +## |
| 53 | +## set up argument parsing. |
| 54 | +usage = "usage: %prog <old-stats-file> <new-stats-file>" |
| 55 | +desc = "Calculate the difference between two files containing storageTypeStatsSum.py output" |
| 56 | +parser = optparse.OptionParser(usage=usage, description=desc) |
| 57 | +(opts, args) = parser.parse_args() |
| 58 | +# Require exactly two arguments |
| 59 | +if len(args) != 2: |
| 60 | + print "Two files needed." |
| 61 | + parser.print_help() |
| 62 | + exit() |
| 63 | + |
| 64 | +try: |
| 65 | + oldfile=open(args[0], 'r') |
| 66 | + newfile=open(args[1], 'r') |
| 67 | +except IOError, e: |
| 68 | + print "IOError trying to open %s or %s: %s\n" % (args[0], args[1], e) |
| 69 | + exit(1) |
| 70 | + |
| 71 | +# match only the actual value / key lines; ignore everything else |
| 72 | +valueline = re.compile("^ *(?P<val>\d+) *(?P<desc>.*)$") |
| 73 | + |
| 74 | +files={} |
| 75 | +# ok, parse the files and collect stats! |
| 76 | +for file in (oldfile, newfile): |
| 77 | + stats = {} |
| 78 | + for line in file: |
| 79 | + match = valueline.match(line) |
| 80 | + if match: |
| 81 | + stats[match.group('desc')] = int(match.group('val')) |
| 82 | + #stats collected for one file, save it to the files dict |
| 83 | + files[file.name] = stats |
| 84 | + |
| 85 | +# calculate the difference |
| 86 | +diff = {} # contains numbers keyed on storage types |
| 87 | +allkeys = [] |
| 88 | +# collect keys from both sets in case they don't match |
| 89 | +for stats in files.keys(): |
| 90 | + # get the union of allkeys and this file's stats keys |
| 91 | + allkeys = list( set(allkeys) | set(files[stats].keys()) ) |
| 92 | +for key in allkeys: |
| 93 | + try: |
| 94 | + diff[key] = files[newfile.name][key] - files[oldfile.name][key] |
| 95 | + except KeyError: |
| 96 | + # this happens when a key only exists in one set |
| 97 | + diff[key] = 'n/a' |
| 98 | + |
| 99 | +# print out results |
| 100 | +print "%12s %12s %12s %s" % (oldfile.name, newfile.name, 'Diff', 'Type') |
| 101 | +print "---------------------------------------------------------------------" |
| 102 | +for key in sorted(allkeys): |
| 103 | + try: |
| 104 | + oldval = files[oldfile.name][key] |
| 105 | + except KeyError: |
| 106 | + oldval = 'n/a' |
| 107 | + try: |
| 108 | + newval = files[newfile.name][key] |
| 109 | + except KeyError: |
| 110 | + newval = 'n/a' |
| 111 | + diffnum = diff[key] |
| 112 | + name = key |
| 113 | + print "%12s %12s %12s %s" % (oldval, newval, diffnum, name) |
| 114 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/storageTypeStatsDiff.py |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 115 | + native |
Added: svn:executable |
2 | 116 | + * |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/testRctComplete.php |
— | — | @@ -0,0 +1,22 @@ |
| 2 | +<?php |
| 3 | +require_once( dirname(__FILE__).'/../commandLine.inc' ); |
| 4 | + |
| 5 | +$bad = 0; |
| 6 | +$good = 0; |
| 7 | +foreach ( $wgLocalDatabases as $wiki ) { |
| 8 | + $lb = wfGetLB( $wiki ); |
| 9 | + $db = $lb->getConnection( DB_SLAVE, array(), $wiki ); |
| 10 | + if ( $db->tableExists( 'blob_tracking' ) ) { |
| 11 | + $notDone = $db->selectField( 'blob_tracking', '1', |
| 12 | + array( 'bt_moved' => 0 ) ); |
| 13 | + if ( $notDone ) { |
| 14 | + $bad++; |
| 15 | + echo "$wiki\n"; |
| 16 | + } else { |
| 17 | + $good++; |
| 18 | + } |
| 19 | + } |
| 20 | + $lb->reuseConnection( $db ); |
| 21 | +} |
| 22 | +echo "$bad wiki(s) incomplete\n"; |
| 23 | +echo "$good wiki(s) complete\n"; |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/storage/testRctComplete.php |
___________________________________________________________________ |
Added: svn:mergeinfo |
1 | 24 | Merged /trunk/phase3/maintenance/storage/testRctComplete.php:r52290,52402,52404,52718,52737,52759,52776,52791,52800,52808,52812-52813,52815-52819,52822,52846,52850,52852-52853,52855-52857,52859,52924,52986,53128-53129,53190,53197,53199,53203-53204,53210-53211,53247,53249,53252,53267,53270,53293,53305,53344,53369,53427,53502-53504,53506,53777,54384,54494,54592,54599-54602,54604,54613,54764,54793,54806,55178,55626,56325,56862,56867,57154-57447,57541,57916,58151,58219,58633,58816,77555,77558-77560,77563-77565,77573 |
2 | 25 | Merged /branches/wmf-deployment/maintenance/storage/testRctComplete.php:r60970 |
3 | 26 | Merged /branches/REL1_15/phase3/maintenance/storage/testRctComplete.php:r51646 |
4 | 27 | Merged /branches/wmf/1.16wmf4/maintenance/storage/testRctComplete.php:r67177,69199,76243,77266 |
Added: svn:eol-style |
5 | 28 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/wikipedia-interwiki.sql |
— | — | @@ -0,0 +1,289 @@ |
| 2 | +-- For convenience, here are the *in-project* interwiki prefixes |
| 3 | +-- for Wikipedia. |
| 4 | + |
| 5 | +REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES |
| 6 | +-- Non-Wikipedia sites: |
| 7 | +('q','http://en.wikiquote.org/wiki/$1',1), |
| 8 | +('b','http://en.wikibooks.org/wiki/$1',1), |
| 9 | +('s','http://en.wikisource.org/wiki/$1',1), |
| 10 | +('n','http://en.wikinews.org/wiki/$1',1), |
| 11 | +('v','http://en.wikiversity.org/wiki/$1',1), |
| 12 | +('meta','http://meta.wikimedia.org/wiki/$1',1), |
| 13 | +('m','http://meta.wikimedia.org/wiki/$1',1), |
| 14 | +-- An alphabetical list of Wikipedia sites: |
| 15 | +('aa','http://aa.wikipedia.org/wiki/$1',1), |
| 16 | +('ab','http://ab.wikipedia.org/wiki/$1',1), |
| 17 | +('ace','http://ace.wikipedia.org/wiki/$1',1), |
| 18 | +('af','http://af.wikipedia.org/wiki/$1',1), |
| 19 | +('ak','http://ak.wikipedia.org/wiki/$1',1), |
| 20 | +('als','http://als.wikipedia.org/wiki/$1',1), |
| 21 | +('am','http://am.wikipedia.org/wiki/$1',1), |
| 22 | +('an','http://an.wikipedia.org/wiki/$1',1), |
| 23 | +('ang','http://ang.wikipedia.org/wiki/$1',1), |
| 24 | +('ar','http://ar.wikipedia.org/wiki/$1',1), |
| 25 | +('arc','http://arc.wikipedia.org/wiki/$1',1), |
| 26 | +('arz','http://arz.wikipedia.org/wiki/$1',1), |
| 27 | +('as','http://as.wikipedia.org/wiki/$1',1), |
| 28 | +('ast','http://ast.wikipedia.org/wiki/$1',1), |
| 29 | +('av','http://av.wikipedia.org/wiki/$1',1), |
| 30 | +('ay','http://ay.wikipedia.org/wiki/$1',1), |
| 31 | +('az','http://az.wikipedia.org/wiki/$1',1), |
| 32 | +('ba','http://ba.wikipedia.org/wiki/$1',1), |
| 33 | +('bar','http://bar.wikipedia.org/wiki/$1',1), |
| 34 | +('bat-smg','http://bat-smg.wikipedia.org/wiki/$1',1), |
| 35 | +('bcl','http://bcl.wikipedia.org/wiki/$1',1), |
| 36 | +('be','http://be.wikipedia.org/wiki/$1',1), |
| 37 | +('be-x-old','http://be-x-old.wikipedia.org/wiki/$1',1), |
| 38 | +('bg','http://bg.wikipedia.org/wiki/$1',1), |
| 39 | +('bh','http://bh.wikipedia.org/wiki/$1',1), |
| 40 | +('bi','http://bi.wikipedia.org/wiki/$1',1), |
| 41 | +('bm','http://bm.wikipedia.org/wiki/$1',1), |
| 42 | +('bn','http://bn.wikipedia.org/wiki/$1',1), |
| 43 | +('bo','http://bo.wikipedia.org/wiki/$1',1), |
| 44 | +('bpy','http://bpy.wikipedia.org/wiki/$1',1), |
| 45 | +('br','http://br.wikipedia.org/wiki/$1',1), |
| 46 | +('bs','http://bs.wikipedia.org/wiki/$1',1), |
| 47 | +('bug','http://bug.wikipedia.org/wiki/$1',1), |
| 48 | +('bxr','http://bxr.wikipedia.org/wiki/$1',1), |
| 49 | +('ca','http://ca.wikipedia.org/wiki/$1',1), |
| 50 | +('cbk-zam','http://cbk-zam.wikipedia.org/wiki/$1',1), |
| 51 | +('cdo','http://cdo.wikipedia.org/wiki/$1',1), |
| 52 | +('ce','http://ce.wikipedia.org/wiki/$1',1), |
| 53 | +('ceb','http://ceb.wikipedia.org/wiki/$1',1), |
| 54 | +('ch','http://ch.wikipedia.org/wiki/$1',1), |
| 55 | +('cho','http://cho.wikipedia.org/wiki/$1',1), |
| 56 | +('chr','http://chr.wikipedia.org/wiki/$1',1), |
| 57 | +('chy','http://chy.wikipedia.org/wiki/$1',1), |
| 58 | +('ckb','http://ckb.wikipedia.org/wiki/$1',1), |
| 59 | +('co','http://co.wikipedia.org/wiki/$1',1), |
| 60 | +('cr','http://cr.wikipedia.org/wiki/$1',1), |
| 61 | +('crh','http://crh.wikipedia.org/wiki/$1',1), |
| 62 | +('cs','http://cs.wikipedia.org/wiki/$1',1), |
| 63 | +('csb','http://csb.wikipedia.org/wiki/$1',1), |
| 64 | +('cu','http://cu.wikipedia.org/wiki/$1',1), |
| 65 | +('cv','http://cv.wikipedia.org/wiki/$1',1), |
| 66 | +('cy','http://cy.wikipedia.org/wiki/$1',1), |
| 67 | +('da','http://da.wikipedia.org/wiki/$1',1), |
| 68 | +('de','http://de.wikipedia.org/wiki/$1',1), |
| 69 | +('diq','http://diq.wikipedia.org/wiki/$1',1), |
| 70 | +('dk','http://da.wikipedia.org/wiki/$1',1), |
| 71 | +('dsb','http://dsb.wikipedia.org/wiki/$1',1), |
| 72 | +('dv','http://dv.wikipedia.org/wiki/$1',1), |
| 73 | +('dz','http://dz.wikipedia.org/wiki/$1',1), |
| 74 | +('ee','http://ee.wikipedia.org/wiki/$1',1), |
| 75 | +('el','http://el.wikipedia.org/wiki/$1',1), |
| 76 | +('en','http://en.wikipedia.org/wiki/$1',1), |
| 77 | +('eo','http://eo.wikipedia.org/wiki/$1',1), |
| 78 | +('es','http://es.wikipedia.org/wiki/$1',1), |
| 79 | +('et','http://et.wikipedia.org/wiki/$1',1), |
| 80 | +('eu','http://eu.wikipedia.org/wiki/$1',1), |
| 81 | +('ext','http://ext.wikipedia.org/wiki/$1',1), |
| 82 | +('fa','http://fa.wikipedia.org/wiki/$1',1), |
| 83 | +('ff','http://ff.wikipedia.org/wiki/$1',1), |
| 84 | +('fi','http://fi.wikipedia.org/wiki/$1',1), |
| 85 | +('fiu-vro','http://fiu-vro.wikipedia.org/wiki/$1',1), |
| 86 | +('fj','http://fj.wikipedia.org/wiki/$1',1), |
| 87 | +('fo','http://fo.wikipedia.org/wiki/$1',1), |
| 88 | +('fr','http://fr.wikipedia.org/wiki/$1',1), |
| 89 | +('frp','http://frp.wikipedia.org/wiki/$1',1), |
| 90 | +('fur','http://fur.wikipedia.org/wiki/$1',1), |
| 91 | +('fy','http://fy.wikipedia.org/wiki/$1',1), |
| 92 | +('ga','http://ga.wikipedia.org/wiki/$1',1), |
| 93 | +('gan','http://gan.wikipedia.org/wiki/$1',1), |
| 94 | +('gd','http://gd.wikipedia.org/wiki/$1',1), |
| 95 | +('gl','http://gl.wikipedia.org/wiki/$1',1), |
| 96 | +('glk','http://glk.wikipedia.org/wiki/$1',1), |
| 97 | +('gn','http://gn.wikipedia.org/wiki/$1',1), |
| 98 | +('got','http://got.wikipedia.org/wiki/$1',1), |
| 99 | +('gu','http://gu.wikipedia.org/wiki/$1',1), |
| 100 | +('gv','http://gv.wikipedia.org/wiki/$1',1), |
| 101 | +('ha','http://ha.wikipedia.org/wiki/$1',1), |
| 102 | +('hak','http://hak.wikipedia.org/wiki/$1',1), |
| 103 | +('haw','http://haw.wikipedia.org/wiki/$1',1), |
| 104 | +('he','http://he.wikipedia.org/wiki/$1',1), |
| 105 | +('hi','http://hi.wikipedia.org/wiki/$1',1), |
| 106 | +('hif','http://hif.wikipedia.org/wiki/$1',1), |
| 107 | +('ho','http://ho.wikipedia.org/wiki/$1',1), |
| 108 | +('hr','http://hr.wikipedia.org/wiki/$1',1), |
| 109 | +('hsb','http://hsb.wikipedia.org/wiki/$1',1), |
| 110 | +('ht','http://ht.wikipedia.org/wiki/$1',1), |
| 111 | +('hu','http://hu.wikipedia.org/wiki/$1',1), |
| 112 | +('hy','http://hy.wikipedia.org/wiki/$1',1), |
| 113 | +('hz','http://hz.wikipedia.org/wiki/$1',1), |
| 114 | +('ia','http://ia.wikipedia.org/wiki/$1',1), |
| 115 | +('id','http://id.wikipedia.org/wiki/$1',1), |
| 116 | +('ie','http://ie.wikipedia.org/wiki/$1',1), |
| 117 | +('ig','http://ig.wikipedia.org/wiki/$1',1), |
| 118 | +('ii','http://ii.wikipedia.org/wiki/$1',1), |
| 119 | +('ik','http://ik.wikipedia.org/wiki/$1',1), |
| 120 | +('ilo','http://ilo.wikipedia.org/wiki/$1',1), |
| 121 | +('io','http://io.wikipedia.org/wiki/$1',1), |
| 122 | +('is','http://is.wikipedia.org/wiki/$1',1), |
| 123 | +('it','http://it.wikipedia.org/wiki/$1',1), |
| 124 | +('iu','http://iu.wikipedia.org/wiki/$1',1), |
| 125 | +('ja','http://ja.wikipedia.org/wiki/$1',1), |
| 126 | +('jbo','http://jbo.wikipedia.org/wiki/$1',1), |
| 127 | +('jv','http://jv.wikipedia.org/wiki/$1',1), |
| 128 | +('ka','http://ka.wikipedia.org/wiki/$1',1), |
| 129 | +('kab','http://kab.wikipedia.org/wiki/$1',1), |
| 130 | +('kg','http://kg.wikipedia.org/wiki/$1',1), |
| 131 | +('ki','http://ki.wikipedia.org/wiki/$1',1), |
| 132 | +('kj','http://kj.wikipedia.org/wiki/$1',1), |
| 133 | +('kk','http://kk.wikipedia.org/wiki/$1',1), |
| 134 | +('kl','http://kl.wikipedia.org/wiki/$1',1), |
| 135 | +('km','http://km.wikipedia.org/wiki/$1',1), |
| 136 | +('kn','http://kn.wikipedia.org/wiki/$1',1), |
| 137 | +('ko','http://ko.wikipedia.org/wiki/$1',1), |
| 138 | +('kr','http://kr.wikipedia.org/wiki/$1',1), |
| 139 | +('ks','http://ks.wikipedia.org/wiki/$1',1), |
| 140 | +('ksh','http://ksh.wikipedia.org/wiki/$1',1), |
| 141 | +('ku','http://ku.wikipedia.org/wiki/$1',1), |
| 142 | +('kv','http://kv.wikipedia.org/wiki/$1',1), |
| 143 | +('kw','http://kw.wikipedia.org/wiki/$1',1), |
| 144 | +('ky','http://ky.wikipedia.org/wiki/$1',1), |
| 145 | +('la','http://la.wikipedia.org/wiki/$1',1), |
| 146 | +('lad','http://lad.wikipedia.org/wiki/$1',1), |
| 147 | +('lb','http://lb.wikipedia.org/wiki/$1',1), |
| 148 | +('lbe','http://lbe.wikipedia.org/wiki/$1',1), |
| 149 | +('lg','http://lg.wikipedia.org/wiki/$1',1), |
| 150 | +('li','http://li.wikipedia.org/wiki/$1',1), |
| 151 | +('lij','http://lij.wikipedia.org/wiki/$1',1), |
| 152 | +('lmo','http://lmo.wikipedia.org/wiki/$1',1), |
| 153 | +('ln','http://ln.wikipedia.org/wiki/$1',1), |
| 154 | +('lo','http://lo.wikipedia.org/wiki/$1',1), |
| 155 | +('lt','http://lt.wikipedia.org/wiki/$1',1), |
| 156 | +('lv','http://lv.wikipedia.org/wiki/$1',1), |
| 157 | +('map-bms','http://map-bms.wikipedia.org/wiki/$1',1), |
| 158 | +('mdf','http://mdf.wikipedia.org/wiki/$1',1), |
| 159 | +('mg','http://mg.wikipedia.org/wiki/$1',1), |
| 160 | +('mh','http://mh.wikipedia.org/wiki/$1',1), |
| 161 | +('mhr','http://mhr.wikipedia.org/wiki/$1',1), |
| 162 | +('mi','http://mi.wikipedia.org/wiki/$1',1), |
| 163 | +('minnan','http://zh-min-nan.wikipedia.org/wiki/$1',1), |
| 164 | +('mk','http://mk.wikipedia.org/wiki/$1',1), |
| 165 | +('ml','http://ml.wikipedia.org/wiki/$1',1), |
| 166 | +('mn','http://mn.wikipedia.org/wiki/$1',1), |
| 167 | +('mo','http://mo.wikipedia.org/wiki/$1',1), |
| 168 | +('mr','http://mr.wikipedia.org/wiki/$1',1), |
| 169 | +('ms','http://ms.wikipedia.org/wiki/$1',1), |
| 170 | +('mt','http://mt.wikipedia.org/wiki/$1',1), |
| 171 | +('mus','http://mus.wikipedia.org/wiki/$1',1), |
| 172 | +('mwl','http://mwl.wikipedia.org/wiki/$1',1), |
| 173 | +('my','http://my.wikipedia.org/wiki/$1',1), |
| 174 | +('myv','http://myv.wikipedia.org/wiki/$1',1), |
| 175 | +('mzn','http://mzn.wikipedia.org/wiki/$1',1), |
| 176 | +('na','http://na.wikipedia.org/wiki/$1',1), |
| 177 | +('nah','http://nah.wikipedia.org/wiki/$1',1), |
| 178 | +('nan','http://zh-min-nan.wikipedia.org/wiki/$1',1), |
| 179 | +('nap','http://nap.wikipedia.org/wiki/$1',1), |
| 180 | +('nb','http://nb.wikipedia.org/wiki/$1',1), |
| 181 | +('nds','http://nds.wikipedia.org/wiki/$1',1), |
| 182 | +('nds-nl','http://nds-nl.wikipedia.org/wiki/$1',1), |
| 183 | +('ne','http://ne.wikipedia.org/wiki/$1',1), |
| 184 | +('ng','http://ng.wikipedia.org/wiki/$1',1), |
| 185 | +('nl','http://nl.wikipedia.org/wiki/$1',1), |
| 186 | +('nn','http://nn.wikipedia.org/wiki/$1',1), |
| 187 | +('no','http://no.wikipedia.org/wiki/$1',1), |
| 188 | +('nov','http://nov.wikipedia.org/wiki/$1',1), |
| 189 | +('nrm','http://nrm.wikipedia.org/wiki/$1',1), |
| 190 | +('nv','http://nv.wikipedia.org/wiki/$1',1), |
| 191 | +('ny','http://ny.wikipedia.org/wiki/$1',1), |
| 192 | +('oc','http://oc.wikipedia.org/wiki/$1',1), |
| 193 | +('om','http://om.wikipedia.org/wiki/$1',1), |
| 194 | +('or','http://or.wikipedia.org/wiki/$1',1), |
| 195 | +('os','http://os.wikipedia.org/wiki/$1',1), |
| 196 | +('pa','http://pa.wikipedia.org/wiki/$1',1), |
| 197 | +('pag','http://pag.wikipedia.org/wiki/$1',1), |
| 198 | +('pam','http://pam.wikipedia.org/wiki/$1',1), |
| 199 | +('pap','http://pap.wikipedia.org/wiki/$1',1), |
| 200 | +('pdc','http://pdc.wikipedia.org/wiki/$1',1), |
| 201 | +('pi','http://pi.wikipedia.org/wiki/$1',1), |
| 202 | +('pih','http://pih.wikipedia.org/wiki/$1',1), |
| 203 | +('pl','http://pl.wikipedia.org/wiki/$1',1), |
| 204 | +('pms','http://pms.wikipedia.org/wiki/$1',1), |
| 205 | +('pnb','http://pnb.wikipedia.org/wiki/$1',1), |
| 206 | +('ps','http://ps.wikipedia.org/wiki/$1',1), |
| 207 | +('pt','http://pt.wikipedia.org/wiki/$1',1), |
| 208 | +('qu','http://qu.wikipedia.org/wiki/$1',1), |
| 209 | +('rm','http://rm.wikipedia.org/wiki/$1',1), |
| 210 | +('rmy','http://rmy.wikipedia.org/wiki/$1',1), |
| 211 | +('rn','http://rn.wikipedia.org/wiki/$1',1), |
| 212 | +('ro','http://ro.wikipedia.org/wiki/$1',1), |
| 213 | +('roa-rup','http://roa-rup.wikipedia.org/wiki/$1',1), |
| 214 | +('roa-tara','http://roa-tara.wikipedia.org/wiki/$1',1), |
| 215 | +('ru','http://ru.wikipedia.org/wiki/$1',1), |
| 216 | +('rw','http://rw.wikipedia.org/wiki/$1',1), |
| 217 | +('sa','http://sa.wikipedia.org/wiki/$1',1), |
| 218 | +('sah','http://sah.wikipedia.org/wiki/$1',1), |
| 219 | +('sc','http://sc.wikipedia.org/wiki/$1',1), |
| 220 | +('scn','http://scn.wikipedia.org/wiki/$1',1), |
| 221 | +('sco','http://sco.wikipedia.org/wiki/$1',1), |
| 222 | +('sd','http://sd.wikipedia.org/wiki/$1',1), |
| 223 | +('se','http://se.wikipedia.org/wiki/$1',1), |
| 224 | +('sep11','http://sep11.wikipedia.org/wiki/$1',1), |
| 225 | +('sg','http://sg.wikipedia.org/wiki/$1',1), |
| 226 | +('sh','http://sh.wikipedia.org/wiki/$1',1), |
| 227 | +('si','http://si.wikipedia.org/wiki/$1',1), |
| 228 | +('simple','http://simple.wikipedia.org/wiki/$1',1), |
| 229 | +('sk','http://sk.wikipedia.org/wiki/$1',1), |
| 230 | +('sl','http://sl.wikipedia.org/wiki/$1',1), |
| 231 | +('sm','http://sm.wikipedia.org/wiki/$1',1), |
| 232 | +('sn','http://sn.wikipedia.org/wiki/$1',1), |
| 233 | +('so','http://so.wikipedia.org/wiki/$1',1), |
| 234 | +('sq','http://sq.wikipedia.org/wiki/$1',1), |
| 235 | +('sr','http://sr.wikipedia.org/wiki/$1',1), |
| 236 | +('srn','http://srn.wikipedia.org/wiki/$1',1), |
| 237 | +('ss','http://ss.wikipedia.org/wiki/$1',1), |
| 238 | +('st','http://st.wikipedia.org/wiki/$1',1), |
| 239 | +('stq','http://stq.wikipedia.org/wiki/$1',1), |
| 240 | +('su','http://su.wikipedia.org/wiki/$1',1), |
| 241 | +('sv','http://sv.wikipedia.org/wiki/$1',1), |
| 242 | +('sw','http://sw.wikipedia.org/wiki/$1',1), |
| 243 | +('szl','http://szl.wikipedia.org/wiki/$1',1), |
| 244 | +('ta','http://ta.wikipedia.org/wiki/$1',1), |
| 245 | +('te','http://te.wikipedia.org/wiki/$1',1), |
| 246 | +('tet','http://tet.wikipedia.org/wiki/$1',1), |
| 247 | +('tg','http://tg.wikipedia.org/wiki/$1',1), |
| 248 | +('th','http://th.wikipedia.org/wiki/$1',1), |
| 249 | +('ti','http://ti.wikipedia.org/wiki/$1',1), |
| 250 | +('tk','http://tk.wikipedia.org/wiki/$1',1), |
| 251 | +('tl','http://tl.wikipedia.org/wiki/$1',1), |
| 252 | +('tn','http://tn.wikipedia.org/wiki/$1',1), |
| 253 | +('to','http://to.wikipedia.org/wiki/$1',1), |
| 254 | +('tpi','http://tpi.wikipedia.org/wiki/$1',1), |
| 255 | +('tr','http://tr.wikipedia.org/wiki/$1',1), |
| 256 | +('ts','http://ts.wikipedia.org/wiki/$1',1), |
| 257 | +('tt','http://tt.wikipedia.org/wiki/$1',1), |
| 258 | +('tum','http://tum.wikipedia.org/wiki/$1',1), |
| 259 | +('tw','http://tw.wikipedia.org/wiki/$1',1), |
| 260 | +('ty','http://ty.wikipedia.org/wiki/$1',1), |
| 261 | +('udm','http://udm.wikipedia.org/wiki/$1',1), |
| 262 | +('ug','http://ug.wikipedia.org/wiki/$1',1), |
| 263 | +('uk','http://uk.wikipedia.org/wiki/$1',1), |
| 264 | +('ur','http://ur.wikipedia.org/wiki/$1',1), |
| 265 | +('uz','http://uz.wikipedia.org/wiki/$1',1), |
| 266 | +('ve','http://ve.wikipedia.org/wiki/$1',1), |
| 267 | +('vec','http://vec.wikipedia.org/wiki/$1',1), |
| 268 | +('vi','http://vi.wikipedia.org/wiki/$1',1), |
| 269 | +('vls','http://vls.wikipedia.org/wiki/$1',1), |
| 270 | +('vo','http://vo.wikipedia.org/wiki/$1',1), |
| 271 | +('w','http://en.wikipedia.org/wiki/$1',1), |
| 272 | +('wa','http://wa.wikipedia.org/wiki/$1',1), |
| 273 | +('war','http://war.wikipedia.org/wiki/$1',1), |
| 274 | +('wo','http://wo.wikipedia.org/wiki/$1',1), |
| 275 | +('wuu','http://wuu.wikipedia.org/wiki/$1',1), |
| 276 | +('xal','http://xal.wikipedia.org/wiki/$1',1), |
| 277 | +('xh','http://xh.wikipedia.org/wiki/$1',1), |
| 278 | +('yi','http://yi.wikipedia.org/wiki/$1',1), |
| 279 | +('yo','http://yo.wikipedia.org/wiki/$1',1), |
| 280 | +('yue','http://zh-yue.wikipedia.org/wiki/$1',1), |
| 281 | +('za','http://za.wikipedia.org/wiki/$1',1), |
| 282 | +('zea','http://zea.wikipedia.org/wiki/$1',1), |
| 283 | +('zh','http://zh.wikipedia.org/wiki/$1',1), |
| 284 | +('zh-cfr','http://zh-min-nan.wikipedia.org/wiki/$1',1), |
| 285 | +('zh-classical','http://zh-classical.wikipedia.org/wiki/$1',1), |
| 286 | +('zh-cn','http://zh.wikipedia.org/wiki/$1',1), |
| 287 | +('zh-min-nan','http://zh-min-nan.wikipedia.org/wiki/$1',1), |
| 288 | +('zh-tw','http://zh.wikipedia.org/wiki/$1',1), |
| 289 | +('zh-yue','http://zh-yue.wikipedia.org/wiki/$1',1), |
| 290 | +('zu','http://zu.wikipedia.org/wiki/$1',1); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/wikipedia-interwiki.sql |
___________________________________________________________________ |
Added: svn:keywords |
1 | 291 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 292 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/listDatabases.php |
— | — | @@ -0,0 +1,5 @@ |
| 2 | +<? include("commandLine.inc"); |
| 3 | + |
| 4 | +foreach ($wgLocalDatabases as $db) { |
| 5 | +print "$db\n"; |
| 6 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/listDatabases.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 7 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/ourUsers.php |
— | — | @@ -0,0 +1,70 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Wikimedia specific |
| 5 | + * |
| 6 | + * This script generates SQL used to update MySQL users on a hardcoded |
| 7 | + * list of hosts. It takes care of setting the wikiuser for every |
| 8 | + * database as well as setting up wikiadmin. |
| 9 | + * |
| 10 | + * This program is free software; you can redistribute it and/or modify |
| 11 | + * it under the terms of the GNU General Public License as published by |
| 12 | + * the Free Software Foundation; either version 2 of the License, or |
| 13 | + * (at your option) any later version. |
| 14 | + * |
| 15 | + * This program is distributed in the hope that it will be useful, |
| 16 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | + * GNU General Public License for more details. |
| 19 | + * |
| 20 | + * You should have received a copy of the GNU General Public License along |
| 21 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 22 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 23 | + * http://www.gnu.org/copyleft/gpl.html |
| 24 | + * |
| 25 | + * @todo document |
| 26 | + * @file |
| 27 | + * @ingroup Maintenance |
| 28 | + * @ingroup Wikimedia |
| 29 | + */ |
| 30 | + |
| 31 | +/** */ |
| 32 | +$wikiuser_pass = `wikiuser_pass`; |
| 33 | +$wikiadmin_pass = `wikiadmin_pass`; |
| 34 | +$nagios_pass = `nagios_sql_pass`; |
| 35 | + |
| 36 | +$hosts = array( |
| 37 | + 'localhost', |
| 38 | + '10.0.%', |
| 39 | + '66.230.200.%', |
| 40 | + '208.80.152.%', |
| 41 | +); |
| 42 | + |
| 43 | +$databases = array( |
| 44 | + '%wik%', |
| 45 | + 'centralauth', |
| 46 | +); |
| 47 | + |
| 48 | +print "/*!40100 set old_passwords=1 */;\n"; |
| 49 | +print "/*!40100 set global old_passwords=1 */;\n"; |
| 50 | + |
| 51 | +foreach ( $hosts as $host ) { |
| 52 | + print "--\n-- $host\n--\n"; |
| 53 | + print "\n-- wikiuser\n\n"; |
| 54 | + print "GRANT REPLICATION CLIENT,PROCESS ON *.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n"; |
| 55 | + print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n"; |
| 56 | + foreach ( $databases as $db ) { |
| 57 | + print "GRANT SELECT, INSERT, UPDATE, DELETE ON `$db`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n"; |
| 58 | + } |
| 59 | + |
| 60 | + print "\n-- wikiadmin\n\n"; |
| 61 | + print "GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'wikiadmin'@'$host' IDENTIFIED BY '$wikiadmin_pass';\n"; |
| 62 | + print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO wikiadmin@'$host' IDENTIFIED BY '$wikiadmin_pass';\n"; |
| 63 | + foreach ( $databases as $db ) { |
| 64 | + print "GRANT ALL PRIVILEGES ON `$db`.* TO wikiadmin@'$host' IDENTIFIED BY '$wikiadmin_pass';\n"; |
| 65 | + } |
| 66 | + print "\n-- nagios\n\n"; |
| 67 | + print "GRANT REPLICATION CLIENT ON *.* TO 'nagios'@'$host' IDENTIFIED BY '$nagios_pass';\n"; |
| 68 | + |
| 69 | + print "\n"; |
| 70 | +} |
| 71 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/ourUsers.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 72 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 73 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixJobQueueExplosion.php |
— | — | @@ -0,0 +1,68 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +/** |
| 5 | + * Removes htmlCacheUpdate categorylinks jobs caused by the bug fixed in r59718. |
| 6 | + */ |
| 7 | + |
| 8 | +require_once( dirname(__FILE__).'/Maintenance.php' ); |
| 9 | + |
| 10 | +class FixJobQueueExplosion extends Maintenance { |
| 11 | + public function execute() { |
| 12 | + global $IP; |
| 13 | + |
| 14 | + $dbw = wfGetDB( DB_MASTER ); |
| 15 | + if ( $dbw->tableExists( 'job_explosion_tmp' ) ) { |
| 16 | + echo "Temporary table already exists!\n" . |
| 17 | + "To restart, drop the job table and rename job_explosion_tmp back to job.\n"; |
| 18 | + exit( 1 ); |
| 19 | + } |
| 20 | + $batchSize = 1000; |
| 21 | + |
| 22 | + $jobTable = $dbw->tableName( 'job' ); |
| 23 | + $jobTmpTable = $dbw->tableName( 'job_explosion_tmp' ); |
| 24 | + $dbw->query( "RENAME TABLE $jobTable TO $jobTmpTable" ); |
| 25 | + $dbw->sourceFile( "$IP/maintenance/archives/patch-job.sql" ); |
| 26 | + |
| 27 | + $start = 0; |
| 28 | + $numBatchesDone = 0; |
| 29 | + $newId = 1; |
| 30 | + while ( true ) { |
| 31 | + $res = $dbw->select( 'job_explosion_tmp', '*', |
| 32 | + array( |
| 33 | + 'job_id > ' . $dbw->addQuotes( $start ), |
| 34 | + "NOT ( job_cmd = 'htmlCacheUpdate' AND " . |
| 35 | + "job_params LIKE '%s:13:\"categorylinks\"%' )" |
| 36 | + ), |
| 37 | + __METHOD__, array( 'LIMIT' => $batchSize ) ); |
| 38 | + |
| 39 | + if ( !$res->numRows() ) { |
| 40 | + break; |
| 41 | + } |
| 42 | + |
| 43 | + $insertBatch = array(); |
| 44 | + foreach ( $res as $row ) { |
| 45 | + $start = $row->job_id; |
| 46 | + $insertRow = array(); |
| 47 | + foreach ( (array)$row as $name => $value ) { |
| 48 | + $insertRow[$name] = $value; |
| 49 | + } |
| 50 | + unset( $insertRow['job_id'] ); // use autoincrement to avoid key conflicts |
| 51 | + $insertBatch[] = $insertRow; |
| 52 | + } |
| 53 | + $dbw->insert( 'job', $insertBatch, __METHOD__ ); |
| 54 | + $numBatchesDone++; |
| 55 | + |
| 56 | + wfWaitForSlaves( 2 ); |
| 57 | + if ( $numBatchesDone % 1000 == 0 ) { |
| 58 | + echo "$start\n"; |
| 59 | + } elseif ( $numBatchesDone % 10 == 0 ) { |
| 60 | + echo "$start\r"; |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + #$dbw->query( "DROP TABLE $jobTmpTable" ); |
| 65 | + } |
| 66 | +} |
| 67 | + |
| 68 | +$maintClass = 'FixJobQueueExplosion'; |
| 69 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixJobQueueExplosion.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 70 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/checkTranscacheEmpty.php |
— | — | @@ -0,0 +1,18 @@ |
| 2 | +<?php |
| 3 | +require_once( dirname(__FILE__).'/../commandLine.inc' ); |
| 4 | + |
| 5 | +$bad = 0; |
| 6 | +$good = 0; |
| 7 | +foreach ( $wgLocalDatabases as $wiki ) { |
| 8 | + $lb = wfGetLB( $wiki ); |
| 9 | + $db = $lb->getConnection( DB_SLAVE, array(), $wiki ); |
| 10 | + $notEmpty = $db->selectField( 'transcache', '1', false, 'checkTranscacheEmpty.php' ); |
| 11 | + if ( $notEmpty ) { |
| 12 | + echo "$wiki\n"; |
| 13 | + $bad++; |
| 14 | + } else { |
| 15 | + $good++; |
| 16 | + } |
| 17 | +} |
| 18 | +echo "bad = $bad, good = $good\n"; |
| 19 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/checkTranscacheEmpty.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 20 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/dumpInterwiki.php |
— | — | @@ -0,0 +1,286 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Build constant slightly compact database of interwiki prefixes |
| 5 | + * Wikimedia specific! |
| 6 | + * |
| 7 | + * This program is free software; you can redistribute it and/or modify |
| 8 | + * it under the terms of the GNU General Public License as published by |
| 9 | + * the Free Software Foundation; either version 2 of the License, or |
| 10 | + * (at your option) any later version. |
| 11 | + * |
| 12 | + * This program is distributed in the hope that it will be useful, |
| 13 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | + * GNU General Public License for more details. |
| 16 | + * |
| 17 | + * You should have received a copy of the GNU General Public License along |
| 18 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 20 | + * http://www.gnu.org/copyleft/gpl.html |
| 21 | + * |
| 22 | + * @file |
| 23 | + * @todo document |
| 24 | + * @ingroup Maintenance |
| 25 | + * @ingroup Wikimedia |
| 26 | + */ |
| 27 | +require_once( dirname( __FILE__ ) . '/WikimediaMaintenance.php' ); |
| 28 | + |
| 29 | +class DumpInterwiki extends WikimediaMaintenance { |
| 30 | + |
| 31 | + /** |
| 32 | + * @var array |
| 33 | + */ |
| 34 | + protected $langlist, $dblist, $specials, $languageAliases, $prefixRewrites, $prefixLists; |
| 35 | + |
| 36 | + /** |
| 37 | + * @var CdbWriter |
| 38 | + */ |
| 39 | + protected $dbFile; |
| 40 | + protected $urlprotocol; |
| 41 | + |
| 42 | + public function __construct() { |
| 43 | + parent::__construct(); |
| 44 | + $this->mDescription = "Build constant slightly compact database of interwiki prefixes."; |
| 45 | + $this->addOption( 'langlist', 'File with one language code per line', false, true ); |
| 46 | + $this->addOption( 'dblist', 'File with one db per line', false, true ); |
| 47 | + $this->addOption( 'specialdbs', "File with one 'special' db per line", false, true ); |
| 48 | + $this->addOption( 'o', 'Cdb output file', false, true ); |
| 49 | + $this->addOption( 'protocolrelative', 'Output wikimedia interwiki urls as protocol relative', false, false ); |
| 50 | + } |
| 51 | + |
| 52 | + function execute() { |
| 53 | + # List of language prefixes likely to be found in multi-language sites |
| 54 | + $this->langlist = array_map( "trim", file( $this->getOption( 'langlist', "/home/wikipedia/common/langlist" ) ) ); |
| 55 | + |
| 56 | + # List of all database names |
| 57 | + $this->dblist = array_map( "trim", file( $this->getOption( 'dblist', "/home/wikipedia/common/all.dblist" ) ) ); |
| 58 | + |
| 59 | + # Special-case databases |
| 60 | + $this->specials = array_flip( array_map( "trim", file( $this->getOption( 'specialdbs', "/home/wikipedia/common/special.dblist" ) ) ) ); |
| 61 | + |
| 62 | + if ( $this->hasOption( 'o' ) ) { |
| 63 | + $this->dbFile = CdbWriter::open( $this->getOption( 'o' ) ) ; |
| 64 | + } else { |
| 65 | + $this->dbFile = false; |
| 66 | + } |
| 67 | + |
| 68 | + if ( $this->hasOption( 'protocolrelative' ) ) { |
| 69 | + $this->urlprotocol = ''; |
| 70 | + } else { |
| 71 | + $this->urlprotocol = 'http:'; |
| 72 | + } |
| 73 | + |
| 74 | + $this->getRebuildInterwikiDump(); |
| 75 | + } |
| 76 | + |
| 77 | + function getRebuildInterwikiDump() { |
| 78 | + global $wgContLang; |
| 79 | + |
| 80 | + # Multi-language sites |
| 81 | + # db suffix => db suffix, iw prefix, hostname |
| 82 | + $sites = array( |
| 83 | + 'wiki' => new WMFSite( 'wiki', 'w', 'wikipedia.org' ), |
| 84 | + 'wiktionary' => new WMFSite( 'wiktionary', 'wikt', 'wiktionary.org' ), |
| 85 | + 'wikiquote' => new WMFSite( 'wikiquote', 'q', 'wikiquote.org' ), |
| 86 | + 'wikibooks' => new WMFSite( 'wikibooks', 'b', 'wikibooks.org' ), |
| 87 | + 'wikinews' => new WMFSite( 'wikinews', 'n', 'wikinews.org' ), |
| 88 | + 'wikisource' => new WMFSite( 'wikisource', 's', 'wikisource.org' ), |
| 89 | + 'wikimedia' => new WMFSite( 'wikimedia', 'chapter', 'wikimedia.org' ), |
| 90 | + 'wikiversity' => new WMFSite( 'wikiversity', 'v', 'wikiversity.org' ), |
| 91 | + ); |
| 92 | + |
| 93 | + # Site overrides for wikis whose DB names end in 'wiki' but that really belong to another site |
| 94 | + $siteOverrides = array( |
| 95 | + 'sourceswiki' => array( 'wikisource', 'en' ), |
| 96 | + ); |
| 97 | + |
| 98 | + # Extra interwiki links that can't be in the intermap for some reason |
| 99 | + $extraLinks = array( |
| 100 | + array( 'm', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ), |
| 101 | + array( 'meta', $this->urlprotocol . '//meta.wikimedia.org/wiki/$1', 1 ), |
| 102 | + array( 'sep11', $this->urlprotocol . '//sep11.wikipedia.org/wiki/$1', 1 ), |
| 103 | + ); |
| 104 | + |
| 105 | + # Language aliases, usually configured as redirects to the real wiki in apache |
| 106 | + # Interlanguage links are made directly to the real wiki |
| 107 | + # Something horrible happens if you forget to list an alias here, I can't |
| 108 | + # remember what |
| 109 | + $this->languageAliases = array( |
| 110 | + 'zh-cn' => 'zh', |
| 111 | + 'zh-tw' => 'zh', |
| 112 | + 'dk' => 'da', |
| 113 | + 'nb' => 'no', |
| 114 | + ); |
| 115 | + |
| 116 | + # Special case prefix rewrites, for the benefit of Swedish which uses s:t |
| 117 | + # as an abbreviation for saint |
| 118 | + $this->prefixRewrites = array( |
| 119 | + 'svwiki' => array( 's' => 'src' ), |
| 120 | + ); |
| 121 | + |
| 122 | + # Construct a list of reserved prefixes |
| 123 | + $reserved = array(); |
| 124 | + foreach ( $this->langlist as $lang ) { |
| 125 | + $reserved[$lang] = 1; |
| 126 | + } |
| 127 | + foreach ( $this->languageAliases as $alias => $lang ) { |
| 128 | + $reserved[$alias] = 1; |
| 129 | + } |
| 130 | + foreach ( $sites as $site ) { |
| 131 | + $reserved[$site->lateral] = 1; |
| 132 | + } |
| 133 | + |
| 134 | + # Extract the intermap from meta |
| 135 | + $intermap = Http::get( 'http://meta.wikimedia.org/w/index.php?title=Interwiki_map&action=raw', 30 ); |
| 136 | + $lines = array_map( 'trim', explode( "\n", trim( $intermap ) ) ); |
| 137 | + |
| 138 | + if ( !$lines || count( $lines ) < 2 ) { |
| 139 | + $this->error( "m:Interwiki_map not found", true ); |
| 140 | + } |
| 141 | + |
| 142 | + # Global interwiki map |
| 143 | + foreach ( $lines as $line ) { |
| 144 | + if ( preg_match( '/^\|\s*(.*?)\s*\|\|\s*(.*?)\s*$/', $line, $matches ) ) { |
| 145 | + $prefix = $wgContLang->lc( $matches[1] ); |
| 146 | + $prefix = str_replace( ' ', '_', $prefix ); |
| 147 | + |
| 148 | + $url = $matches[2]; |
| 149 | + if ( preg_match( '/(wikipedia|wiktionary|wikisource|wikiquote|wikibooks|wikimedia|wikinews|wikiversity|wikimediafoundation|mediawiki)\.org/', $url ) ) { |
| 150 | + $local = 1; |
| 151 | + } else { |
| 152 | + $local = 0; |
| 153 | + } |
| 154 | + |
| 155 | + if ( empty( $reserved[$prefix] ) ) { |
| 156 | + $imap = array( "iw_prefix" => $prefix, "iw_url" => $url, "iw_local" => $local ); |
| 157 | + $this->makeLink ( $imap, "__global" ); |
| 158 | + } |
| 159 | + } |
| 160 | + } |
| 161 | + |
| 162 | + # Exclude Wikipedia for Wikipedia |
| 163 | + $this->makeLink ( array ( 'iw_prefix' => 'wikipedia', 'is_url' => null ), "_wiki" ); |
| 164 | + |
| 165 | + # Multilanguage sites |
| 166 | + foreach ( $sites as $site ) { |
| 167 | + $this->makeLanguageLinks ( $site, "_" . $site->suffix ); |
| 168 | + } |
| 169 | + |
| 170 | + foreach ( $this->dblist as $db ) { |
| 171 | + if ( isset( $this->specials[$db] ) ) { |
| 172 | + # Special wiki |
| 173 | + # Has interwiki links and interlanguage links to wikipedia |
| 174 | + |
| 175 | + $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => "wiki" ), "__sites" ); |
| 176 | + # Links to multilanguage sites |
| 177 | + foreach ( $sites as $targetSite ) { |
| 178 | + $this->makeLink( array( 'iw_prefix' => $targetSite->lateral, |
| 179 | + 'iw_url' => $targetSite->getURL( 'en', $this->urlprotocol ), |
| 180 | + 'iw_local' => 1 ), $db ); |
| 181 | + } |
| 182 | + } else { |
| 183 | + # Find out which site this DB belongs to |
| 184 | + $site = false; |
| 185 | + if ( isset( $siteOverrides[$db] ) ) { |
| 186 | + list( $site, $lang ) = $siteOverrides[$db]; |
| 187 | + $site = $sites[$site]; |
| 188 | + } else { |
| 189 | + foreach ( $sites as $candidateSite ) { |
| 190 | + $suffix = $candidateSite->suffix; |
| 191 | + if ( preg_match( "/(.*)$suffix$/", $db, $matches ) ) { |
| 192 | + $site = $candidateSite; |
| 193 | + break; |
| 194 | + } |
| 195 | + } |
| 196 | + $lang = $matches[1]; |
| 197 | + } |
| 198 | + |
| 199 | + $this->makeLink( array( 'iw_prefix' => $db, 'iw_url' => $site->suffix ), "__sites" ); |
| 200 | + if ( !$site ) { |
| 201 | + $this->error( "Invalid database $db\n" ); |
| 202 | + continue; |
| 203 | + } |
| 204 | + |
| 205 | + # Lateral links |
| 206 | + foreach ( $sites as $targetSite ) { |
| 207 | + if ( $targetSite->suffix != $site->suffix ) { |
| 208 | + $this->makeLink( array( 'iw_prefix' => $targetSite->lateral, |
| 209 | + 'iw_url' => $targetSite->getURL( $lang, $this->urlprotocol ), |
| 210 | + 'iw_local' => 1 ), $db ); |
| 211 | + } |
| 212 | + } |
| 213 | + |
| 214 | + if ( $site->suffix == "wiki" ) { |
| 215 | + $this->makeLink( array( 'iw_prefix' => 'w', |
| 216 | + 'iw_url' => $this->urlprotocol . "//en.wikipedia.org/wiki/$1", |
| 217 | + 'iw_local' => 1 ), $db ); |
| 218 | + } |
| 219 | + |
| 220 | + } |
| 221 | + } |
| 222 | + foreach ( $extraLinks as $link ) { |
| 223 | + $this->makeLink( $link, "__global" ); |
| 224 | + } |
| 225 | + |
| 226 | + # List prefixes for each source |
| 227 | + foreach ( $this->prefixLists as $source => $hash ) { |
| 228 | + $list = array_keys( $hash ); |
| 229 | + sort( $list ); |
| 230 | + if ( $this->dbFile ) { |
| 231 | + $this->dbFile->set( "__list:{$source}", implode( ' ', $list ) ); |
| 232 | + } else { |
| 233 | + print "__list:{$source} " . implode( ' ', $list ) . "\n"; |
| 234 | + } |
| 235 | + } |
| 236 | + } |
| 237 | + |
| 238 | + # ------------------------------------------------------------------------------------------ |
| 239 | + |
| 240 | + /** |
| 241 | + * Executes part of an INSERT statement, corresponding to all interlanguage links to a particular site |
| 242 | + * |
| 243 | + * @param $site |
| 244 | + * @param $source |
| 245 | + */ |
| 246 | + function makeLanguageLinks( &$site, $source ) { |
| 247 | + # Actual languages with their own databases |
| 248 | + foreach ( $this->langlist as $targetLang ) { |
| 249 | + $this->makeLink( array( $targetLang, $site->getURL( $targetLang, $this->urlprotocol ), 1 ), $source ); |
| 250 | + } |
| 251 | + |
| 252 | + # Language aliases |
| 253 | + foreach ( $this->languageAliases as $alias => $lang ) { |
| 254 | + $this->makeLink( array( $alias, $site->getURL( $lang, $this->urlprotocol ), 1 ), $source ); |
| 255 | + } |
| 256 | + } |
| 257 | + |
| 258 | + /** |
| 259 | + * @param $entry |
| 260 | + * @param $source |
| 261 | + */ |
| 262 | + function makeLink( $entry, $source ) { |
| 263 | + if ( isset( $this->prefixRewrites[$source] ) && isset( $entry[0] ) && isset( $this->prefixRewrites[$source][$entry[0]] ) ) { |
| 264 | + $entry[0] = $this->prefixRewrites[$source][$entry[0]]; |
| 265 | + } |
| 266 | + |
| 267 | + if ( !array_key_exists( "iw_prefix", $entry ) ) { |
| 268 | + $entry = array( "iw_prefix" => $entry[0], "iw_url" => $entry[1], "iw_local" => $entry[2] ); |
| 269 | + } |
| 270 | + if ( array_key_exists( $source, $this->prefixRewrites ) && |
| 271 | + array_key_exists( $entry['iw_prefix'], $this->prefixRewrites[$source] ) ) { |
| 272 | + $entry['iw_prefix'] = $this->prefixRewrites[$source][$entry['iw_prefix']]; |
| 273 | + } |
| 274 | + |
| 275 | + if ( $this->dbFile ) { |
| 276 | + $this->dbFile->set( "{$source}:{$entry['iw_prefix']}", trim( "{$entry['iw_local']} {$entry['iw_url']}" ) ); |
| 277 | + } else { |
| 278 | + $this->output( "{$source}:{$entry['iw_prefix']} {$entry['iw_url']} {$entry['iw_local']}\n" ); |
| 279 | + } |
| 280 | + # Add to list of prefixes |
| 281 | + $this->prefixLists[$source][$entry['iw_prefix']] = 1; |
| 282 | + } |
| 283 | +} |
| 284 | + |
| 285 | +$maintClass = "DumpInterwiki"; |
| 286 | +require_once( RUN_MAINTENANCE_IF_MAIN ); |
| 287 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/dumpInterwiki.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 288 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 289 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupTitles64966.php |
— | — | @@ -0,0 +1,154 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Script to clean up broken, unparseable titles. |
| 5 | + * |
| 6 | + * Usage: php cleanupTitles.php [--fix] |
| 7 | + * Options: |
| 8 | + * --fix Actually clean up titles; otherwise just checks for them |
| 9 | + * |
| 10 | + * Copyright (C) 2005 Brion Vibber <brion@pobox.com> |
| 11 | + * http://www.mediawiki.org/ |
| 12 | + * |
| 13 | + * This program is free software; you can redistribute it and/or modify |
| 14 | + * it under the terms of the GNU General Public License as published by |
| 15 | + * the Free Software Foundation; either version 2 of the License, or |
| 16 | + * (at your option) any later version. |
| 17 | + * |
| 18 | + * This program is distributed in the hope that it will be useful, |
| 19 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 20 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 21 | + * GNU General Public License for more details. |
| 22 | + * |
| 23 | + * You should have received a copy of the GNU General Public License along |
| 24 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 25 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 26 | + * http://www.gnu.org/copyleft/gpl.html |
| 27 | + * |
| 28 | + * @author Brion Vibber <brion at pobox.com> |
| 29 | + * @ingroup Maintenance |
| 30 | + */ |
| 31 | + |
| 32 | +require_once( dirname(__FILE__) . '/cleanupTable.inc' ); |
| 33 | + |
| 34 | +class TitleCleanup extends TableCleanup { |
| 35 | + public function __construct() { |
| 36 | + parent::__construct(); |
| 37 | + $this->mDescription = "Script to clean up broken, unparseable titles"; |
| 38 | + } |
| 39 | + |
| 40 | + protected function processRow( $row ) { |
| 41 | + global $wgContLang; |
| 42 | + $display = Title::makeName( $row->page_namespace, $row->page_title ); |
| 43 | + $verified = $wgContLang->normalize( $display ); |
| 44 | + $title = Title::newFromText( $verified ); |
| 45 | + |
| 46 | + if( !is_null( $title ) |
| 47 | + && $title->canExist() |
| 48 | + && $title->getNamespace() == $row->page_namespace |
| 49 | + && $title->getDBkey() === $row->page_title ) |
| 50 | + { |
| 51 | + return $this->progress( 0 ); // all is fine |
| 52 | + } |
| 53 | + |
| 54 | + if( $row->page_namespace == NS_FILE && $this->fileExists( $row->page_title ) ) { |
| 55 | + $this->output( "file $row->page_title needs cleanup, please run cleanupImages.php.\n" ); |
| 56 | + return $this->progress( 0 ); |
| 57 | + } elseif( is_null( $title ) ) { |
| 58 | + $this->output( "page $row->page_id ($display) is illegal.\n" ); |
| 59 | + $this->moveIllegalPage( $row ); |
| 60 | + return $this->progress( 1 ); |
| 61 | + } else { |
| 62 | + $this->output( "page $row->page_id ($display) doesn't match self.\n" ); |
| 63 | + $this->moveInconsistentPage( $row, $title ); |
| 64 | + return $this->progress( 1 ); |
| 65 | + } |
| 66 | + } |
| 67 | + |
| 68 | + protected function fileExists( $name ) { |
| 69 | + // XXX: Doesn't actually check for file existence, just presence of image record. |
| 70 | + // This is reasonable, since cleanupImages.php only iterates over the image table. |
| 71 | + $dbr = wfGetDB( DB_SLAVE ); |
| 72 | + $row = $dbr->selectRow( 'image', array( 'img_name' ), array( 'img_name' => $name ), __METHOD__ ); |
| 73 | + return $row !== false; |
| 74 | + } |
| 75 | + |
| 76 | + protected function moveIllegalPage( $row ) { |
| 77 | + $legal = 'A-Za-z0-9_/\\\\-'; |
| 78 | + $legalized = preg_replace_callback( "!([^$legal])!", |
| 79 | + array( &$this, 'hexChar' ), |
| 80 | + $row->page_title ); |
| 81 | + if( $legalized == '.' ) $legalized = '(dot)'; |
| 82 | + if( $legalized == '_' ) $legalized = '(space)'; |
| 83 | + $legalized = 'Broken/' . $legalized; |
| 84 | + |
| 85 | + $title = Title::newFromText( $legalized ); |
| 86 | + if( is_null( $title ) ) { |
| 87 | + $clean = 'Broken/id:' . $row->page_id; |
| 88 | + $this->output( "Couldn't legalize; form '$legalized' still invalid; using '$clean'\n" ); |
| 89 | + $title = Title::newFromText( $clean ); |
| 90 | + } elseif( $title->exists() ) { |
| 91 | + $clean = 'Broken/id:' . $row->page_id; |
| 92 | + $this->output( "Legalized for '$legalized' exists; using '$clean'\n" ); |
| 93 | + $title = Title::newFromText( $clean ); |
| 94 | + } |
| 95 | + |
| 96 | + $dest = $title->getDBkey(); |
| 97 | + if( $this->dryrun ) { |
| 98 | + $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" ); |
| 99 | + } else { |
| 100 | + $this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($row->page_namespace,'$dest')\n" ); |
| 101 | + $dbw = wfGetDB( DB_MASTER ); |
| 102 | + $dbw->update( 'page', |
| 103 | + array( 'page_title' => $dest ), |
| 104 | + array( 'page_id' => $row->page_id ), |
| 105 | + __METHOD__ ); |
| 106 | + } |
| 107 | + } |
| 108 | + |
| 109 | + protected function moveInconsistentPage( $row, $title ) { |
| 110 | + if( $title->exists() || $title->getInterwiki() || !$title->canExist() ) { |
| 111 | + if( $title->getInterwiki() || !$title->canExist() ) { |
| 112 | + $prior = $title->getPrefixedDbKey(); |
| 113 | + } else { |
| 114 | + $prior = $title->getDBkey(); |
| 115 | + } |
| 116 | + |
| 117 | + # Old cleanupTitles could move articles there. See bug 23147. |
| 118 | + $ns = $row->page_namespace; |
| 119 | + if ( $ns < 0) $ns = 0; |
| 120 | + |
| 121 | + $clean = 'Broken/' . $prior; |
| 122 | + $verified = Title::makeTitleSafe( $ns, $clean ); |
| 123 | + if( $verified->exists() ) { |
| 124 | + $blah = "Broken/id:" . $row->page_id; |
| 125 | + $this->output( "Couldn't legalize; form '$clean' exists; using '$blah'\n" ); |
| 126 | + $verified = Title::makeTitleSafe( $ns, $blah ); |
| 127 | + } |
| 128 | + $title = $verified; |
| 129 | + } |
| 130 | + if( is_null( $title ) ) { |
| 131 | + $this->error( "Something awry; empty title.", true ); |
| 132 | + } |
| 133 | + $ns = $title->getNamespace(); |
| 134 | + $dest = $title->getDBkey(); |
| 135 | + |
| 136 | + if( $this->dryrun ) { |
| 137 | + $this->output( "DRY RUN: would rename $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" ); |
| 138 | + } else { |
| 139 | + $this->output( "renaming $row->page_id ($row->page_namespace,'$row->page_title') to ($ns,'$dest')\n" ); |
| 140 | + $dbw = wfGetDB( DB_MASTER ); |
| 141 | + $dbw->update( 'page', |
| 142 | + array( |
| 143 | + 'page_namespace' => $ns, |
| 144 | + 'page_title' => $dest |
| 145 | + ), |
| 146 | + array( 'page_id' => $row->page_id ), |
| 147 | + __METHOD__ ); |
| 148 | + $linkCache = LinkCache::singleton(); |
| 149 | + $linkCache->clear(); |
| 150 | + } |
| 151 | + } |
| 152 | +} |
| 153 | + |
| 154 | +$maintClass = "TitleCleanup"; |
| 155 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupTitles64966.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 156 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupBug31576.php |
— | — | @@ -0,0 +1,64 @@ |
| 2 | +<?php |
| 3 | +$IP = getenv( 'MW_INSTALL_PATH' ); |
| 4 | +if ( $IP === false ) { |
| 5 | + $IP = dirname( __FILE__ ) . '/../..'; |
| 6 | +} |
| 7 | +require( "$IP/maintenance/Maintenance.php" ); |
| 8 | + |
| 9 | +class CleanupBug31576 extends Maintenance { |
| 10 | + public function __construct() { |
| 11 | + parent::__construct(); |
| 12 | + $this->mDescription = "Cleans up templatelinks corruption caused by https://bugzilla.wikimedia.org/show_bug.cgi?id=31576"; |
| 13 | + $this->addOption( 'batchsize', 'Number of rows to process in one batch. Default: 50', false, true ); |
| 14 | + } |
| 15 | + |
| 16 | + public function execute() { |
| 17 | + $this->batchsize = $this->getOption( 'batchsize', 50 ); |
| 18 | + $variableIDs = MagicWord::getVariableIDs(); |
| 19 | + foreach ( $variableIDs as $id ) { |
| 20 | + $magic = MagicWord::get( $id ); |
| 21 | + foreach ( $magic->getSynonyms() as $synonym ) { |
| 22 | + $this->processSynonym( $synonym ); |
| 23 | + } |
| 24 | + } |
| 25 | + $this->output( "All done\n" ); |
| 26 | + } |
| 27 | + |
| 28 | + public function processSynonym( $synonym ) { |
| 29 | + $dbr = wfGetDB( DB_SLAVE ); |
| 30 | + $pCount = 0; |
| 31 | + $vCount = 0; |
| 32 | + $this->output( "Fixing pages with template links to $synonym ...\n" ); |
| 33 | + while ( true ) { |
| 34 | + $res = $dbr->select( 'templatelinks', array( 'tl_title', 'tl_from' ), |
| 35 | + array( |
| 36 | + 'tl_namespace' => NS_TEMPLATE, |
| 37 | + 'tl_title ' . $dbr->buildLike( $synonym, $dbr->anyString() ) |
| 38 | + ), __METHOD__, |
| 39 | + array( 'ORDER BY' => array( 'tl_title', 'tl_from' ), 'LIMIT' => $this->batchsize ) |
| 40 | + ); |
| 41 | + if ( $dbr->numRows( $res ) == 0 ) { |
| 42 | + // No more rows, we're done |
| 43 | + break; |
| 44 | + } |
| 45 | + |
| 46 | + $processed = array(); |
| 47 | + foreach ( $res as $row ) { |
| 48 | + $vCount++; |
| 49 | + if ( isset( $processed[$row->tl_from] ) ) { |
| 50 | + // We've already processed this page, skip it |
| 51 | + continue; |
| 52 | + } |
| 53 | + RefreshLinks::fixLinksFromArticle( $row->tl_from ); |
| 54 | + $processed[$row->tl_from] = true; |
| 55 | + $pCount++; |
| 56 | + } |
| 57 | + $this->output( "{$pCount}/{$vCount} pages processed\n" ); |
| 58 | + wfWaitForSlaves(); |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | +} |
| 63 | + |
| 64 | +$maintClass = "CleanupBug31576"; |
| 65 | +require_once( RUN_MAINTENANCE_IF_MAIN ); |
\ No newline at end of file |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupBug31576.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 66 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/renameWiki.php |
— | — | @@ -0,0 +1,88 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Why yes, this *is* another special-purpose Wikimedia maintenance script! |
| 5 | + * Should be fixed up and generalized. |
| 6 | + * |
| 7 | + * This program is free software; you can redistribute it and/or modify |
| 8 | + * it under the terms of the GNU General Public License as published by |
| 9 | + * the Free Software Foundation; either version 2 of the License, or |
| 10 | + * (at your option) any later version. |
| 11 | + * |
| 12 | + * This program is distributed in the hope that it will be useful, |
| 13 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | + * GNU General Public License for more details. |
| 16 | + * |
| 17 | + * You should have received a copy of the GNU General Public License along |
| 18 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 20 | + * http://www.gnu.org/copyleft/gpl.html |
| 21 | + * |
| 22 | + * @file |
| 23 | + * @ingroup Maintenance |
| 24 | + * @ingroup Wikimedia |
| 25 | + */ |
| 26 | +require_once( dirname( __FILE__ ) . '/WikimediaMaintenance.php' ); |
| 27 | + |
| 28 | +class RenameWiki extends WikimediaMaintenance { |
| 29 | + public function __construct() { |
| 30 | + parent::__construct(); |
| 31 | + $this->mDescription = "Rename external storage dbs and leave a new one"; |
| 32 | + $this->addArg( 'olddb', 'Old DB name' ); |
| 33 | + $this->addArg( 'newdb', 'New DB name' ); |
| 34 | + } |
| 35 | + |
| 36 | + public function getDbType() { |
| 37 | + return Maintenance::DB_ADMIN; |
| 38 | + } |
| 39 | + |
| 40 | + public function execute() { |
| 41 | + global $wgDefaultExternalStore; |
| 42 | + |
| 43 | + # Setup |
| 44 | + $from = $this->getArg( 0 ); |
| 45 | + $to = $this->getArg( 1 ); |
| 46 | + $this->output( "Renaming blob tables in ES from $from to $to...\n" ); |
| 47 | + $this->output( "Sleeping 5 seconds...\n" ); |
| 48 | + sleep( 5 ); |
| 49 | + |
| 50 | + # Initialise external storage |
| 51 | + if ( is_array( $wgDefaultExternalStore ) ) { |
| 52 | + $stores = $wgDefaultExternalStore; |
| 53 | + } elseif ( $wgDefaultExternalStore ) { |
| 54 | + $stores = array( $wgDefaultExternalStore ); |
| 55 | + } else { |
| 56 | + $stores = array(); |
| 57 | + } |
| 58 | + |
| 59 | + if ( count( $stores ) ) { |
| 60 | + $this->output( "Initialising external storage...\n" ); |
| 61 | + global $wgDBuser, $wgDBpassword, $wgExternalServers; |
| 62 | + foreach ( $stores as $storeURL ) { |
| 63 | + $m = array(); |
| 64 | + if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) { |
| 65 | + continue; |
| 66 | + } |
| 67 | + |
| 68 | + $cluster = $m[1]; |
| 69 | + |
| 70 | + # Hack |
| 71 | + $wgExternalServers[$cluster][0]['user'] = $wgDBuser; |
| 72 | + $wgExternalServers[$cluster][0]['password'] = $wgDBpassword; |
| 73 | + |
| 74 | + $store = new ExternalStoreDB; |
| 75 | + $extdb =& $store->getMaster( $cluster ); |
| 76 | + $extdb->query( "SET table_type=InnoDB" ); |
| 77 | + $extdb->query( "CREATE DATABASE {$to}" ); |
| 78 | + $extdb->query( "ALTER TABLE {$from}.blobs RENAME TO {$to}.blobs" ); |
| 79 | + $extdb->selectDB( $from ); |
| 80 | + $extdb->sourceFile( $this->getDir() . '/storage/blobs.sql' ); |
| 81 | + $extdb->commit(); |
| 82 | + } |
| 83 | + } |
| 84 | + $this->output( "done.\n" ); |
| 85 | + } |
| 86 | +} |
| 87 | + |
| 88 | +$maintClass = "RenameWiki"; |
| 89 | +require_once( RUN_MAINTENANCE_IF_MAIN ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/renameWiki.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 90 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/nukeEntries.php |
— | — | @@ -0,0 +1,18 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +include('commandLine.inc'); |
| 5 | + |
| 6 | +$i=1000; |
| 7 | + |
| 8 | +$start = microtime(true); |
| 9 | +wfMsg("pagetitle"); |
| 10 | +$time = microtime(true) - $start; |
| 11 | +print "Init time: $time\n"; |
| 12 | + |
| 13 | +$start=microtime(true); |
| 14 | +while ($i--) { |
| 15 | + wfMsg("pagetitle"); |
| 16 | +} |
| 17 | + |
| 18 | +$time = microtime(true) - $start; |
| 19 | +print "Time: $time\n"; |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/nukeEntries.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 20 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixCleanupTitles/reversion-input |
— | — | @@ -0,0 +1,558 @@ |
| 2 | +eswiktionary: renaming 11242 (1,'Wikcionario:Estilo/ábaco-05') to (1,'Broken/Wikcionario\x3aEstilo/\xc3\xa1baco-05') |
| 3 | +eswiktionary: renaming 11243 (1,'Wikcionario:Estilo/ábaco-01') to (1,'Broken/Wikcionario\x3aEstilo/\xc3\xa1baco-01') |
| 4 | +eswiktionary: renaming 13591 (1,'Apéndice:Estados_de_los_Estados_Unidos_de_América') to (1,'Broken/Ap\xc3\xa9ndice\x3aEstados_de_los_Estados_Unidos_de_Am\xc3\xa9rica') |
| 5 | +etwiki: renaming 15381 (1,'Wikipedia:Vikiprojekt_Imetajad') to (1,'Broken/Wikipedia\x3aVikiprojekt_Imetajad') |
| 6 | +etwiki: renaming 77035 (1,'Portaal:Teadus') to (1,'Broken/Portaal\x3aTeadus') |
| 7 | +etwiki: renaming 94865 (1,'Portaal:Kaunid_kunstid/Sissejuhatus') to (1,'Broken/Portaal\x3aKaunid_kunstid/Sissejuhatus') |
| 8 | +etwiki: renaming 95802 (1,'Portaal:Kaunid_kunstid') to (1,'Broken/Portaal\x3aKaunid_kunstid') |
| 9 | +etwiki: renaming 95807 (1,'Portaal:Kaunid_kunstid/Valdkonnad') to (1,'Broken/Portaal\x3aKaunid_kunstid/Valdkonnad') |
| 10 | +etwiki: renaming 96057 (1,'Portaal:Poliitika') to (1,'Broken/Portaal\x3aPoliitika') |
| 11 | +etwiki: renaming 131830 (1,'Portaal:Portaalikasti-jalus') to (1,'Broken/Portaal\x3aPortaalikasti-jalus') |
| 12 | +etwiki: renaming 131867 (1,'Portaal:Muusika/Sündinud') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud') |
| 13 | +etwiki: renaming 131868 (1,'Portaal:Muusika/Sündinud/18._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/18\x2e_juuni') |
| 14 | +etwiki: renaming 131869 (1,'Portaal:Muusika/Aastad_muusikas') to (1,'Broken/Portaal\x3aMuusika/Aastad_muusikas') |
| 15 | +etwiki: renaming 131881 (1,'Portaal:Muusika/Sündinud/juuni_18') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/juuni_18') |
| 16 | +etwiki: renaming 132143 (1,'Portaal:Muusika/Sündinud/21._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/21\x2e_juuni') |
| 17 | +etwiki: renaming 132227 (1,'Portaal:Muusika/Sündinud/22._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/22\x2e_juuni') |
| 18 | +etwiki: renaming 132231 (1,'Portaal:Muusika/Sündinud/23._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/23\x2e_juuni') |
| 19 | +etwiki: renaming 132350 (1,'Portaal:Muusika/Sündinud/24._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/24\x2e_juuni') |
| 20 | +etwiki: renaming 132386 (1,'Portaal:Muusika/Sündinud/25._juuni') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/25\x2e_juuni') |
| 21 | +etwiki: renaming 132393 (1,'Portaal:Muusika/Sündinud/1._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/1\x2e_juuli') |
| 22 | +etwiki: renaming 132395 (1,'Portaal:Muusika/Sündinud/2._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/2\x2e_juuli') |
| 23 | +etwiki: renaming 132470 (1,'Portaal:Muusika/Sündinud/6._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/6\x2e_juuli') |
| 24 | +etwiki: renaming 132471 (1,'Portaal:Muusika/Sündinud/7._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/7\x2e_juuli') |
| 25 | +etwiki: renaming 132474 (1,'Portaal:Muusika/Sündinud/10._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/10\x2e_juuli') |
| 26 | +etwiki: renaming 133763 (1,'Portaal:Muusika/Sündinud/19._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/19\x2e_juuli') |
| 27 | +etwiki: renaming 133765 (1,'Portaal:Muusika/Sündinud/20._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/20\x2e_juuli') |
| 28 | +etwiki: renaming 133775 (1,'Portaal:Muusika/Sündinud/21._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/21\x2e_juuli') |
| 29 | +etwiki: renaming 133776 (1,'Portaal:Muusika/Sündinud/22._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/22\x2e_juuli') |
| 30 | +etwiki: renaming 133923 (1,'Portaal:Sport/Spordialad') to (1,'Broken/Portaal\x3aSport/Spordialad') |
| 31 | +etwiki: renaming 134854 (1,'Portaal:Kunst') to (1,'Broken/Portaal\x3aKunst') |
| 32 | +etwiki: renaming 134861 (1,'Portaal:Geograafia') to (1,'Broken/Portaal\x3aGeograafia') |
| 33 | +etwiki: renaming 134894 (1,'Portaal:Muusika/Sissejuhatus') to (1,'Broken/Portaal\x3aMuusika/Sissejuhatus') |
| 34 | +etwiki: renaming 134988 (1,'Portaal:Matemaatika') to (1,'Broken/Portaal\x3aMatemaatika') |
| 35 | +etwiki: renaming 135165 (1,'Portaal:Geograafia/Valitud_artikkel/Soovitus') to (1,'Broken/Portaal\x3aGeograafia/Valitud_artikkel/Soovitus') |
| 36 | +etwiki: renaming 135196 (1,'Portaal:Muusika/Sündinud/23._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/23\x2e_juuli') |
| 37 | +etwiki: renaming 135201 (1,'Portaal:Geograafia/Geograafia_loendid') to (1,'Broken/Portaal\x3aGeograafia/Geograafia_loendid') |
| 38 | +etwiki: renaming 135223 (1,'Portaal:Arhitektuur/Loendid') to (1,'Broken/Portaal\x3aArhitektuur/Loendid') |
| 39 | +etwiki: renaming 135270 (1,'Portaal:Muusika') to (1,'Broken/Portaal\x3aMuusika') |
| 40 | +etwiki: renaming 135307 (1,'Portaal:Muusika/Sündinud/24._juuli') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/24\x2e_juuli') |
| 41 | +etwiki: renaming 135319 (1,'Portaal:Kunst/valdkonnad') to (1,'Broken/Portaal\x3aKunst/valdkonnad') |
| 42 | +etwiki: renaming 135331 (1,'Portaal:Geograafia/Kas_tead') to (1,'Broken/Portaal\x3aGeograafia/Kas_tead') |
| 43 | +etwiki: renaming 135388 (1,'Portaal:Meri') to (1,'Broken/Portaal\x3aMeri') |
| 44 | +etwiki: renaming 135411 (1,'Portaal:Arhitektuur/Pilt') to (1,'Broken/Portaal\x3aArhitektuur/Pilt') |
| 45 | +etwiki: renaming 135447 (1,'Portaal:Kirjandus') to (1,'Broken/Portaal\x3aKirjandus') |
| 46 | +etwiki: renaming 135448 (1,'Portaal:Ajalugu') to (1,'Broken/Portaal\x3aAjalugu') |
| 47 | +etwiki: renaming 135895 (1,'Portaal:Kirjandus/Tegelased') to (1,'Broken/Portaal\x3aKirjandus/Tegelased') |
| 48 | +etwiki: renaming 136409 (1,'Portaal:Muusika/Soovitud_artiklid') to (1,'Broken/Portaal\x3aMuusika/Soovitud_artiklid') |
| 49 | +etwiki: renaming 136535 (1,'Portaal:Bioloogia') to (1,'Broken/Portaal\x3aBioloogia') |
| 50 | +etwiki: renaming 136577 (1,'Portaal:Bioloogia/Valitud_pilt') to (1,'Broken/Portaal\x3aBioloogia/Valitud_pilt') |
| 51 | +etwiki: renaming 136580 (1,'Portaal:Biograafiad/Valitud_portree') to (1,'Broken/Portaal\x3aBiograafiad/Valitud_portree') |
| 52 | +etwiki: renaming 136674 (1,'Portaal:Õigusteadus/Vanglad') to (1,'Broken/Portaal\x3a\xc3\x95igusteadus/Vanglad') |
| 53 | +etwiki: renaming 136681 (1,'Portaal:Biograafiad') to (1,'Broken/Portaal\x3aBiograafiad') |
| 54 | +etwiki: renaming 136744 (1,'Portaal:Õigusteadus/Kas_teadsid,_et...') to (1,'Broken/Portaal\x3a\xc3\x95igusteadus/Kas_teadsid\x2c_et\x2e\x2e\x2e') |
| 55 | +etwiki: renaming 136935 (1,'Portaal:Keel') to (1,'Broken/Portaal\x3aKeel') |
| 56 | +etwiki: renaming 137014 (1,'Portaal:Sport') to (1,'Broken/Portaal\x3aSport') |
| 57 | +etwiki: renaming 137017 (1,'Portaal:Loodusteadused/Sissejuhatus') to (1,'Broken/Portaal\x3aLoodusteadused/Sissejuhatus') |
| 58 | +etwiki: renaming 137120 (1,'Portaal:Psühholoogia/Kategooriad') to (1,'Broken/Portaal\x3aPs\xc3\xbchholoogia/Kategooriad') |
| 59 | +etwiki: renaming 137166 (1,'Portaal:Psühholoogia') to (1,'Broken/Portaal\x3aPs\xc3\xbchholoogia') |
| 60 | +etwiki: renaming 137193 (1,'Portaal:Biograafiad/Sündinud_täna/9._august') to (1,'Broken/Portaal\x3aBiograafiad/S\xc3\xbcndinud_t\xc3\xa4na/9\x2e_august') |
| 61 | +etwiki: renaming 137300 (1,'Portaal:Eesti') to (1,'Broken/Portaal\x3aEesti') |
| 62 | +etwiki: renaming 137319 (1,'Portaal:Biograafiad/Selected_anniversaries/9._august') to (1,'Broken/Portaal\x3aBiograafiad/Selected_anniversaries/9\x2e_august') |
| 63 | +etwiki: renaming 137350 (1,'Portaal:Sport/Päev_spordiajaloos/10._august') to (1,'Broken/Portaal\x3aSport/P\xc3\xa4ev_spordiajaloos/10\x2e_august') |
| 64 | +etwiki: renaming 137462 (1,'Portaal:Filosoofia') to (1,'Broken/Portaal\x3aFilosoofia') |
| 65 | +etwiki: renaming 137466 (1,'Portaal:Filosoofia/Valitud_elulugu') to (1,'Broken/Portaal\x3aFilosoofia/Valitud_elulugu') |
| 66 | +etwiki: renaming 137467 (1,'Portaal:Religioon') to (1,'Broken/Portaal\x3aReligioon') |
| 67 | +etwiki: renaming 137668 (1,'Portaal:Religioon/Usutegelased') to (1,'Broken/Portaal\x3aReligioon/Usutegelased') |
| 68 | +etwiki: renaming 137682 (1,'Portaal:Psühholoogia/Valitud_pilt') to (1,'Broken/Portaal\x3aPs\xc3\xbchholoogia/Valitud_pilt') |
| 69 | +etwiki: renaming 137692 (1,'Portaal:Tehnika') to (1,'Broken/Portaal\x3aTehnika') |
| 70 | +etwiki: renaming 137816 (1,'Portaal:Sotsiaalteadused/Valitud_pilt') to (1,'Broken/Portaal\x3aSotsiaalteadused/Valitud_pilt') |
| 71 | +etwiki: renaming 137994 (1,'Portaal:Biograafiad/Sündinud_täna/18._august') to (1,'Broken/Portaal\x3aBiograafiad/S\xc3\xbcndinud_t\xc3\xa4na/18\x2e_august') |
| 72 | +etwiki: renaming 138137 (1,'Portaal:Füüsika') to (1,'Broken/Portaal\x3aF\xc3\xbc\xc3\xbcsika') |
| 73 | +etwiki: renaming 138149 (1,'Portaal:Bioloogia/Kas_tead') to (1,'Broken/Portaal\x3aBioloogia/Kas_tead') |
| 74 | +etwiki: renaming 138413 (1,'Portaal:Box-header') to (1,'Broken/Portaal\x3aBox-header') |
| 75 | +etwiki: renaming 138556 (1,'Portaal:Geograafia/Valitud_pilt') to (1,'Broken/Portaal\x3aGeograafia/Valitud_pilt') |
| 76 | +etwiki: renaming 138572 (1,'Portaal:Poliitika/portaalikasti-päis') to (1,'Broken/Portaal\x3aPoliitika/portaalikasti-p\xc3\xa4is') |
| 77 | +etwiki: renaming 140145 (1,'Portaal:Astronoomia/Mida_teha') to (1,'Broken/Portaal\x3aAstronoomia/Mida_teha') |
| 78 | +etwiki: renaming 140177 (1,'Portaal:Ühiskond') to (1,'Broken/Portaal\x3a\xc3\x9chiskond') |
| 79 | +etwiki: renaming 140179 (1,'Portaal:Sotsiaalteadused') to (1,'Broken/Portaal\x3aSotsiaalteadused') |
| 80 | +etwiki: renaming 140403 (1,'Portaal:Majandus') to (1,'Broken/Portaal\x3aMajandus') |
| 81 | +etwiki: renaming 140506 (1,'Portaal:Majandus/Mida_teha') to (1,'Broken/Portaal\x3aMajandus/Mida_teha') |
| 82 | +etwiki: renaming 141301 (1,'Portaal:Loodusteadused') to (1,'Broken/Portaal\x3aLoodusteadused') |
| 83 | +etwiki: renaming 141342 (1,'Portaal:Loodusteadused/Valitud_pilt') to (1,'Broken/Portaal\x3aLoodusteadused/Valitud_pilt') |
| 84 | +etwiki: renaming 141416 (1,'Portaal:Loodusteadused/Teemad') to (1,'Broken/Portaal\x3aLoodusteadused/Teemad') |
| 85 | +etwiki: renaming 141557 (1,'Portaal:Biograafiad/Sündinud_täna/14._august') to (1,'Broken/Portaal\x3aBiograafiad/S\xc3\xbcndinud_t\xc3\xa4na/14\x2e_august') |
| 86 | +etwiki: renaming 142563 (1,'Portaal:Ajalugu/Päev_ajaloos/19._september') to (1,'Broken/Portaal\x3aAjalugu/P\xc3\xa4ev_ajaloos/19\x2e_september') |
| 87 | +etwiki: renaming 142651 (1,'Portaal:Eesti_ajalugu') to (1,'Broken/Portaal\x3aEesti_ajalugu') |
| 88 | +etwiki: renaming 143312 (1,'Portaal:Filosoofia/Filosoofid') to (1,'Broken/Portaal\x3aFilosoofia/Filosoofid') |
| 89 | +etwiki: renaming 144182 (1,'Portaal:Muinas-Eesti') to (1,'Broken/Portaal\x3aMuinas-Eesti') |
| 90 | +etwiki: renaming 144383 (1,'Portaal:Tehnika/Valitud_artikkel') to (1,'Broken/Portaal\x3aTehnika/Valitud_artikkel') |
| 91 | +etwiki: renaming 144387 (1,'Portaal:Psühholoogia/Valitud_pildid') to (1,'Broken/Portaal\x3aPs\xc3\xbchholoogia/Valitud_pildid') |
| 92 | +etwiki: renaming 144416 (1,'Portaal:Bioloogia/Valitud_artikkel/Soovitus') to (1,'Broken/Portaal\x3aBioloogia/Valitud_artikkel/Soovitus') |
| 93 | +etwiki: renaming 144448 (1,'Portaal:Majandus/Teadlased/oktoober_2008') to (1,'Broken/Portaal\x3aMajandus/Teadlased/oktoober_2008') |
| 94 | +etwiki: renaming 145547 (1,'Portaal:Muusika/Sündinud/Oktoober') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/Oktoober') |
| 95 | +etwiki: renaming 149431 (1,'Portaal:Muusika/Sündinud/7._november') to (1,'Broken/Portaal\x3aMuusika/S\xc3\xbcndinud/7\x2e_november') |
| 96 | +etwiki: renaming 155409 (1,'Portaal:Täppisteadused') to (1,'Broken/Portaal\x3aT\xc3\xa4ppisteadused') |
| 97 | +etwiki: renaming 155488 (1,'Portaal:Maateadus/Valitud_artikkel') to (1,'Broken/Portaal\x3aMaateadus/Valitud_artikkel') |
| 98 | +etwiki: renaming 155497 (1,'Portaal:Maateadus/Valitud_pilt') to (1,'Broken/Portaal\x3aMaateadus/Valitud_pilt') |
| 99 | +etwiki: renaming 155498 (1,'Portaal:Maateadus/Sissejuhatus') to (1,'Broken/Portaal\x3aMaateadus/Sissejuhatus') |
| 100 | +etwiki: renaming 155638 (1,'Portaal:Toit') to (1,'Broken/Portaal\x3aToit') |
| 101 | +etwiki: renaming 155639 (1,'Portaal:Toit/Sissejuhatus') to (1,'Broken/Portaal\x3aToit/Sissejuhatus') |
| 102 | +etwiki: renaming 155890 (1,'Portaal:Toit/Pilt') to (1,'Broken/Portaal\x3aToit/Pilt') |
| 103 | +etwiki: renaming 155946 (1,'Portaal:Majandus/Valitud_artikkel/jaanuar_2009') to (1,'Broken/Portaal\x3aMajandus/Valitud_artikkel/jaanuar_2009') |
| 104 | +etwiki: renaming 155953 (1,'Portaal:Maateadus/Valitud_artikkel/Soovitus') to (1,'Broken/Portaal\x3aMaateadus/Valitud_artikkel/Soovitus') |
| 105 | +etwiki: renaming 156023 (1,'Portaal:Maateadus/Valitud_pilt/Soovitus') to (1,'Broken/Portaal\x3aMaateadus/Valitud_pilt/Soovitus') |
| 106 | +etwiki: renaming 166356 (1,'Portaal:Norra') to (1,'Broken/Portaal\x3aNorra') |
| 107 | +etwiki: renaming 166389 (1,'Portaal:Geograafia/Geograafia_alamportaalid') to (1,'Broken/Portaal\x3aGeograafia/Geograafia_alamportaalid') |
| 108 | +etwiki: renaming 166426 (1,'Portaal:Norra/Norra_muusika') to (1,'Broken/Portaal\x3aNorra/Norra_muusika') |
| 109 | +etwiki: renaming 170281 (1,'Portaal:Eesti/Puuduvad') to (1,'Broken/Portaal\x3aEesti/Puuduvad') |
| 110 | +etwiki: renaming 170893 (1,'Portaal:Norra/Norra_geograafia') to (1,'Broken/Portaal\x3aNorra/Norra_geograafia') |
| 111 | +etwiktionary: renaming 1413 (1,'Wiktionary:Prantsuse_ebareeglipärased_verbid') to (1,'Broken/Wiktionary\x3aPrantsuse_ebareeglip\xc3\xa4rased_verbid') |
| 112 | +etwiktionary: renaming 1722 (1,'Vikisõnaraamat:Liivakast') to (1,'Broken/Vikis\xc3\xb5naraamat\x3aLiivakast') |
| 113 | +euwiki: renaming 40208 (1,'Atari:Euskal_Wikiatlasa') to (1,'Broken/Atari\x3aEuskal_Wikiatlasa') |
| 114 | +euwiki: renaming 40211 (1,'Atari:Euskal_Wikiatlasa/Hilabeteko_artikulua') to (1,'Broken/Atari\x3aEuskal_Wikiatlasa/Hilabeteko_artikulua') |
| 115 | +euwiki: renaming 58469 (1,'Atari:Euskal_Wikiatlasa/Asteko_argazkia') to (1,'Broken/Atari\x3aEuskal_Wikiatlasa/Asteko_argazkia') |
| 116 | +fawiki: renaming 23707 (1,'ویکیپدیا:گودال_ماسهبازی') to (1,'Broken/\xd9\x88\xdb\x8c\xda\xa9\xdb\x8c\xe2\x80\x8c\xd9\xbe\xd8\xaf\xdb\x8c\xd8\xa7\x3a\xda\xaf\xd9\x88\xd8\xaf\xd8\xa7\xd9\x84_\xd9\x85\xd8\xa7\xd8\xb3\xd9\x87\xe2\x80\x8c\xd8\xa8\xd8\xa7\xd8\xb2\xdb\x8c') |
| 117 | +fawiktionary: renaming 18648 (1,'پیوست:اقسام_کلام') to (1,'Broken/\xd9\xbe\xdb\x8c\xd9\x88\xd8\xb3\xd8\xaa\x3a\xd8\xa7\xd9\x82\xd8\xb3\xd8\xa7\xd9\x85_\xda\xa9\xd9\x84\xd8\xa7\xd9\x85') |
| 118 | +fawiktionary: renaming 18664 (1,'پیوست:گونههای_واژگان') to (1,'Broken/\xd9\xbe\xdb\x8c\xd9\x88\xd8\xb3\xd8\xaa\x3a\xda\xaf\xd9\x88\xd9\x86\xd9\x87\xe2\x80\x8c\xd9\x87\xd8\xa7\xdb\x8c_\xd9\x88\xd8\xa7\xda\x98\xda\xaf\xd8\xa7\xd9\x86') |
| 119 | +fawiktionary: renaming 18914 (1,'پیوست:فهرست_بسامدی_شاهنامهٔ_فردوسی') to (1,'Broken/\xd9\xbe\xdb\x8c\xd9\x88\xd8\xb3\xd8\xaa\x3a\xd9\x81\xd9\x87\xd8\xb1\xd8\xb3\xd8\xaa_\xd8\xa8\xd8\xb3\xd8\xa7\xd9\x85\xd8\xaf\xdb\x8c_\xd8\xb4\xd8\xa7\xd9\x87\xd9\x86\xd8\xa7\xd9\x85\xd9\x87\xd9\x94_\xd9\x81\xd8\xb1\xd8\xaf\xd9\x88\xd8\xb3\xdb\x8c') |
| 120 | +fiwiktionary: renaming 5953 (1,'Liite:Suomen_kielen_kielioppi') to (1,'Broken/Liite\x3aSuomen_kielen_kielioppi') |
| 121 | +fiwiktionary: renaming 9433 (1,'Liite:Espanjan_kielen_epäsäännölliset_verbit') to (1,'Broken/Liite\x3aEspanjan_kielen_ep\xc3\xa4s\xc3\xa4\xc3\xa4nn\xc3\xb6lliset_verbit') |
| 122 | +fiwiktionary: renaming 9843 (1,'Liite:Kirjaimet_ja_merkit_koodeilla') to (1,'Broken/Liite\x3aKirjaimet_ja_merkit_koodeilla') |
| 123 | +fiwiktionary: renaming 30886 (1,'liite:Vuonna_miekka_ja_kirves') to (1,'Broken/liite\x3aVuonna_miekka_ja_kirves') |
| 124 | +fiwiktionary: renaming 40735 (1,'liite:Kyōiku_kanji') to (1,'Broken/liite\x3aKy\xc5\x8diku_kanji') |
| 125 | +fiwiktionary: renaming 40880 (1,'Liite:Armeijaslangi') to (1,'Broken/Liite\x3aArmeijaslangi') |
| 126 | +fiwiktionary: renaming 44079 (1,'Liite:Latinan_deklinaatiot') to (1,'Broken/Liite\x3aLatinan_deklinaatiot') |
| 127 | +fiwiktionary: renaming 49618 (1,'Liite:Elektroniikkaslangi') to (1,'Broken/Liite\x3aElektroniikkaslangi') |
| 128 | +fiwiktionary: renaming 53925 (1,'liite:Espanjan_kielen_paikannimiadjektiivit') to (1,'Broken/liite\x3aEspanjan_kielen_paikannimiadjektiivit') |
| 129 | +fiwiktionary: renaming 53944 (1,'liite:Kielten_nimiä_espanjaksi') to (1,'Broken/liite\x3aKielten_nimi\xc3\xa4_espanjaksi') |
| 130 | +fiwiktionary: renaming 57292 (1,'Liite:Terveydenhuollon_sanasto') to (1,'Broken/Liite\x3aTerveydenhuollon_sanasto') |
| 131 | +fiwiktionary: renaming 59681 (1,'Liite:Suomen_kielen_ääntäminen') to (1,'Broken/Liite\x3aSuomen_kielen_\xc3\xa4\xc3\xa4nt\xc3\xa4minen') |
| 132 | +fiwiktionary: renaming 102198 (1,'Liite:Suomen_kielen_L-kirjaimeen_päättyvät_sanat') to (1,'Broken/Liite\x3aSuomen_kielen_L-kirjaimeen_p\xc3\xa4\xc3\xa4ttyv\xc3\xa4t_sanat') |
| 133 | +fiwiktionary: renaming 108771 (1,'liite:Luvut') to (1,'Broken/liite\x3aLuvut') |
| 134 | +frwiki: renaming 203680 (1,'Utilisateur:Yug/Modèle:Période_histoire') to (1,'Broken/Utilisateur\x3aYug/Mod\xc3\xa8le\x3aP\xc3\xa9riode_histoire') |
| 135 | +frwiki: renaming 384789 (1,'Modèle:Encyclopédie/Archive_2006-02-07') to (1,'Broken/Mod\xc3\xa8le\x3aEncyclop\xc3\xa9die/Archive_2006-02-07') |
| 136 | +frwiki: renaming 398085 (1,'WP:Oc') to (1,'Broken/WP\x3aOc') |
| 137 | +frwiki: renaming 398087 (1,'WP:LBc') to (1,'Broken/WP\x3aLBc') |
| 138 | +frwiki: renaming 693282 (1,'Utilisateur:Crocy/Méthode') to (1,'Broken/Utilisateur\x3aCrocy/M\xc3\xa9thode') |
| 139 | +frwiki: renaming 1002939 (1,'WP:HMA') to (1,'Broken/WP\x3aHMA') |
| 140 | +frwiki: renaming 1035901 (1,'Utilisateur:BenP/Ebauche') to (1,'Broken/Utilisateur\x3aBenP/Ebauche') |
| 141 | +frwiki: renaming 1323147 (1,'Modèle:À_illustrer/Documentation') to (1,'Broken/Mod\xc3\xa8le\x3a\xc3\x80_illustrer/Documentation') |
| 142 | +frwiki: renaming 1542478 (1,'WP:VV') to (1,'Broken/WP\x3aVV') |
| 143 | +frwiki: renaming 2685477 (1,'WP:AG/IA') to (1,'Broken/WP\x3aAG/IA') |
| 144 | +frwiki: renaming 3215877 (1,'Portail:Syndicalisme/Articles_demandés') to (1,'Broken/Portail\x3aSyndicalisme/Articles_demand\xc3\xa9s') |
| 145 | +frwikibooks: renaming 27757 (1,'Transwiki:Résolution_d'un_sudoku') to (1,'Broken/Transwiki\x3aR\xc3\xa9solution_d\x27un_sudoku') |
| 146 | +frwikisource: renaming 7198 (1,'Auteur:Charles_Baudelaire') to (1,'Broken/Auteur\x3aCharles_Baudelaire') |
| 147 | +frwikisource: renaming 7275 (1,'Auteur:Hans_Christian_Andersen') to (1,'Broken/Auteur\x3aHans_Christian_Andersen') |
| 148 | +frwikisource: renaming 84360 (1,'Auteur:Arthur_Rimbaud') to (1,'Broken/Auteur\x3aArthur_Rimbaud') |
| 149 | +frwiktionary: renaming 232878 (1,'Annexe:Unités_de_mesure_en_français') to (1,'Broken/Annexe\x3aUnit\xc3\xa9s_de_mesure_en_fran\xc3\xa7ais') |
| 150 | +frwiktionary: renaming 232880 (1,'Annexe:Émoticône') to (1,'Broken/Annexe\x3a\xc3\x89motic\xc3\xb4ne') |
| 151 | +frwiktionary: renaming 232883 (1,'Portail:Philosophie') to (1,'Broken/Portail\x3aPhilosophie') |
| 152 | +frwiktionary: renaming 232884 (1,'Portail:Poésie') to (1,'Broken/Portail\x3aPo\xc3\xa9sie') |
| 153 | +furwiki: renaming 88 (1,'Vichipedie:Liste_dai_articui_che_dutis_lis_vichipedîs_a_varessin_di_vê') to (1,'Broken/Vichipedie\x3aListe_dai_articui_che_dutis_lis_vichiped\xc3\xaes_a_varessin_di_v\xc3\xaa') |
| 154 | +glkwiki: renaming 2135 (1,'کاربر:سمیعی') to (1,'Broken/\xda\xa9\xd8\xa7\xd8\xb1\xd8\xa8\xd8\xb1\x3a\xd8\xb3\xd9\x85\xdb\x8c\xd8\xb9\xdb\x8c') |
| 155 | +glwiki: renaming 37890 (1,'Axuda:FAQ_Colexios') to (1,'Broken/Axuda\x3aFAQ_Colexios') |
| 156 | +glwiki: renaming 61938 (1,'Portal:Euskal_Herria') to (1,'Broken/Portal\x3aEuskal_Herria') |
| 157 | +hewiki: renaming 509021 (1,'ויקיפדיה:אמינות/הצעת_הוספה_למומלצים') to (1,'Broken/id:509021') |
| 158 | +hewiki: renaming 509102 (1,'ויקיפדיה:אמינות') to (1,'Broken/\xd7\x95\xd7\x99\xd7\xa7\xd7\x99\xd7\xa4\xd7\x93\xd7\x99\xd7\x94\x3a\xd7\x90\xd7\x9e\xd7\x99\xd7\xa0\xd7\x95\xd7\xaa') |
| 159 | +hewikisource: renaming 1348 (1,'ויקיטקסט:טקסטים_יהודיים_ברשת') to (1,'Broken/\xd7\x95\xd7\x99\xd7\xa7\xd7\x99\xd7\x98\xd7\xa7\xd7\xa1\xd7\x98\x3a\xd7\x98\xd7\xa7\xd7\xa1\xd7\x98\xd7\x99\xd7\x9d_\xd7\x99\xd7\x94\xd7\x95\xd7\x93\xd7\x99\xd7\x99\xd7\x9d_\xd7\x91\xd7\xa8\xd7\xa9\xd7\xaa') |
| 160 | +hiwiki: renaming 146 (1,'सदस्य_:Yann') to (1,'Broken/\xe0\xa4\xb8\xe0\xa4\xa6\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xaf_\x3aYann') |
| 161 | +hiwiki: renaming 3274 (1,'Wikipedia:Setting_up_your_browser_for_Indic_scripts') to (1,'Broken/Wikipedia\x3aSetting_up_your_browser_for_Indic_scripts') |
| 162 | +huwikisource: renaming 4022 (1,'Szerző:Ady_Endre') to (1,'Broken/Szerz\xc5\x91\x3aAdy_Endre') |
| 163 | +huwikisource: renaming 4023 (1,'Szerző:Juhász_Gyula') to (1,'Broken/Szerz\xc5\x91\x3aJuh\xc3\xa1sz_Gyula') |
| 164 | +huwikisource: renaming 4024 (1,'Szerző:Mircea_Eliade') to (1,'Broken/Szerz\xc5\x91\x3aMircea_Eliade') |
| 165 | +huwikisource: renaming 4025 (1,'Szerző:Tóth_Árpád') to (1,'Broken/Szerz\xc5\x91\x3aT\xc3\xb3th_\xc3\x81rp\xc3\xa1d') |
| 166 | +huwikisource: renaming 4026 (1,'Szerző:René_Guénon') to (1,'Broken/Szerz\xc5\x91\x3aRen\xc3\xa9_Gu\xc3\xa9non') |
| 167 | +huwikisource: renaming 4027 (1,'Szerző:Végvári_József') to (1,'Broken/Szerz\xc5\x91\x3aV\xc3\xa9gv\xc3\xa1ri_J\xc3\xb3zsef') |
| 168 | +huwikisource: renaming 4028 (1,'Szerző:Dsida_Jenő') to (1,'Broken/Szerz\xc5\x91\x3aDsida_Jen\xc5\x91') |
| 169 | +huwikisource: renaming 4029 (1,'Szerző:József_Attila') to (1,'Broken/Szerz\xc5\x91\x3aJ\xc3\xb3zsef_Attila') |
| 170 | +huwikisource: renaming 4030 (1,'Szerző:James_Fenimore_Cooper') to (1,'Broken/Szerz\xc5\x91\x3aJames_Fenimore_Cooper') |
| 171 | +huwikisource: renaming 4031 (1,'Szerző:Tamkó_Sirató_Károly') to (1,'Broken/Szerz\xc5\x91\x3aTamk\xc3\xb3_Sirat\xc3\xb3_K\xc3\xa1roly') |
| 172 | +iowiki: renaming 4046 (1,'Wikipedio:Wikipediisti') to (1,'Broken/Wikipedio\x3aWikipediisti') |
| 173 | +iowiki: renaming 21312 (1,'Wikipedio:Komuneso-portalo') to (1,'Broken/Wikipedio\x3aKomuneso-portalo') |
| 174 | +itwiki: renaming 1763426 (1,'Discussione:Storia_della_letteratura_italiana/Storia_della_letteratura_italiana:_dalle_Origini_al_Quattrocento') to (1,'Broken/Discussione\x3aStoria_della_letteratura_italiana/Storia_della_letteratura_italiana\x3a_dalle_Origini_al_Quattrocento') |
| 175 | +jawiki: renaming 101278 (1,'Meta:ウィキメディアニュース') to (1,'Broken/Meta\x3a\xe3\x82\xa6\xe3\x82\xa3\xe3\x82\xad\xe3\x83\xa1\xe3\x83\x87\xe3\x82\xa3\xe3\x82\xa2\xe3\x83\x8b\xe3\x83\xa5\xe3\x83\xbc\xe3\x82\xb9') |
| 176 | +jawikibooks: renaming 3263 (1,'Transwiki:ラテン語の文法') to (1,'Broken/Transwiki\x3a\xe3\x83\xa9\xe3\x83\x86\xe3\x83\xb3\xe8\xaa\x9e\xe3\x81\xae\xe6\x96\x87\xe6\xb3\x95') |
| 177 | +jawikibooks: renaming 3265 (1,'Transwiki:ラテン語の文法2') to (1,'Broken/Transwiki\x3a\xe3\x83\xa9\xe3\x83\x86\xe3\x83\xb3\xe8\xaa\x9e\xe3\x81\xae\xe6\x96\x87\xe6\xb3\x952') |
| 178 | +jawikibooks: renaming 3830 (1,'Transwiki:ドイツ語の表現集') to (1,'Broken/Transwiki\x3a\xe3\x83\x89\xe3\x82\xa4\xe3\x83\x84\xe8\xaa\x9e\xe3\x81\xae\xe8\xa1\xa8\xe7\x8f\xbe\xe9\x9b\x86') |
| 179 | +jawikibooks: renaming 4207 (1,'Transwiki:フランス語の表現集') to (1,'Broken/Transwiki\x3a\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\xe3\x82\xb9\xe8\xaa\x9e\xe3\x81\xae\xe8\xa1\xa8\xe7\x8f\xbe\xe9\x9b\x86') |
| 180 | +jawikibooks: renaming 5264 (1,'Wikiversity:メインページ') to (1,'Broken/Wikiversity\x3a\xe3\x83\xa1\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x9a\xe3\x83\xbc\xe3\x82\xb8') |
| 181 | +klwiki: renaming 3088 (0,'Ikiuutit:Ilitsersuutit') to (0,'Broken/Ilitsersuutit') |
| 182 | +klwiki: renaming 3089 (1,'Ikiuutit:Ilitsersuutit') to (1,'Broken/Ikiuutit\x3aIlitsersuutit') |
| 183 | +klwiki: renaming 3135 (0,'Ikiuutit:Ikiuutit') to (0,'Broken/Ikiuutit') |
| 184 | +klwiki: renaming 3136 (1,'Ikiuutit:Ikiuutit') to (1,'Broken/Ikiuutit\x3aIkiuutit') |
| 185 | +klwiki: renaming 3137 (0,'Ikiuutit:Aallartigit') to (0,'Broken/Aallartigit') |
| 186 | +klwiki: renaming 3138 (0,'Ikiuutit:Kukkusuulaartarnerit') to (0,'Broken/Kukkusuulaartarnerit') |
| 187 | +klwiki: renaming 3139 (0,'Ikiuutit:Aaqqissuussineq') to (0,'Broken/Aaqqissuussineq') |
| 188 | +klwiki: renaming 3140 (0,'Ikiuutit:Nuutsisarneq') to (0,'Broken/Nuutsisarneq') |
| 189 | +klwiki: renaming 3141 (0,'Ikiuutit:Assit') to (0,'Broken/Assit') |
| 190 | +kmwiki: renaming 1797 (0,'ប្រទេសកម្ពុជា') to (0,'Broken/ប្រទេស_កម្ពុជា') |
| 191 | +kmwiki: renaming 2275 (0,'ខេត្តកណ្តាល') to (0,'Broken/ខេត្ត_កណ្តាល') |
| 192 | +kmwiki: renaming 2510 (0,'ប្រាសាទព្រះវិហារ') to (0,'Broken/ប្រាសាទព្រះវិហារ') |
| 193 | +kmwiki: renaming 2785 (0,'ខេត្តរតនគិរី') to (0,'Broken/ខេត្ត_រតនគិរី') |
| 194 | +kmwiki: renaming 2787 (0,'ខេត្តកំពង់ចាម') to (0,'Broken/ខេត្ត_កំពង់ចាម') |
| 195 | +kmwiki: renaming 2788 (0,'ខេត្តក្រចេះ') to (0,'Broken/ខេត្ត_ក្រចេះ') |
| 196 | +kmwiki: renaming 2939 (0,'ស្រុកសង្កែ') to (0,'Broken/ស្រុក_សង្កែ') |
| 197 | +kmwiki: renaming 3142 (0,'ប្រាសាទ_ព្រះវិហារ') to (0,'Broken/ប្រាសាទ_ព្រះវិហារ') |
| 198 | +kmwiki: renaming 3171 (0,'ប្រាសាទអង្គរវត្ត') to (0,'Broken/ប្រាសាទ_អង្គរវត្ត') |
| 199 | +kmwiki: renaming 3296 (0,'បុណ្យតារា') to (0,'Broken/បុណ្យ_តារា') |
| 200 | +kmwiki: renaming 3378 (0,'សហភាពសូវៀត') to (0,'Broken/សហភាព_សូវៀត') |
| 201 | +kmwiki: renaming 3484 (0,'សុខភាព') to (0,'Broken/សុខភាព') |
| 202 | +kmwiki: renaming 3664 (1,'វិគីភីឌា:ទំព័រហាត់') to (1,'Broken/\xe1\x9e\x9c\xe1\x9e\xb7\xe1\x9e\x82\xe1\x9e\xb8\xe1\x9e\x97\xe1\x9e\xb8\xe1\x9e\x8c\xe1\x9e\xb6\x3a\xe1\x9e\x91\xe1\x9f\x86\xe1\x9e\x96\xe1\x9f\x90\xe1\x9e\x9a\xe1\x9e\xa0\xe1\x9e\xb6\xe1\x9e\x8f\xe1\x9f\x8b') |
| 203 | +kmwiki: renaming 3966 (1,'វិគីភីឌា:សុំជាអ្នកអភិបាល') to (1,'Broken/id:3966') |
| 204 | +kmwiki: renaming 4134 (0,'សហរដ្ឋអាមេរិក') to (0,'Broken/សហរដ្ឋ_អាមេរិក') |
| 205 | +kmwiki: renaming 4229 (0,'ក្រុងភ្នំពេញ') to (0,'Broken/ក្រុង_ភ្នំពេញ') |
| 206 | +kmwiki: renaming 4234 (0,'កម្ពុជា') to (0,'Broken/កម្ពុជា') |
| 207 | +kmwiki: renaming 4272 (0,'ប្រទេសកម្ពុជា') to (0,'Broken/id:4272') |
| 208 | +kmwiki: renaming 4314 (0,'ខេត្តពោធិ៍សាត់') to (0,'Broken/ខេត្ត_ពោធិ៍សាត់') |
| 209 | +kmwiki: renaming 4483 (0,'ប្រាសាទបាយ័ន') to (0,'Broken/ប្រាសាទ_បាយ័ន') |
| 210 | +kmwiki: renaming 4548 (0,'ខេត្តសៀមរាប') to (0,'Broken/ខេត្ត_សៀមរាប') |
| 211 | +kmwiki: renaming 4718 (0,'ក្រុងព្រះសីហនុ') to (0,'Broken/ក្រុងព្រះសីហនុ') |
| 212 | +kmwiki: renaming 4719 (0,'ព្រះរាជាណាចក្រកម្ពុជា') to (0,'Broken/ព្រះរាជាណាចក្រ_កម្ពុជា') |
| 213 | +kmwiki: renaming 4956 (0,'ខេត្តកំពង់ធំ') to (0,'Broken/ខេត្ត_កំពង់ធំ') |
| 214 | +kmwiki: renaming 4965 (0,'របាំព្រះរាជទ្រព្យ') to (0,'Broken/របាំ_ព្រះ_រាជ_ទ្រព្យ') |
| 215 | +kmwiki: renaming 5006 (0,'ស្រុក_មោងឫស្សី') to (0,'Broken/ស្រុក_មោងឫស្សី') |
| 216 | +kmwiki: renaming 5007 (0,'ស្រុក_រតនមណ្ឌល') to (0,'Broken/ស្រុក_រតនមណ្ឌល') |
| 217 | +kmwiki: renaming 5008 (0,'ស្រុក_សង្កែ') to (0,'Broken/id:5008') |
| 218 | +kmwiki: renaming 5009 (0,'ស្រុក_សំឡូត') to (0,'Broken/ស្រុក_សំឡូត') |
| 219 | +kmwiki: renaming 5011 (0,'ស្រុក_ភ្នំព្រឹក') to (0,'Broken/ស្រុក_ភ្នំព្រឹក') |
| 220 | +kmwiki: renaming 5012 (0,'ស្រុក_កំរៀង') to (0,'Broken/ស្រុក_កំរៀង') |
| 221 | +kmwiki: renaming 5013 (0,'ស្រុក_គាស់ក្រឡ') to (0,'Broken/ស្រុក_គាស់ក្រឡ') |
| 222 | +kmwiki: renaming 5195 (0,'ពិភពលោក') to (0,'Broken/ពិភពលោក') |
| 223 | +kmwiki: renaming 5225 (0,'បឹងទន្លេសាប') to (0,'Broken/បឹង_ទន្លេសាប') |
| 224 | +kmwiki: renaming 5365 (0,'ស្រុកបាណន់') to (0,'Broken/ស្រុក_បាណន់') |
| 225 | +kmwiki: renaming 5366 (0,'ស្រុកថ្មគោល') to (0,'Broken/ស្រុក_ថ្មគោល') |
| 226 | +kmwiki: renaming 5367 (0,'ស្រុកបវេល') to (0,'Broken/ស្រុក_បវេល') |
| 227 | +kmwiki: renaming 5433 (0,'ពិភពលោក') to (0,'Broken/id:5433') |
| 228 | +kmwiki: renaming 5454 (0,'ប្រាសាទព្រះវិហារ') to (0,'Broken/id:5454') |
| 229 | +kmwiki: renaming 5745 (0,'ប្រាសាទបាពួន') to (0,'Broken/ប្រាសាទ_បាពួន') |
| 230 | +kmwiki: renaming 6019 (0,'អង្គការសហប្រជាជាតិ') to (0,'Broken/អង្គការ_សហប្រជាជាតិ') |
| 231 | +kmwiki: renaming 7335 (0,'ខេត្តសៀមរាប') to (0,'Broken/id:7335') |
| 232 | +kmwiki: renaming 7407 (0,'ខេត្តបន្ទាយមានជ័យ') to (0,'Broken/ខេត្ត_បន្ទាយមានជ័យ') |
| 233 | +kmwiki: renaming 7543 (0,'ទ្រឹស្តីបទកូស៊ីនុស') to (0,'Broken/ទ្រឹស្តីបទ_កូស៊ីនុស') |
| 234 | +kmwiki: renaming 7802 (0,'គណកម្មាធិការអូឡាំពិកជាតិ') to (0,'Broken/គណកម្មាធិការអូឡាំពិកជាតិ') |
| 235 | +kmwiki: renaming 7943 (0,'ខេត្តបាត់ដំបង') to (0,'Broken/ខេត្ត_បាត់ដំបង') |
| 236 | +kmwiki: renaming 8232 (0,'នរោត្តមចន្ទរង្សី') to (0,'Broken/នរោត្តម_ចន្ទរង្សី') |
| 237 | +kmwiki: renaming 8346 (0,'បំលែងឡាប្លាស') to (0,'Broken/បំលែង_ឡាប្លាស') |
| 238 | +kmwiki: renaming 8353 (0,'ប្រាសាទប្រែរូប') to (0,'Broken/ប្រាសាទប្រែរូប') |
| 239 | +kmwiki: renaming 8392 (0,'ត្រីកោណសម័ង្ស') to (0,'Broken/ត្រីកោណសម័ង្ស') |
| 240 | +kmwiki: renaming 8413 (0,'អនុគមន៍ត្រីកោណមាត្រ') to (0,'Broken/អនុគមន៍ត្រីកោណមាត្រ') |
| 241 | +kmwiki: renaming 8499 (0,'រង្វង់') to (0,'Broken/រង្វង់') |
| 242 | +kmwiki: renaming 8607 (0,'ត្រីកោណ') to (0,'Broken/ត្រីកោណ') |
| 243 | +kmwiki: renaming 8826 (0,'ក្រុងភ្នំពេញ') to (0,'Broken/id:8826') |
| 244 | +kmwiki: renaming 8834 (0,'មុំ') to (0,'Broken/មុំ') |
| 245 | +kmwiki: renaming 8892 (0,'មហាអំណាចនុយក្លេអ៊ែរ') to (0,'Broken/មហាអំណាច_នុយក្លេអ៊ែរ') |
| 246 | +kmwiki: renaming 8931 (0,'ទ្រឹស្តីបទវ្យែត') to (0,'Broken/ទ្រឹស្តីបទ_វ្យែត') |
| 247 | +kmwiki: renaming 8993 (0,'ក្រលាផ្ទៃ') to (0,'Broken/ក្រលាផ្ទៃ') |
| 248 | +kmwiki: renaming 9009 (0,'សហភាពសូវៀត') to (0,'Broken/id:9009') |
| 249 | +kmwiki: renaming 9205 (0,'ស្រុកអង្គស្នួល') to (0,'Broken/ស្រុក_អង្គស្នួល') |
| 250 | +kmwiki: renaming 9214 (0,'អ្នកភិរម្យភាសាអ៊ូ') to (0,'Broken/អ្នក_ភិរម្យ_ភាសា_អ៊ូ') |
| 251 | +kmwiki: renaming 9455 (0,'ចេក') to (0,'Broken/ចេក') |
| 252 | +kmwiki: renaming 9706 (0,'បារាំង') to (0,'Broken/បារាំង') |
| 253 | +kmwiki: renaming 9774 (0,'ភូមិវប្បធម៌កម្ពុជា') to (0,'Broken/ភូមិវប្បធម៌កម្ពុជា') |
| 254 | +kmwiki: renaming 9776 (0,'ក្រុងសៀមរាប') to (0,'Broken/ក្រុង_សៀមរាប') |
| 255 | +kmwiki: renaming 10031 (0,'កេង_វ៉ាន់សាក់') to (0,'Broken/កេង_វ៉ាន់សាក់') |
| 256 | +kmwiki: renaming 10056 (0,'ស្កុតឡែន') to (0,'Broken/ស្កុតឡែន') |
| 257 | +kmwiki: renaming 10240 (0,'ទ្រឹស្តីបទមីកេល') to (0,'Broken/ទ្រឹស្តីបទ_មីកេល') |
| 258 | +kmwiki: renaming 10276 (0,'ពហុធាប៊ែរនូយី') to (0,'Broken/ពហុធា_ប៊ែរនូយី') |
| 259 | +kmwiki: renaming 10503 (0,'កម្មវិធីអភិវឌ្ឍន៍សហប្រជាជាតិ') to (0,'Broken/កម្មវិធី_អភិវឌ្ឍន៍_សហប្រជាជាតិ') |
| 260 | +kmwiki: renaming 10684 (0,'មហាសមុទ្រអាត្លង់ទិក') to (0,'Broken/មហាសមុទ្រ_អាត្លង់ទិក') |
| 261 | +kmwiki: renaming 10707 (0,'ហែម_ចៀវ') to (0,'Broken/ហែម_ចៀវ') |
| 262 | +kmwiki: renaming 10750 (0,'កម្ពុជាក្រោម') to (0,'Broken/កម្ពុជា_ក្រោម') |
| 263 | +knwiki: renaming 1949 (1,'ಸಹಾಯ:ಸಂಪಾದನೆ') to (1,'Broken/\xe0\xb2\xb8\xe0\xb2\xb9\xe0\xb2\xbe\xe0\xb2\xaf\x3a\xe0\xb2\xb8\xe0\xb2\x82\xe0\xb2\xaa\xe0\xb2\xbe\xe0\xb2\xa6\xe0\xb2\xa8\xe0\xb3\x86') |
| 264 | +knwiki: renaming 2149 (1,'ವಿಕಿಪೀಡಿಯ:_ಕೃತಿಸ್ವಾಮ್ಯತೆಗಳು') to (1,'Broken/id:2149') |
| 265 | +knwiki: renaming 2685 (1,'ಸಹಾಯ:ಹೊಸ_ಲೇಖನವೊಂದನ್ನು_ಪ್ರಾರಂಭಿಸುವುದು_ಹೇಗೆ?') to (1,'Broken/id:2685') |
| 266 | +knwiki: renaming 4147 (1,'ವಿಕಿಪೀಡಿಯ:ಚುಟುಕು') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\x9a\xe0\xb3\x81\xe0\xb2\x9f\xe0\xb3\x81\xe0\xb2\x95\xe0\xb3\x81') |
| 267 | +knwiki: renaming 4638 (1,'ವಿಕಿಪೀಡಿಯ:ಪ್ರಯೋಗ_ಶಾಲೆ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\xaa\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb2\xaf\xe0\xb3\x8b\xe0\xb2\x97_\xe0\xb2\xb6\xe0\xb2\xbe\xe0\xb2\xb2\xe0\xb3\x86') |
| 268 | +knwiki: renaming 4879 (1,'ವಿಕಿಪೀಡಿಯ:ಕನ್ನಡ_ವಿಕಿಪೀಡಿಯ_meet_and_press_conference') to (1,'Broken/id:4879') |
| 269 | +knwiki: renaming 5137 (1,'ಸಹಾಯ:ಸ೦ಪಾದನೆ') to (1,'Broken/\xe0\xb2\xb8\xe0\xb2\xb9\xe0\xb2\xbe\xe0\xb2\xaf\x3a\xe0\xb2\xb8\xe0\xb3\xa6\xe0\xb2\xaa\xe0\xb2\xbe\xe0\xb2\xa6\xe0\xb2\xa8\xe0\xb3\x86') |
| 270 | +knwiki: renaming 5490 (1,'ವಿಶೇಷ:ಯಾದೃಚ್ಛಿಕ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\xb6\xe0\xb3\x87\xe0\xb2\xb7\x3a\xe0\xb2\xaf\xe0\xb2\xbe\xe0\xb2\xa6\xe0\xb3\x83\xe0\xb2\x9a\xe0\xb3\x8d\xe0\xb2\x9b\xe0\xb2\xbf\xe0\xb2\x95') |
| 271 | +knwiki: renaming 5532 (1,'ವಿಕಿಪೀಡಿಯ:ನಮ್ಮ_ಬಗ್ಗೆ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\xa8\xe0\xb2\xae\xe0\xb3\x8d\xe0\xb2\xae_\xe0\xb2\xac\xe0\xb2\x97\xe0\xb3\x8d\xe0\xb2\x97\xe0\xb3\x86') |
| 272 | +knwiki: renaming 7058 (1,'ವಿಕಿಪೀಡಿಯ:ವಿಹರಿಸಿ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\xb9\xe0\xb2\xb0\xe0\xb2\xbf\xe0\xb2\xb8\xe0\xb2\xbf') |
| 273 | +knwiki: renaming 8383 (1,'ವಿಕಿಪೀಡಿಯ:ವಾರದ_ಸಹಯೋಗ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa6_\xe0\xb2\xb8\xe0\xb2\xb9\xe0\xb2\xaf\xe0\xb3\x8b\xe0\xb2\x97') |
| 274 | +knwiki: renaming 9120 (1,'ವಿಕಿಪೀಡಿಯ:ಅರಳಿ_ಕಟ್ಟೆ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\x85\xe0\xb2\xb0\xe0\xb2\xb3\xe0\xb2\xbf_\xe0\xb2\x95\xe0\xb2\x9f\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x86') |
| 275 | +knwiki: renaming 9431 (1,'ವಿಕಿಪೀಡಿಯ:ಅಡ್ಡದಾರಿ') to (1,'Broken/\xe0\xb2\xb5\xe0\xb2\xbf\xe0\xb2\x95\xe0\xb2\xbf\xe0\xb2\xaa\xe0\xb3\x80\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xaf\x3a\xe0\xb2\x85\xe0\xb2\xa1\xe0\xb3\x8d\xe0\xb2\xa1\xe0\xb2\xa6\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xbf') |
| 276 | +knwiki: renaming 10326 (1,'ವಿಕಿಪೀಡಿಯ:ಅರಳಿ_ಕಟ್ಟೆ/ಇತರ_ಚರ್ಚೆ') to (1,'Broken/id:10326') |
| 277 | +knwiki: renaming 11080 (1,'ವಿಕಿಪೀಡಿಯ:ಅಗತ್ಯ_ಲೇಖನಗಳು') to (1,'Broken/id:11080') |
| 278 | +kshwiki: renaming 2989 (1,'W:ksh:Houpsigg') to (1,'Broken/W\x3aksh\x3aHoupsigg') |
| 279 | +kshwiki: renaming 140010 (1,'Medmaacher:Düüvelskääl') to (1,'Broken/Medmaacher\x3aD\xc3\xbc\xc3\xbcvelsk\xc3\xa4\xc3\xa4l') |
| 280 | +kshwiki: renaming 339289 (1,'Wikipedia:Shpände_för_WiKoelsch') to (1,'Broken/Wikipedia\x3aShp\xc3\xa4nde_f\xc3\xb6r_WiKoelsch') |
| 281 | +kshwiki: renaming 464553 (1,'Shpezjal:Letzte_Änderungen') to (1,'Broken/Shpezjal\x3aLetzte_\xc3\x84nderungen') |
| 282 | +lawikisource: renaming 6442 (1,'Liber:De_assensione_Stoici_quid_senserint.djvu') to (1,'Broken/Liber\x3aDe_assensione_Stoici_quid_senserint\x2edjvu') |
| 283 | +lawikisource: renaming 6523 (1,'Liber:Libri_tres_de_institutione_harmonica') to (1,'Broken/Liber\x3aLibri_tres_de_institutione_harmonica') |
| 284 | +lawikisource: renaming 6543 (1,'Liber:De_remediis_utriusque_fortunae') to (1,'Broken/Liber\x3aDe_remediis_utriusque_fortunae') |
| 285 | +lawikisource: renaming 6572 (1,'Liber:De_revolutionibus_orbium_coelestium') to (1,'Broken/Liber\x3aDe_revolutionibus_orbium_coelestium') |
| 286 | +lawikisource: renaming 7373 (1,'Liber:De_assensione_Stoici_quid_senserint') to (1,'Broken/Liber\x3aDe_assensione_Stoici_quid_senserint') |
| 287 | +lawikisource: renaming 7642 (1,'Liber:The_poems_of_Gaius_Valerius_Catullus_-_Francis_Warre_Cornish.djvu') to (1,'Broken/Liber\x3aThe_poems_of_Gaius_Valerius_Catullus_-_Francis_Warre_Cornish\x2edjvu') |
| 288 | +lbwiki: renaming 2978 (1,'Hëllef:Éischt_Schrëtt') to (1,'Broken/H\xc3\xabllef\x3a\xc3\x89ischt_Schr\xc3\xabtt') |
| 289 | +lbwiki: renaming 6605 (1,'Hëllef:Wéi_réckelen_ech_eng_Säit?') to (1,'Broken/H\xc3\xabllef\x3aW\xc3\xa9i_r\xc3\xa9ckelen_ech_eng_S\xc3\xa4it\x3f') |
| 290 | +lbwiki: renaming 16941 (1,'Hëllef:Sichen') to (1,'Broken/H\xc3\xabllef\x3aSichen') |
| 291 | +lbwiki: renaming 23739 (1,'Hëllef:Wéi_sichen_ech_eng_Säit') to (1,'Broken/H\xc3\xabllef\x3aW\xc3\xa9i_sichen_ech_eng_S\xc3\xa4it') |
| 292 | +lmowiki: renaming 5995 (1,'Purtaal:Entrada') to (1,'Broken/Purtaal\x3aEntrada') |
| 293 | +lmowiki: renaming 132386 (1,'Jüt:Dervì_un_cünt') to (1,'Broken/J\xc3\xbct\x3aDerv\xc3\xac_un_c\xc3\xbcnt') |
| 294 | +metawiki: renaming 45418 (1,'Wikiversity:Online_Course') to (1,'Broken/Wikiversity\x3aOnline_Course') |
| 295 | +metawiki: renaming 52254 (1,'Wikiversity:Faculty_club') to (1,'Broken/Wikiversity\x3aFaculty_club') |
| 296 | +mgwiki: renaming 4119 (0,'Utilisateur:Muro_Bot') to (0,'Broken/Muro_Bot') |
| 297 | +mgwiki: renaming 4138 (0,'Utilisateur:Jagwar') to (0,'Broken/Jagwar') |
| 298 | +mgwiki: renaming 4144 (0,'Modèle:fro') to (0,'Broken/Fro') |
| 299 | +mgwiki: renaming 4153 (0,'Utilisateur:WikimediaNotifier/notifications') to (0,'Broken/WikimediaNotifier/notifications') |
| 300 | +mgwikibooks: renaming 1867 (0,'Utilisateur:WikimediaNotifier/notifications') to (0,'Broken/WikimediaNotifier/notifications') |
| 301 | +mgwiktionary: renaming 2149 (0,'Utilisateur:WikimediaNotifier/notifications') to (0,'Broken/WikimediaNotifier/notifications') |
| 302 | +miwiki: renaming 5275 (1,'Wikipedia:Kaupapa') to (1,'Broken/Wikipedia\x3aKaupapa') |
| 303 | +miwiki: renaming 5349 (1,'Category:Rautau_21') to (1,'Broken/Category\x3aRautau_21') |
| 304 | +mkwiki: renaming 25125 (1,'Портал:Република_Македонија') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\xa0\xd0\xb5\xd0\xbf\xd1\x83\xd0\xb1\xd0\xbb\xd0\xb8\xd0\xba\xd0\xb0_\xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd0\xb8\xd1\x98\xd0\xb0') |
| 305 | +mkwiki: renaming 30262 (1,'Портал:Историја') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x98\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd1\x98\xd0\xb0') |
| 306 | +mkwiki: renaming 32136 (1,'Портал:Биографија') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x91\xd0\xb8\xd0\xbe\xd0\xb3\xd1\x80\xd0\xb0\xd1\x84\xd0\xb8\xd1\x98\xd0\xb0') |
| 307 | +mkwiki: renaming 32612 (1,'Портал:Археологија/галерија_на_слики') to (1,'Broken/id:32612') |
| 308 | +mkwiki: renaming 32766 (1,'Портал:Математика') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x9c\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbc\xd0\xb0\xd1\x82\xd0\xb8\xd0\xba\xd0\xb0') |
| 309 | +mnwiki: renaming 7815 (1,'Тусламж:Агуулга') to (1,'Broken/\xd0\xa2\xd1\x83\xd1\x81\xd0\xbb\xd0\xb0\xd0\xbc\xd0\xb6\x3a\xd0\x90\xd0\xb3\xd1\x83\xd1\x83\xd0\xbb\xd0\xb3\xd0\xb0') |
| 310 | +mrwiki: renaming 15927 (1,'विकिपीडिया:विक्शनरी_नमुना_पत्र१') to (1,'Broken/id:15927') |
| 311 | +mrwiki: renaming 15936 (1,'विकिपीडिया:वृत्तपत्रीय_मासिक_आवाहन') to (1,'Broken/id:15936') |
| 312 | +mrwiki: renaming 15940 (1,'विकिपीडिया:वृत्तपत्रिय_मासिक_आवाहन') to (1,'Broken/id:15940') |
| 313 | +mrwiki: renaming 16761 (1,'विकिपीडिया:संपर्क') to (1,'Broken/\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\x3a\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x95') |
| 314 | +mrwiki: renaming 16967 (1,'विकिपीडिया:साचे') to (1,'Broken/\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\x3a\xe0\xa4\xb8\xe0\xa4\xbe\xe0\xa4\x9a\xe0\xa5\x87') |
| 315 | +mrwiki: renaming 17216 (1,'विकिपीडिया:कौल') to (1,'Broken/\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\x3a\xe0\xa4\x95\xe0\xa5\x8c\xe0\xa4\xb2') |
| 316 | +mrwiki: renaming 17405 (1,'सदस्य:Vyzasatya') to (1,'Broken/\xe0\xa4\xb8\xe0\xa4\xa6\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xaf\x3aVyzasatya') |
| 317 | +mrwiki: renaming 25129 (1,'विकिपीडिया:मदतकेंद्र') to (1,'Broken/\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaa\xe0\xa5\x80\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\x3a\xe0\xa4\xae\xe0\xa4\xa6\xe0\xa4\xa4\xe0\xa4\x95\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xa6\xe0\xa5\x8d\xe0\xa4\xb0') |
| 318 | +mrwiki: renaming 39210 (1,'विकिपीडिया:कौल/जुने_कौल_१') to (1,'Broken/id:39210') |
| 319 | +mrwiki: renaming 55807 (1,'विकिपीडिया:शीर्षकलेखन_संकेत') to (1,'Broken/id:55807') |
| 320 | +mrwiki: renaming 57841 (1,'सहाय्य:सहाय्य_पृष्ठ') to (1,'Broken/\xe0\xa4\xb8\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\xaf\xe0\xa5\x8d\xe0\xa4\xaf\x3a\xe0\xa4\xb8\xe0\xa4\xb9\xe0\xa4\xbe\xe0\xa4\xaf\xe0\xa5\x8d\xe0\xa4\xaf_\xe0\xa4\xaa\xe0\xa5\x83\xe0\xa4\xb7\xe0\xa5\x8d\xe0\xa4\xa0') |
| 321 | +mrwiktionary: renaming 3201 (0,'विक्शनरी :मदतकेंद्र') to (0,'Broken/विक्शनरी_:मदतकेंद्र') |
| 322 | +mywiki: renaming 1648 (0,'စစ်မှန်သောယေရှုဘုရား၏အသင်းတော်') to (0,'Broken/စစ်မှန်သော_ယေရှုဘုရား၏အသင်းတော်') |
| 323 | +mywiktionary: renaming 1961 (0,'ဗဟိုစာမျက်နှာ') to (0,'Broken/ဗ_ဟို_စာ_မျက်_နှာ') |
| 324 | +napwiki: renaming 6591 (1,'Ajùto:Cosa_mettere_su_Wikipedia') to (1,'Broken/Aj\xc3\xb9to\x3aCosa_mettere_su_Wikipedia') |
| 325 | +napwiki: renaming 18062 (1,'Ajùto:Convenzioni') to (1,'Broken/Aj\xc3\xb9to\x3aConvenzioni') |
| 326 | +newwiki: renaming 4905 (1,'विकिपिडिया:दुतावास') to (1,'Broken/\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbf\xe0\xa4\xaa\xe0\xa4\xbf\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe\x3a\xe0\xa4\xa6\xe0\xa5\x81\xe0\xa4\xa4\xe0\xa4\xbe\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb8') |
| 327 | +newwiki: renaming 12182 (1,'विकिपिडिया:_देवनागरी_टेम्प्लेट_परियोजना') to (1,'Broken/id:12182') |
| 328 | +nlwiki: renaming 1106678 (1,'Portaal:Oudheid/werkplaats/Romeinse_religie') to (1,'Broken/Portaal\x3aOudheid/werkplaats/Romeinse_religie') |
| 329 | +nlwikibooks: renaming 5424 (1,'Transwiki:Mangochutney') to (1,'Broken/Transwiki\x3aMangochutney') |
| 330 | +nlwikibooks: renaming 5428 (1,'Transwiki:Boerenjongens') to (1,'Broken/Transwiki\x3aBoerenjongens') |
| 331 | +nlwikibooks: renaming 6369 (1,'Wikijunior:Natuurkunde/Zwaartekracht') to (1,'Broken/Wikijunior\x3aNatuurkunde/Zwaartekracht') |
| 332 | +nlwikibooks: renaming 6465 (1,'Wikijunior:Zonnestelsel/Pluto') to (1,'Broken/Wikijunior\x3aZonnestelsel/Pluto') |
| 333 | +nlwikibooks: renaming 6504 (1,'Wikijunior:Zonnestelsel/Zon') to (1,'Broken/Wikijunior\x3aZonnestelsel/Zon') |
| 334 | +nlwikibooks: renaming 6605 (1,'Wikijunior:Zonnestelsel/Mercurius') to (1,'Broken/Wikijunior\x3aZonnestelsel/Mercurius') |
| 335 | +nlwikibooks: renaming 6708 (1,'Wikijunior:Natuurkunde/Beweging') to (1,'Broken/Wikijunior\x3aNatuurkunde/Beweging') |
| 336 | +nlwikibooks: renaming 6843 (1,'Wikijunior:Zonnestelsel/Zonnestelsel') to (1,'Broken/Wikijunior\x3aZonnestelsel/Zonnestelsel') |
| 337 | +nlwikibooks: renaming 6859 (1,'Wikijunior:Zonnestelsel/Venus') to (1,'Broken/Wikijunior\x3aZonnestelsel/Venus') |
| 338 | +nlwikibooks: renaming 6883 (1,'Wikijunior:Natuurkunde/Inleiding') to (1,'Broken/Wikijunior\x3aNatuurkunde/Inleiding') |
| 339 | +nlwikibooks: renaming 7091 (1,'Wikijunior:Bus_en_trein/Toets_trein_NL') to (1,'Broken/Wikijunior\x3aBus_en_trein/Toets_trein_NL') |
| 340 | +nlwikibooks: renaming 7455 (1,'Wikijunior:Zonnestelsel/Aarde') to (1,'Broken/Wikijunior\x3aZonnestelsel/Aarde') |
| 341 | +nlwikibooks: renaming 7456 (1,'Wikijunior:Zonnestelsel/Mars') to (1,'Broken/Wikijunior\x3aZonnestelsel/Mars') |
| 342 | +nlwikibooks: renaming 7457 (1,'Wikijunior:Zonnestelsel/Jupiter') to (1,'Broken/Wikijunior\x3aZonnestelsel/Jupiter') |
| 343 | +nlwikibooks: renaming 7458 (1,'Wikijunior:Zonnestelsel/Uranus') to (1,'Broken/Wikijunior\x3aZonnestelsel/Uranus') |
| 344 | +nlwikibooks: renaming 7522 (1,'Wikijunior:Natuurkunde/Stoffen_en_hun_eigenschappen') to (1,'Broken/Wikijunior\x3aNatuurkunde/Stoffen_en_hun_eigenschappen') |
| 345 | +nlwikibooks: renaming 7803 (1,'Wikijunior:Zonnestelsel/Kometen') to (1,'Broken/Wikijunior\x3aZonnestelsel/Kometen') |
| 346 | +nlwikibooks: renaming 8353 (1,'Wikijunior:Natuurkunde/Stoffen_vervormen') to (1,'Broken/Wikijunior\x3aNatuurkunde/Stoffen_vervormen') |
| 347 | +nlwikibooks: renaming 8368 (1,'Wikijunior:Natuurkunde/Magnetisme') to (1,'Broken/Wikijunior\x3aNatuurkunde/Magnetisme') |
| 348 | +nlwikibooks: renaming 8405 (1,'Wikijunior:Natuurkunde/Hydrauliek_en_pneumatiek') to (1,'Broken/Wikijunior\x3aNatuurkunde/Hydrauliek_en_pneumatiek') |
| 349 | +nlwikibooks: renaming 8853 (1,'Wikijunior:_Zonnestelsel/Aarde') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Aarde') |
| 350 | +nlwikibooks: renaming 8857 (1,'Wikijunior:_Zonnestelsel/Jupiter') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Jupiter') |
| 351 | +nlwikibooks: renaming 8859 (1,'Wikijunior:_Zonnestelsel/Kometen') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Kometen') |
| 352 | +nlwikibooks: renaming 8862 (1,'Wikijunior:_Zonnestelsel/Mars') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Mars') |
| 353 | +nlwikibooks: renaming 8864 (1,'Wikijunior:_Zonnestelsel/Mercurius') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Mercurius') |
| 354 | +nlwikibooks: renaming 8868 (1,'Wikijunior:_Zonnestelsel/Pluto') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Pluto') |
| 355 | +nlwikibooks: renaming 8872 (1,'Wikijunior:_Zonnestelsel/Uranus') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Uranus') |
| 356 | +nlwikibooks: renaming 8874 (1,'Wikijunior:_Zonnestelsel/Venus') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Venus') |
| 357 | +nlwikibooks: renaming 8876 (1,'Wikijunior:_Zonnestelsel/Zon') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Zon') |
| 358 | +nlwikibooks: renaming 8878 (1,'Wikijunior:_Zonnestelsel/Zonnestelsel') to (1,'Broken/Wikijunior\x3a_Zonnestelsel/Zonnestelsel') |
| 359 | +nlwikibooks: renaming 8899 (1,'Wikijunior:Natuurkunde/Geluid') to (1,'Broken/Wikijunior\x3aNatuurkunde/Geluid') |
| 360 | +nlwikibooks: renaming 9191 (1,'Wikijunior:Bus_en_trein/Samenvatting_trein_NL') to (1,'Broken/Wikijunior\x3aBus_en_trein/Samenvatting_trein_NL') |
| 361 | +nlwikibooks: renaming 9192 (1,'Wikijunior:Bus_en_trein/Planning,_kaartjes_en_het_toilet_NL') to (1,'Broken/Wikijunior\x3aBus_en_trein/Planning\x2c_kaartjes_en_het_toilet_NL') |
| 362 | +nlwikibooks: renaming 9200 (1,'Wikijunior:Bus_en_trein/Planning,_kaartjes_en_het_toilet') to (1,'Broken/Wikijunior\x3aBus_en_trein/Planning\x2c_kaartjes_en_het_toilet') |
| 363 | +nlwikibooks: renaming 9202 (1,'Wikijunior:Bus_en_trein/Samenvatting_trein') to (1,'Broken/Wikijunior\x3aBus_en_trein/Samenvatting_trein') |
| 364 | +nlwikibooks: renaming 9204 (1,'Wikijunior:Bus_en_trein/Toets_trein') to (1,'Broken/Wikijunior\x3aBus_en_trein/Toets_trein') |
| 365 | +nlwikibooks: renaming 9712 (1,'Wikijunior:Verkeer/Voorrang') to (1,'Broken/Wikijunior\x3aVerkeer/Voorrang') |
| 366 | +nlwikibooks: renaming 9734 (1,'Wikijunior:Kriebelbeestjes/Lieveheersbeestje') to (1,'Broken/Wikijunior\x3aKriebelbeestjes/Lieveheersbeestje') |
| 367 | +nlwikibooks: renaming 9918 (1,'Wikijunior:Kriebelbeestjes/Lieveheersbeestje_extra') to (1,'Broken/Wikijunior\x3aKriebelbeestjes/Lieveheersbeestje_extra') |
| 368 | +nlwikibooks: renaming 10158 (1,'Wikijunior:Computerzaken/Word') to (1,'Broken/Wikijunior\x3aComputerzaken/Word') |
| 369 | +nlwikibooks: renaming 10205 (1,'Wikijunior:Computerzaken/Hardware') to (1,'Broken/Wikijunior\x3aComputerzaken/Hardware') |
| 370 | +nlwikibooks: renaming 10206 (1,'Wikijunior:Computerzaken/Windows') to (1,'Broken/Wikijunior\x3aComputerzaken/Windows') |
| 371 | +nlwikibooks: renaming 10207 (1,'Wikijunior:Computerzaken/Internet') to (1,'Broken/Wikijunior\x3aComputerzaken/Internet') |
| 372 | +nlwikibooks: renaming 10208 (1,'Wikijunior:Computerzaken/Excel') to (1,'Broken/Wikijunior\x3aComputerzaken/Excel') |
| 373 | +nlwikibooks: renaming 10209 (1,'Wikijunior:Computerzaken/Paint_en_Powerpoint') to (1,'Broken/Wikijunior\x3aComputerzaken/Paint_en_Powerpoint') |
| 374 | +nlwikibooks: renaming 10210 (1,'Wikijunior:Computerzaken/Access') to (1,'Broken/Wikijunior\x3aComputerzaken/Access') |
| 375 | +nlwikibooks: renaming 10211 (1,'Wikijunior:Computerzaken/Einde') to (1,'Broken/Wikijunior\x3aComputerzaken/Einde') |
| 376 | +nlwikibooks: renaming 10330 (1,'Wikijunior:Techniek/Technisch_tekenen') to (1,'Broken/Wikijunior\x3aTechniek/Technisch_tekenen') |
| 377 | +nlwikimedia: renaming 93 (1,'Wikimedia:Amarant-lounge') to (1,'Broken/Wikimedia\x3aAmarant-lounge') |
| 378 | +nlwikimedia: renaming 193 (1,'Wikimedia:Wikimedianen_naar_project') to (1,'Broken/Wikimedia\x3aWikimedianen_naar_project') |
| 379 | +nlwikimedia: renaming 291 (1,'Nl:Wikipedia:Kennisnet20050202Nl') to (1,'Broken/id:291') |
| 380 | +nlwiktionary: renaming 1738 (1,'WikiWoordenboek:Overzicht_beheerpagina's') to (1,'Broken/WikiWoordenboek\x3aOverzicht_beheerpagina\x27s') |
| 381 | +nlwiktionary: renaming 29422 (1,'Wiktionary:Babel_lijst') to (1,'Broken/Wiktionary\x3aBabel_lijst') |
| 382 | +nowiki: renaming 9723 (1,'Wikipedia-diskusjon:Administratorer') to (1,'Broken/Wikipedia-diskusjon\x3aAdministratorer') |
| 383 | +nowiki: renaming 10064 (1,'MediaWiki-diskusjon:Objektivitet') to (1,'Broken/MediaWiki-diskusjon\x3aObjektivitet') |
| 384 | +nowiki: renaming 70251 (1,'Wikipedia:Pressemelding') to (1,'Broken/Wikipedia\x3aPressemelding') |
| 385 | +nowiki: renaming 83494 (1,'Portal:Harry_Potter') to (1,'Broken/Portal\x3aHarry_Potter') |
| 386 | +nowiki: renaming 256699 (1,'Spesial:Random') to (1,'Broken/Spesial\x3aRandom') |
| 387 | +nowikiquote: renaming 1419 (1,'Wikiquote:Dagens_sitat/Juni_2005') to (1,'Broken/Wikiquote\x3aDagens_sitat/Juni_2005') |
| 388 | +nowiktionary: renaming 27530 (1,'Tillegg:Sterke_verb_i_norsk') to (1,'Broken/Tillegg\x3aSterke_verb_i_norsk') |
| 389 | +nowiktionary: renaming 29977 (1,'Tillegg:Portal') to (1,'Broken/Tillegg\x3aPortal') |
| 390 | +ocwiki: renaming 12876 (1,'Wikipèdia:Presa_de_decision/Nom_del_projècte_Wikipèdia_bis') to (1,'Broken/Wikip\xc3\xa8dia\x3aPresa_de_decision/Nom_del_proj\xc3\xa8cte_Wikip\xc3\xa8dia_bis') |
| 391 | +ocwiki: renaming 13293 (1,'Wikipèdia:Vandalisme') to (1,'Broken/Wikip\xc3\xa8dia\x3aVandalisme') |
| 392 | +ocwiki: renaming 17183 (1,'Portal:Cinèma') to (1,'Broken/Portal\x3aCin\xc3\xa8ma') |
| 393 | +ocwiki: renaming 26000 (1,'Portal:Preïstòria') to (1,'Broken/Portal\x3aPre\xc3\xafst\xc3\xb2ria') |
| 394 | +ocwiki: renaming 30986 (1,'Portal:Aragon') to (1,'Broken/Portal\x3aAragon') |
| 395 | +oswiki: renaming 10225 (1,'Википеди:Хъазуатон_куыст') to (1,'Broken/\xd0\x92\xd0\xb8\xd0\xba\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xb4\xd0\xb8\x3a\xd0\xa5\xd1\x8a\xd0\xb0\xd0\xb7\xd1\x83\xd0\xb0\xd1\x82\xd0\xbe\xd0\xbd_\xd0\xba\xd1\x83\xd1\x8b\xd1\x81\xd1\x82') |
| 396 | +oswiki: renaming 10261 (1,'Википеди:Æххуыс') to (1,'Broken/\xd0\x92\xd0\xb8\xd0\xba\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xb4\xd0\xb8\x3a\xc3\x86\xd1\x85\xd1\x85\xd1\x83\xd1\x8b\xd1\x81') |
| 397 | +pswiki: renaming 6272 (1,'ويکيپېډيا:د_نابشپړه_ليکنو_موندنه_او_سمون') to (1,'Broken/id:6272') |
| 398 | +rowiki: renaming 54302 (1,'Portal:Economie') to (1,'Broken/Portal\x3aEconomie') |
| 399 | +rowiki: renaming 162877 (1,'Format:Revoluţionari_români_la_1848') to (1,'Broken/Format\x3aRevolu\xc5\xa3ionari_rom\xc3\xa2ni_la_1848') |
| 400 | +rowiki: renaming 371048 (1,'Categorie:Companii_belgiene') to (1,'Broken/Categorie\x3aCompanii_belgiene') |
| 401 | +rowiki: renaming 371052 (1,'Imagine:Banca_de_la_primarie.JPG') to (1,'Broken/Imagine\x3aBanca_de_la_primarie\x2eJPG') |
| 402 | +rowiki: renaming 371075 (1,'Imagine:Sibiuphoto.jpg') to (1,'Broken/Imagine\x3aSibiuphoto\x2ejpg') |
| 403 | +rowikibooks: renaming 2203 (1,'Carte_de_bucate:Mititei_-_Carul_cu_Bere') to (1,'Broken/Carte_de_bucate\x3aMititei_-_Carul_cu_Bere') |
| 404 | +rowikibooks: renaming 2722 (1,'Wikijunior:Alfabetul_animal/Y') to (1,'Broken/Wikijunior\x3aAlfabetul_animal/Y') |
| 405 | +rowikibooks: renaming 2820 (1,'Carte_de_bucate:Piftie_de_porc') to (1,'Broken/Carte_de_bucate\x3aPiftie_de_porc') |
| 406 | +rowiktionary: renaming 1068 (1,'Wikţionar:Despre') to (1,'Broken/Wik\xc5\xa3ionar\x3aDespre') |
| 407 | +rowiktionary: renaming 1094 (1,'Wikţionar:Bun_venit') to (1,'Broken/Wik\xc5\xa3ionar\x3aBun_venit') |
| 408 | +ruwikinews: renaming 6476 (0,'ВН:IRC') to (0,'Broken/IRC') |
| 409 | +ruwikinews: renaming 6780 (0,'ВН:ВН') to (0,'Broken/ВН') |
| 410 | +scnwiktionary: renaming 7318 (1,'Wikizziunariu:Grammàtica') to (1,'Broken/Wikizziunariu\x3aGramm\xc3\xa0tica') |
| 411 | +scnwiktionary: renaming 7319 (1,'Wikizziunariu:Binvinutu') to (1,'Broken/Wikizziunariu\x3aBinvinutu') |
| 412 | +shwiki: renaming 5574 (0,'Šablon:Babel-2') to (0,'Broken/Babel-2') |
| 413 | +shwiki: renaming 13990 (0,'Kategorija:Francuski_fizičari') to (0,'Broken/Francuski_fizičari') |
| 414 | +shwiki: renaming 15703 (0,'Šablon:Filozofija-navigacija') to (0,'Broken/Filozofija-navigacija') |
| 415 | +shwiki: renaming 35524 (0,'Korisnik:_Pinki') to (0,'Broken/Pinki') |
| 416 | +shwiki: renaming 45988 (0,'Kategorija:Psihijatrija') to (0,'Broken/Psihijatrija') |
| 417 | +shwiki: renaming 54595 (0,'Šablon:Registarske_oznake_motornih_vozila_evropa') to (0,'Broken/Registarske_oznake_motornih_vozila_evropa') |
| 418 | +slwiki: renaming 104081 (1,'Portal:Pomoč') to (1,'Broken/Portal\x3aPomo\xc4\x8d') |
| 419 | +slwiki: renaming 119299 (1,'Portal:Novice') to (1,'Broken/Portal\x3aNovice') |
| 420 | +slwiki: renaming 165149 (1,'Portal:Vojaštvo') to (1,'Broken/Portal\x3aVoja\xc5\xa1tvo') |
| 421 | +slwiki: renaming 218171 (0,'Junior_Car_Club_200 mile_race') to (0,'Broken/Junior_Car_Club_200_mile_race') |
| 422 | +sqwiki: renaming 23359 (1,'Category:Istog:Foto') to (1,'Broken/Category\x3aIstog\x3aFoto') |
| 423 | +sqwiki: renaming 23977 (1,'Category:Ferizaj:Foto') to (1,'Broken/Category\x3aFerizaj\x3aFoto') |
| 424 | +sqwiki: renaming 23979 (1,'Figura:1024_3235323664306561.jpg.jpg') to (1,'Broken/Figura\x3a1024_3235323664306561\x2ejpg\x2ejpg') |
| 425 | +sqwiki: renaming 23980 (1,'Category:Coat_of_arms_-_Figura') to (1,'Broken/Category\x3aCoat_of_arms_-_Figura') |
| 426 | +srwiki: renaming 23937 (1,'Категорија:Жанр:Поезија') to (1,'Broken/\xd0\x9a\xd0\xb0\xd1\x82\xd0\xb5\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd1\x98\xd0\xb0\x3a\xd0\x96\xd0\xb0\xd0\xbd\xd1\x80\x3a\xd0\x9f\xd0\xbe\xd0\xb5\xd0\xb7\xd0\xb8\xd1\x98\xd0\xb0') |
| 427 | +srwiki: renaming 144847 (1,'Википедија:Уживо/недеља,_4._март_2007.') to (1,'Broken/\xd0\x92\xd0\xb8\xd0\xba\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x98\xd0\xb0\x3a\xd0\xa3\xd0\xb6\xd0\xb8\xd0\xb2\xd0\xbe/\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd1\x99\xd0\xb0\x2c_4\x2e_\xd0\xbc\xd0\xb0\xd1\x80\xd1\x82_2007\x2e') |
| 428 | +svwiki: renaming 632200 (1,'Användare:E.G./Mall:Användare_moderat') to (1,'Broken/Anv\xc3\xa4ndare\x3aE\x2eG\x2e/Mall\x3aAnv\xc3\xa4ndare_moderat') |
| 429 | +svwiktionary: renaming 21880 (1,'WT:SÄ') to (1,'Broken/WT\x3aS\xc3\x84') |
| 430 | +tawiki: renaming 42815 (1,'விக்கிப்பீடியா:பங்களிப்பாளர்_கவனத்திற்கு') to (1,'Broken/id:42815') |
| 431 | +tawiki: renaming 43274 (1,'விக்கிப்பீடியா:தொகுத்தல்') to (1,'Broken/id:43274') |
| 432 | +tawiki: renaming 44471 (1,'விக்கிப்பீடியா:ஆலமரத்தடி') to (1,'Broken/id:44471') |
| 433 | +tawiki: renaming 44804 (1,'விக்கிப்பீடியா:சமுதாய_வலைவாசல்') to (1,'Broken/id:44804') |
| 434 | +tawiki: renaming 47869 (1,'வலைவாசல்:கணிதம்') to (1,'Broken/\xe0\xae\xb5\xe0\xae\xb2\xe0\xaf\x88\xe0\xae\xb5\xe0\xae\xbe\xe0\xae\x9a\xe0\xae\xb2\xe0\xaf\x8d\x3a\xe0\xae\x95\xe0\xae\xa3\xe0\xae\xbf\xe0\xae\xa4\xe0\xae\xae\xe0\xaf\x8d') |
| 435 | +tewiki: renaming 73590 (1,'వేదిక:భారతదేశం') to (1,'Broken/\xe0\xb0\xb5\xe0\xb1\x87\xe0\xb0\xa6\xe0\xb0\xbf\xe0\xb0\x95\x3a\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4\xe0\xb0\xa6\xe0\xb1\x87\xe0\xb0\xb6\xe0\xb0\x82') |
| 436 | +thwiki: renaming 27886 (0,'พันศักดิ์_วิญญรัตน์') to (0,'Broken/พันศักดิ์_วิญญรัตน์') |
| 437 | +thwiki: renaming 40086 (0,'ค.ศ._1150') to (0,'Broken/ค.ศ._1150') |
| 438 | +thwiki: renaming 44388 (0,'ค.ศ.1147') to (0,'Broken/ค.ศ._1147') |
| 439 | +thwiki: renaming 108711 (1,'สถานีย่อย:ภาษา/ที่เก็บบทความยอดเยี่ยม') to (1,'Broken/id:108711') |
| 440 | +thwiki: renaming 110178 (0,'การปฏิวัติรัสเซีย_ค.ศ._1905') to (0,'Broken/การปฏิวัติรัสเซีย_ค.ศ._1905') |
| 441 | +thwiki: renaming 127400 (1,'สถานีย่อย:ประวัติศาสตร์/ที่เสนอภาพดีเด่น') to (1,'Broken/id:127400') |
| 442 | +thwiki: renaming 128804 (1,'สถานีย่อย:ประวัติศาสตร์') to (1,'Broken/id:128804') |
| 443 | +thwiki: renaming 206131 (1,'ไฟล์:อุโบสถวัดหมอนไม้.JPG') to (1,'Broken/id:206131') |
| 444 | +thwiki: renaming 244394 (0,'โกเอฟาซีโอเอตูอิโอเอโอตูตองกา') to (0,'Broken/โกเอฟาซี_โอเอตูอิ_โอเอโอตูตองกา') |
| 445 | +thwikibooks: renaming 2959 (0,'การปฏิรูปหลักสูตรการศึกษาของประเทศนอร์เวย์ปี_2006') to (0,'Broken/การปฏิรูปหลักสูตรการศึกษาของประ_เทศนอร์_เวย์ปี_2006') |
| 446 | +thwiktionary: renaming 10041 (0,'ខ្មែរ') to (0,'Broken/ខ្មែរ') |
| 447 | +trwiki: renaming 7833 (1,'Vikipedi:Engelleme_poliçesi') to (1,'Broken/Vikipedi\x3aEngelleme_poli\xc3\xa7esi') |
| 448 | +trwiki: renaming 12384 (1,'Vikipedi:Web_Siteleri') to (1,'Broken/Vikipedi\x3aWeb_Siteleri') |
| 449 | +trwiki: renaming 12852 (1,'Wikipedia:Makale_istekleri') to (1,'Broken/Wikipedia\x3aMakale_istekleri') |
| 450 | +trwiki: renaming 157957 (1,'Wikipedia:CommonsTicker') to (1,'Broken/Wikipedia\x3aCommonsTicker') |
| 451 | +ttwiki: renaming 9411 (0,'Шаблон:PressLink') to (0,'Broken/PressLink') |
| 452 | +ttwiki: renaming 11007 (0,'Үрнәк:Тел') to (0,'Broken/Тел') |
| 453 | +ttwiki: renaming 13299 (0,'Үрнәк:Мәкалә_төпчеге') to (0,'Broken/Мәкалә_төпчеге') |
| 454 | +ttwiki: renaming 13651 (0,'Ярдәм:Үзгәртү') to (0,'Broken/Үзгәртү') |
| 455 | +ukwiki: renaming 28045 (1,'Вікіпедія:Перші_в_Гуглі') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x9f\xd0\xb5\xd1\x80\xd1\x88\xd1\x96_\xd0\xb2_\xd0\x93\xd1\x83\xd0\xb3\xd0\xbb\xd1\x96') |
| 456 | +ukwiki: renaming 29169 (1,'Вікіпедія:Жодних_ориґінальних_досліджень') to (1,'Broken/id:29169') |
| 457 | +ukwiki: renaming 30188 (1,'Вікіпедія:Найактивніші') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x9d\xd0\xb0\xd0\xb9\xd0\xb0\xd0\xba\xd1\x82\xd0\xb8\xd0\xb2\xd0\xbd\xd1\x96\xd1\x88\xd1\x96') |
| 458 | +ukwiki: renaming 32887 (1,'Користувач:Ліна') to (1,'Broken/\xd0\x9a\xd0\xbe\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd1\x83\xd0\xb2\xd0\xb0\xd1\x87\x3a\xd0\x9b\xd1\x96\xd0\xbd\xd0\xb0') |
| 459 | +ukwiki: renaming 32888 (1,'Користувач:Comanche') to (1,'Broken/\xd0\x9a\xd0\xbe\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd1\x83\xd0\xb2\xd0\xb0\xd1\x87\x3aComanche') |
| 460 | +ukwiki: renaming 33871 (1,'Вікіпедія:Шаблони:Незавершені_статті') to (1,'Broken/id:33871') |
| 461 | +ukwiki: renaming 35643 (1,'Вікіпедія:Шаблони/Навігаційні/Персоналії') to (1,'Broken/id:35643') |
| 462 | +ukwiki: renaming 37593 (1,'Вікіпедія:Посилання_на_джерела') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x9f\xd0\xbe\xd1\x81\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8f_\xd0\xbd\xd0\xb0_\xd0\xb4\xd0\xb6\xd0\xb5\xd1\x80\xd0\xb5\xd0\xbb\xd0\xb0') |
| 463 | +ukwiki: renaming 37705 (1,'Вікіпедія:Зовнішні_посилання') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x97\xd0\xbe\xd0\xb2\xd0\xbd\xd1\x96\xd1\x88\xd0\xbd\xd1\x96_\xd0\xbf\xd0\xbe\xd1\x81\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8f') |
| 464 | +ukwiki: renaming 40082 (1,'Вікіпедія:Іменування_статей') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x86\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x83\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8f_\xd1\x81\xd1\x82\xd0\xb0\xd1\x82\xd0\xb5\xd0\xb9') |
| 465 | +ukwiki: renaming 43937 (1,'Вікіпедія:Жодних_оригінальних_досліджень') to (1,'Broken/id:43937') |
| 466 | +ukwiki: renaming 83949 (1,'Вікіпедія:УРЕ/Том_1/АЛЮМІНІЙОВІ_СПЛАВИ_-_АНГЛІЙСЬКА_МОВА') to (1,'Broken/id:83949') |
| 467 | +ukwiki: renaming 104038 (1,'Вікіпедія:Проект:Добрі_статті') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\x9f\xd1\x80\xd0\xbe\xd0\xb5\xd0\xba\xd1\x82\x3a\xd0\x94\xd0\xbe\xd0\xb1\xd1\x80\xd1\x96_\xd1\x81\xd1\x82\xd0\xb0\xd1\x82\xd1\x82\xd1\x96') |
| 468 | +ukwiki: renaming 104928 (1,'Вікіпедія:Дотримання_мовних_стандартів') to (1,'Broken/id:104928') |
| 469 | +ukwiki: renaming 122011 (1,'Портал:Біологія') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x91\xd1\x96\xd0\xbe\xd0\xbb\xd0\xbe\xd0\xb3\xd1\x96\xd1\x8f') |
| 470 | +ukwiki: renaming 122906 (1,'Вікіпедія:Проект:Цей_день_в_історії/2007/26_лютого') to (1,'Broken/id:122906') |
| 471 | +ukwiki: renaming 125456 (1,'Портал:Біологія/Вибрана_стаття/Кандидати') to (1,'Broken/id:125456') |
| 472 | +ukwiki: renaming 162730 (1,'Портал:Мистецтво') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x9c\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd1\x86\xd1\x82\xd0\xb2\xd0\xbe') |
| 473 | +ukwiki: renaming 170541 (1,'Портал:Румунія_і_Молдавія') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\xa0\xd1\x83\xd0\xbc\xd1\x83\xd0\xbd\xd1\x96\xd1\x8f_\xd1\x96_\xd0\x9c\xd0\xbe\xd0\xbb\xd0\xb4\xd0\xb0\xd0\xb2\xd1\x96\xd1\x8f') |
| 474 | +ukwiki: renaming 171447 (1,'Портал:Пластунство') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x9f\xd0\xbb\xd0\xb0\xd1\x81\xd1\x82\xd1\x83\xd0\xbd\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe') |
| 475 | +ukwiki: renaming 195086 (1,'Портал:Спорт/Головні_футбольні_переходи_міжсезоння_(літо_2007)') to (1,'Broken/id:195086') |
| 476 | +ukwiki: renaming 211292 (1,'Портал:Японія') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\xaf\xd0\xbf\xd0\xbe\xd0\xbd\xd1\x96\xd1\x8f') |
| 477 | +ukwiki: renaming 239140 (1,'Вікіпедія:Проект:Український_футбол') to (1,'Broken/id:239140') |
| 478 | +ukwiki: renaming 332806 (1,'Портал:Історія') to (1,'Broken/\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb\x3a\xd0\x86\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd1\x96\xd1\x8f') |
| 479 | +ukwiki: renaming 336054 (1,'Обговорення_користувача:Leon_II/ілюстрування_гірництва_(17.12.2006—06.01.2007)') to (1,'Broken/id:336054') |
| 480 | +ukwiki: renaming 341563 (1,'Вікіпедія:Проект:Тематичне_поповнення/Індекс:Гірнича_справа') to (1,'Broken/id:341563') |
| 481 | +ukwiki: renaming 341564 (1,'Вікіпедія:Шаблони/Джерела') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd0\xbf\xd0\xb5\xd0\xb4\xd1\x96\xd1\x8f\x3a\xd0\xa8\xd0\xb0\xd0\xb1\xd0\xbb\xd0\xbe\xd0\xbd\xd0\xb8/\xd0\x94\xd0\xb6\xd0\xb5\xd1\x80\xd0\xb5\xd0\xbb\xd0\xb0') |
| 482 | +ukwikiquote: renaming 1488 (0,'Вікіцитати:Портал_спільноти') to (0,'Broken/Портал_спільноти') |
| 483 | +ukwikiquote: renaming 1492 (1,'Вікіцитати:Портал_спільноти') to (1,'Broken/\xd0\x92\xd1\x96\xd0\xba\xd1\x96\xd1\x86\xd0\xb8\xd1\x82\xd0\xb0\xd1\x82\xd0\xb8\x3a\xd0\x9f\xd0\xbe\xd1\x80\xd1\x82\xd0\xb0\xd0\xbb_\xd1\x81\xd0\xbf\xd1\x96\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xbe\xd1\x82\xd0\xb8') |
| 484 | +ukwikiquote: renaming 2725 (0,'Вікіцитати:Адміністратори') to (0,'Broken/Адміністратори') |
| 485 | +ukwikiquote: renaming 3001 (0,'Вікіцитати:Про_Вікіцитати') to (0,'Broken/Про_Вікіцитати') |
| 486 | +ukwikiquote: renaming 3032 (0,'Вікіцитати:Поточні_події') to (0,'Broken/Поточні_події') |
| 487 | +ukwikiquote: renaming 3062 (0,'Вікіцитати:Запити_до_адміністраторів') to (0,'Broken/Запити_до_адміністраторів') |
| 488 | +ukwikiquote: renaming 3513 (0,'Вікіцитати:Бюрократи') to (0,'Broken/Бюрократи') |
| 489 | +ukwikiquote: renaming 3580 (0,'Вікіцитати:Кнайпа') to (0,'Broken/Кнайпа') |
| 490 | +urwiki: renaming 5982 (1,'معاونت:اردو_فونٹ_انسٹالیشن') to (1,'Broken/\xd9\x85\xd8\xb9\xd8\xa7\xd9\x88\xd9\x86\xd8\xaa\x3a\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88_\xd9\x81\xd9\x88\xd9\x86\xd9\xb9_\xd8\xa7\xd9\x86\xd8\xb3\xd9\xb9\xd8\xa7\xd9\x84\xdb\x8c\xd8\xb4\xd9\x86') |
| 491 | +uzwiki: renaming 13698 (1,'Vikipediya:_Jamoa_Portali') to (1,'Broken/Vikipediya\x3a_Jamoa_Portali') |
| 492 | +uzwiki: renaming 13707 (1,'Vikipediya:Forum') to (1,'Broken/Vikipediya\x3aForum') |
| 493 | +uzwiki: renaming 13749 (1,'Vikipediya:_Forum') to (1,'Broken/Vikipediya\x3a_Forum') |
| 494 | +uzwiki: renaming 18743 (1,'Kategoriya:Ingliz_shoirlari') to (1,'Broken/Kategoriya\x3aIngliz_shoirlari') |
| 495 | +viwiki: renaming 13644 (1,'Chủ_đề:Vật_lý') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aV\xe1\xba\xadt_l\xc3\xbd') |
| 496 | +viwiki: renaming 15445 (1,'Chủ_đề:Phật_giáo') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aPh\xe1\xba\xadt_gi\xc3\xa1o') |
| 497 | +viwiki: renaming 36480 (1,'Chủ_đề:Văn_minh_La_Mã_và_Hy_Lạp_cổ_đại') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aV\xc4\x83n_minh_La_M\xc3\xa3_v\xc3\xa0_Hy_L\xe1\xba\xa1p_c\xe1\xbb\x95_\xc4\x91\xe1\xba\xa1i') |
| 498 | +viwiki: renaming 63364 (1,'Chủ_đề:Thiên_văn_học') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aThi\xc3\xaan_v\xc4\x83n_h\xe1\xbb\x8dc') |
| 499 | +viwiki: renaming 73833 (1,'Chủ_đề:Triết_học') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aTri\xe1\xba\xbft_h\xe1\xbb\x8dc') |
| 500 | +viwiki: renaming 90158 (1,'Chủ_đề:Sinh_học') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aSinh_h\xe1\xbb\x8dc') |
| 501 | +viwiki: renaming 90601 (1,'Chủ_đề:Việt_Nam') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aVi\xe1\xbb\x87t_Nam') |
| 502 | +viwiki: renaming 100277 (1,'Chủ_đề:Hóa_học') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aH\xc3\xb3a_h\xe1\xbb\x8dc') |
| 503 | +viwiki: renaming 102689 (1,'Chủ_đề:Địa_lý') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3a\xc4\x90\xe1\xbb\x8ba_l\xc3\xbd') |
| 504 | +viwiki: renaming 120020 (1,'Chủ_đề:Hướng_đạo') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aH\xc6\xb0\xe1\xbb\x9bng_\xc4\x91\xe1\xba\xa1o') |
| 505 | +viwiki: renaming 127624 (1,'Chủ_đề:Cơ_Đốc_giáo') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aC\xc6\xa1_\xc4\x90\xe1\xbb\x91c_gi\xc3\xa1o') |
| 506 | +viwiki: renaming 239639 (1,'Chủ_đề:Nhật_Bản/to_do') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aNh\xe1\xba\xadt_B\xe1\xba\xa3n/to_do') |
| 507 | +viwiki: renaming 269260 (1,'Chủ_đề:Computer') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aComputer') |
| 508 | +viwiki: renaming 269261 (1,'Chủ_đề:Máy_tính') to (1,'Broken/Ch\xe1\xbb\xa7_\xc4\x91\xe1\xbb\x81\x3aM\xc3\xa1y_t\xc3\xadnh') |
| 509 | +viwiki: renaming 272823 (0,'Quyền Anh_tại_Thế_vận_hội_Mùa_hè_2008') to (0,'Broken/Quyền_Anh_tại_Thế_vận_hội_Mùa_hè_2008') |
| 510 | +viwiki: renaming 320027 (1,'Wikipedia:Dự_án_Disney') to (1,'Broken/Wikipedia\x3aD\xe1\xbb\xb1_\xc3\xa1n_Disney') |
| 511 | +yiwiki: renaming 9103 (1,'באניצער:יואלי') to (1,'Broken/\xd7\x91\xd7\x90\xd7\xa0\xd7\x99\xd7\xa6\xd7\xa2\xd7\xa8\x3a\xd7\x99\xd7\x95\xd7\x90\xd7\x9c\xd7\x99') |
| 512 | +yiwiki: renaming 10947 (1,'פארטאל:יידישקייט') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x99\xd7\x99\xd7\x93\xd7\x99\xd7\xa9\xd7\xa7\xd7\x99\xd7\x99\xd7\x98') |
| 513 | +yiwiki: renaming 15387 (1,'פארטאל:נייעס') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\xa0\xd7\x99\xd7\x99\xd7\xa2\xd7\xa1') |
| 514 | +yiwiki: renaming 16819 (1,'פארטאל:אקטועלע_ארטיקלן') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x90\xd7\xa7\xd7\x98\xd7\x95\xd7\xa2\xd7\x9c\xd7\xa2_\xd7\x90\xd7\xa8\xd7\x98\xd7\x99\xd7\xa7\xd7\x9c\xd7\x9f') |
| 515 | +yiwiki: renaming 18375 (1,'פארטאל:אקטועלע_געשענישן') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x90\xd7\xa7\xd7\x98\xd7\x95\xd7\xa2\xd7\x9c\xd7\xa2_\xd7\x92\xd7\xa2\xd7\xa9\xd7\xa2\xd7\xa0\xd7\x99\xd7\xa9\xd7\x9f') |
| 516 | +yiwiki: renaming 18386 (1,'פארטאל:תורה') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\xaa\xd7\x95\xd7\xa8\xd7\x94') |
| 517 | +yiwiki: renaming 18505 (1,'פארטאל:ארטאדאקס_יידנטום') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x93\xd7\x90\xd7\xa7\xd7\xa1_\xd7\x99\xd7\x99\xd7\x93\xd7\xa0\xd7\x98\xd7\x95\xd7\x9d') |
| 518 | +yiwiki: renaming 21236 (1,'פארטאל:אויבערשטע_ראם') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x90\xd7\x95\xd7\x99\xd7\x91\xd7\xa2\xd7\xa8\xd7\xa9\xd7\x98\xd7\xa2_\xd7\xa8\xd7\x90\xd7\x9d') |
| 519 | +yiwiki: renaming 21276 (1,'פארטאל:באזיס') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x91\xd7\x90\xd7\x96\xd7\x99\xd7\xa1') |
| 520 | +yiwiki: renaming 21326 (1,'פארטאל:חרדישע_וועלט') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x97\xd7\xa8\xd7\x93\xd7\x99\xd7\xa9\xd7\xa2_\xd7\x95\xd7\x95\xd7\xa2\xd7\x9c\xd7\x98') |
| 521 | +yiwiki: renaming 23877 (1,'פארטאל:וויסנשאפט') to (1,'Broken/\xd7\xa4\xd7\x90\xd7\xa8\xd7\x98\xd7\x90\xd7\x9c\x3a\xd7\x95\xd7\x95\xd7\x99\xd7\xa1\xd7\xa0\xd7\xa9\xd7\x90\xd7\xa4\xd7\x98') |
| 522 | +zhwiki: renaming 190270 (1,'WP:WIN') to (1,'Broken/WP\x3aWIN') |
| 523 | +zhwiki: renaming 942007 (1,'User:Kongmengxun') to (1,'Broken/User\x3aKongmengxun') |
| 524 | +zhwikibooks: renaming 13305 (0,'WB:TEMP') to (0,'Broken/TEMP') |
| 525 | +zhwikibooks: renaming 13306 (0,'WB:TMP') to (0,'Broken/TMP') |
| 526 | +zhwikibooks: renaming 13307 (0,'WB:SB') to (0,'Broken/SB') |
| 527 | +elwikiversity: renaming 146 (1,'Τμήμα:Αγγλικά') to (1,'Broken/\xce\xa4\xce\xbc\xce\xae\xce\xbc\xce\xb1\x3a\xce\x91\xce\xb3\xce\xb3\xce\xbb\xce\xb9\xce\xba\xce\xac') |
| 528 | +crhwiki: renaming 147 (1,'Vikipediya:Imlâ/TÜRKİYEDE_YAŞAĞAN_VİKİPEDİSTLER_İÇÜN') to (1,'Broken/Vikipediya\x3aIml\xc3\xa2/T\xc3\x9cRK\xc4\xb0YEDE_YA\xc5\x9eA\xc4\x9eAN_V\xc4\xb0K\xc4\xb0PED\xc4\xb0STLER_\xc4\xb0\xc3\x87\xc3\x9cN') |
| 529 | +sewikimedia: renaming 88 (1,'Projekt:Wikipedia-böcker') to (1,'Broken/Projekt\x3aWikipedia-b\xc3\xb6cker') |
| 530 | +sewikimedia: renaming 141 (1,'Projekt:Wikipediabok_1') to (1,'Broken/Projekt\x3aWikipediabok_1') |
| 531 | +myvwiki: renaming 100 (1,'Википедиясь:Администраторт') to (1,'Broken/\xd0\x92\xd0\xb8\xd0\xba\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f\xd1\x81\xd1\x8c\x3a\xd0\x90\xd0\xb4\xd0\xbc\xd0\xb8\xd0\xbd\xd0\xb8\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\xd1\x82\xd0\xbe\xd1\x80\xd1\x82') |
| 532 | +myvwiki: renaming 101 (1,'Википедиясь:Посольстватнэ/Ru') to (1,'Broken/\xd0\x92\xd0\xb8\xd0\xba\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xb4\xd0\xb8\xd1\x8f\xd1\x81\xd1\x8c\x3a\xd0\x9f\xd0\xbe\xd1\x81\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81\xd1\x82\xd0\xb2\xd0\xb0\xd1\x82\xd0\xbd\xd1\x8d/Ru') |
| 533 | +jawikiversity: renaming 487 (0,'Wikiversity_talk:談話室') to (0,'Broken/談話室') |
| 534 | +jawikiversity: renaming 488 (0,'Wikiversity_talk:ウィキバーシティとは何か') to (0,'Broken/ウィキバーシティとは何か') |
| 535 | +jawikiversity: renaming 489 (0,'Wikiversity_talk:ウィキバーシティとは何でないか') to (0,'Broken/ウィキバーシティとは何でないか') |
| 536 | +jawikiversity: renaming 959 (1,'Topic:日本法') to (1,'Broken/Topic\x3a\xe6\x97\xa5\xe6\x9c\xac\xe6\xb3\x95') |
| 537 | +jawikiversity: renaming 961 (1,'Topic:プログラミング言語') to (1,'Broken/Topic\x3a\xe3\x83\x97\xe3\x83\xad\xe3\x82\xb0\xe3\x83\xa9\xe3\x83\x9f\xe3\x83\xb3\xe3\x82\xb0\xe8\xa8\x80\xe8\xaa\x9e') |
| 538 | +szlwiki: renaming 1443 (1,'Wikipedyjo:Zasady_šrajbůngu') to (1,'Broken/Wikipedyjo\x3aZasady_\xc5\xa1rajb\xc5\xafngu') |
| 539 | +ptwikiversity: renaming 2168 (1,'Wikiversidade:_Mecânica_Newtoniana') to (1,'Broken/Wikiversidade\x3a_Mec\xc3\xa2nica_Newtoniana') |
| 540 | +ptwikiversity: renaming 2169 (1,'Wikiversidade:_Humanidades') to (1,'Broken/Wikiversidade\x3a_Humanidades') |
| 541 | +ptwikiversity: renaming 2170 (1,'Wikiversidade:_Ciências_Sociais_Aplicadas') to (1,'Broken/Wikiversidade\x3a_Ci\xc3\xaancias_Sociais_Aplicadas') |
| 542 | +ptwikiversity: renaming 2171 (1,'Wikiversidade:_Ciências_Exatas_e_Ciências_da_Terra') to (1,'Broken/Wikiversidade\x3a_Ci\xc3\xaancias_Exatas_e_Ci\xc3\xaancias_da_Terra') |
| 543 | +ptwikiversity: renaming 2172 (1,'Wikiversidade:_Ciências_Biológicas_e_Ciências_da_Saúde') to (1,'Broken/Wikiversidade\x3a_Ci\xc3\xaancias_Biol\xc3\xb3gicas_e_Ci\xc3\xaancias_da_Sa\xc3\xbade') |
| 544 | +strategywiki: renaming 39 (0,'Strategic_Planning:About') to (0,'Broken/About') |
| 545 | +strategywiki: renaming 76 (0,'Strategic_Planning:Community_Portal') to (0,'Broken/Community_Portal') |
| 546 | +strategywiki: renaming 203 (0,'Strategic_Planning:Users') to (0,'Broken/Users') |
| 547 | +strategywiki: renaming 207 (1,'Strategic_Planning:Users') to (1,'Broken/Strategic_Planning\x3aUsers') |
| 548 | +trwikinews: renaming 141 (0,'Vikihaber:Köy_çeşmesi') to (0,'Broken/Köy_çeşmesi') |
| 549 | +trwikinews: renaming 142 (0,'Vikihaber:Köy_çeşmesi/Başlık') to (0,'Broken/Köy_çeşmesi/Başlık') |
| 550 | +trwikinews: renaming 143 (0,'Vikihaber:Köy_çeşmesi_(ilginize)') to (0,'Broken/Köy_çeşmesi_(ilginize)') |
| 551 | +trwikinews: renaming 144 (0,'Vikihaber:Köy_çeşmesi_(ilginize)/Başlık') to (0,'Broken/Köy_çeşmesi_(ilginize)/Başlık') |
| 552 | +trwikinews: renaming 145 (0,'Vikihaber:Köy_çeşmesi_(istekler)') to (0,'Broken/Köy_çeşmesi_(istekler)') |
| 553 | +trwikinews: renaming 146 (0,'Vikihaber:Köy_çeşmesi_(istekler)/Başlık') to (0,'Broken/Köy_çeşmesi_(istekler)/Başlık') |
| 554 | +trwikinews: renaming 147 (0,'Vikihaber:Köy_çeşmesi_(tümü)') to (0,'Broken/Köy_çeşmesi_(tümü)') |
| 555 | +trwikinews: renaming 148 (0,'Vikihaber:Köy_çeşmesi_(yönetmelik)') to (0,'Broken/Köy_çeşmesi_(yönetmelik)') |
| 556 | +trwikinews: renaming 149 (0,'Vikihaber:Köy_çeşmesi_(yönetmelik)/Başlık') to (0,'Broken/Köy_çeşmesi_(yönetmelik)/Başlık') |
| 557 | +trwikinews: renaming 781 (1,'Portal:Ekonomi_ve_iş') to (1,'Broken/Portal\x3aEkonomi_ve_i\xc5\x9f') |
| 558 | +trwikinews: renaming 954 (1,'Portal:Ekonomi') to (1,'Broken/Portal\x3aEkonomi') |
| 559 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixCleanupTitles/reversion-input |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 560 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixCleanupTitles/revertCleanupTitles.php |
— | — | @@ -0,0 +1,67 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require( '../commandLine.inc' ); |
| 5 | + |
| 6 | +$lines = file( $args[0] ); |
| 7 | +if ( !$lines ) { |
| 8 | + echo "Unable to open file {$args[0]}\n"; |
| 9 | + exit( 1 ); |
| 10 | +} |
| 11 | + |
| 12 | +$lines = array_map( 'trim', $lines ); |
| 13 | +$opsByWiki = array(); |
| 14 | + |
| 15 | +foreach ( $lines as $line ) { |
| 16 | + if ( !preg_match( '/ |
| 17 | + ^ |
| 18 | + (\w+): \s* |
| 19 | + renaming \s |
| 20 | + (\d+) \s |
| 21 | + \((\d+),\'(.*?)\'\) |
| 22 | + /x', |
| 23 | + $line, $m ) ) |
| 24 | + { |
| 25 | + continue; |
| 26 | + } |
| 27 | + |
| 28 | + list( $whole, $wiki, $pageId, $ns, $dbk ) = $m; |
| 29 | + |
| 30 | + $opsByWiki[$wiki][] = array( |
| 31 | + 'id' => $pageId, |
| 32 | + 'ns' => $ns, |
| 33 | + 'dbk' => $dbk ); |
| 34 | +} |
| 35 | + |
| 36 | +foreach ( $opsByWiki as $wiki => $ops ) { |
| 37 | + $lb = wfGetLB( $wiki ); |
| 38 | + $db = $lb->getConnection( DB_MASTER, array(), $wiki ); |
| 39 | + |
| 40 | + foreach ( $ops as $op ) { |
| 41 | + $msg = "{$op['id']} -> {$op['ns']}:{$op['dbk']}"; |
| 42 | + |
| 43 | + # Sanity check |
| 44 | + $row = $db->selectRow( 'page', array( 'page_namespace', 'page_title' ), |
| 45 | + array( 'page_id' => $op['id'] ), __METHOD__ ); |
| 46 | + if ( !$row ) { |
| 47 | + echo "$wiki: missing: $msg\n"; |
| 48 | + continue; |
| 49 | + } |
| 50 | + |
| 51 | + if ( !preg_match( '/^Broken\//', $row->page_title ) ) { |
| 52 | + echo "$wiki: conflict: $msg\n"; |
| 53 | + continue; |
| 54 | + } |
| 55 | + |
| 56 | + $db->update( 'page', |
| 57 | + /* SET */ array( |
| 58 | + 'page_namespace' => $op['ns'], |
| 59 | + 'page_title' => $op['dbk'] ), |
| 60 | + /* WHERE */ array( |
| 61 | + 'page_id' => $op['id'] ), |
| 62 | + __METHOD__ ); |
| 63 | + echo "$wiki: updated: $msg\n"; |
| 64 | + } |
| 65 | + $lb->reuseConnection( $db ); |
| 66 | +} |
| 67 | + |
| 68 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixCleanupTitles/revertCleanupTitles.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 69 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/x-mctest.php |
— | — | @@ -0,0 +1,84 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * This script makes several 'set', 'incr' and 'get' requests on every |
| 5 | + * memcached server and shows a report. |
| 6 | + * |
| 7 | + * This program is free software; you can redistribute it and/or modify |
| 8 | + * it under the terms of the GNU General Public License as published by |
| 9 | + * the Free Software Foundation; either version 2 of the License, or |
| 10 | + * (at your option) any later version. |
| 11 | + * |
| 12 | + * This program is distributed in the hope that it will be useful, |
| 13 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | + * GNU General Public License for more details. |
| 16 | + * |
| 17 | + * You should have received a copy of the GNU General Public License along |
| 18 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 20 | + * http://www.gnu.org/copyleft/gpl.html |
| 21 | + * |
| 22 | + * @ingroup Maintenance |
| 23 | + */ |
| 24 | + |
| 25 | +require_once( dirname(__FILE__) . '/Maintenance.php' ); |
| 26 | + |
| 27 | +class mcTest extends Maintenance { |
| 28 | + public function __construct() { |
| 29 | + parent::__construct(); |
| 30 | + $this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every" |
| 31 | + . " memcached server and shows a report"; |
| 32 | + $this->addOption( 'i', 'Number of iterations', false, true ); |
| 33 | + $this->addArg( 'server', 'Memcached server to test', false ); |
| 34 | + } |
| 35 | + |
| 36 | + public function execute() { |
| 37 | + global $wgMemCachedServers; |
| 38 | + |
| 39 | + $iterations = $this->getOption( 'i', 100 ); |
| 40 | + if( $this->hasArg() ) |
| 41 | + $wgMemCachedServers = array( $this->getArg() ); |
| 42 | + |
| 43 | + foreach ( $wgMemCachedServers as $server ) { |
| 44 | + $this->output( $server . " " ); |
| 45 | + $mcc = new MemCachedClientforWiki( array('persistant' => true) ); |
| 46 | + $mcc->set_debug(true); |
| 47 | + $mcc->set_servers( array( $server ) ); |
| 48 | + $set = 0; |
| 49 | + $incr = 0; |
| 50 | + $get = 0; |
| 51 | + $time_start = $this->microtime_float(); |
| 52 | + for ( $i=1; $i<=$iterations; $i++ ) { |
| 53 | + if ( !is_null( $mcc->set( "test$i", $i ) ) ) { |
| 54 | + $set++; |
| 55 | + } |
| 56 | + } |
| 57 | + for ( $i=1; $i<=$iterations; $i++ ) { |
| 58 | + if ( !is_null( $mcc->incr( "test$i", $i ) ) ) { |
| 59 | + $incr++; |
| 60 | + } |
| 61 | + } |
| 62 | + for ( $i=1; $i<=$iterations; $i++ ) { |
| 63 | + $value = $mcc->get( "test$i" ); |
| 64 | + if ( $value == $i*2 ) { |
| 65 | + $get++; |
| 66 | + } |
| 67 | + } |
| 68 | + $exectime = $this->microtime_float() - $time_start; |
| 69 | + |
| 70 | + $this->output( "set: $set incr: $incr get: $get time: $exectime\n" ); |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + /** |
| 75 | + * Return microtime() as a float |
| 76 | + * @return float |
| 77 | + */ |
| 78 | + private function microtime_float() { |
| 79 | + list($usec, $sec) = explode(" ", microtime()); |
| 80 | + return ((float)$usec + (float)$sec); |
| 81 | + } |
| 82 | +} |
| 83 | + |
| 84 | +$maintClass = "mcTest"; |
| 85 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/x-mctest.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 86 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/WikimediaMaintenance.php |
— | — | @@ -0,0 +1,67 @@ |
| 2 | +<?php |
| 3 | +/* |
| 4 | + * Entry point for WikimediaMaintenance scripts :) |
| 5 | + */ |
| 6 | + |
| 7 | +// Detect $IP |
| 8 | +$IP = getenv( 'MW_INSTALL_PATH' ); |
| 9 | +if ( $IP === false ) { |
| 10 | + $IP = dirname( __FILE__ ) . '/../..'; |
| 11 | +} |
| 12 | + |
| 13 | +// Require base maintenance class |
| 14 | +require( "$IP/maintenance/Maintenance.php" ); |
| 15 | + |
| 16 | +// Some scripts need the WMFSite class, so include that too |
| 17 | +require( dirname( __FILE__ ) . '/WMFSite.php' ); |
| 18 | + |
| 19 | +/** |
| 20 | + * Wikimedia-specific maintenance classes should extend this. This class will |
| 21 | + * override some maintenance setup process to be wmf-specific. |
| 22 | + */ |
| 23 | +abstract class WikimediaMaintenance extends Maintenance { |
| 24 | + /** |
| 25 | + * Override the core loadSettings. |
| 26 | + */ |
| 27 | + public function loadSettings() { |
| 28 | + global $IP, $wgNoDBParam, $wgConf, $site, $lang; |
| 29 | + |
| 30 | + if ( empty( $wgNoDBParam ) ) { |
| 31 | + # Check if we were passed a db name |
| 32 | + if ( isset( $this->mOptions['wiki'] ) ) { |
| 33 | + $db = $this->mOptions['wiki']; |
| 34 | + } else { |
| 35 | + $db = array_shift( $this->mArgs ); |
| 36 | + } |
| 37 | + list( $site, $lang ) = $wgConf->siteFromDB( $db ); |
| 38 | + |
| 39 | + # If not, work out the language and site the old way |
| 40 | + if ( is_null( $site ) || is_null( $lang ) ) { |
| 41 | + if ( !$db ) { |
| 42 | + $lang = 'aa'; |
| 43 | + } else { |
| 44 | + $lang = $db; |
| 45 | + } |
| 46 | + if ( isset( $this->mArgs[0] ) ) { |
| 47 | + $site = array_shift( $this->mArgs ); |
| 48 | + } else { |
| 49 | + $site = 'wikipedia'; |
| 50 | + } |
| 51 | + } |
| 52 | + } else { |
| 53 | + $lang = 'aa'; |
| 54 | + $site = 'wikipedia'; |
| 55 | + } |
| 56 | + |
| 57 | + putenv( 'wikilang=' . $lang ); |
| 58 | + |
| 59 | + ini_set( 'include_path', ".:$IP:$IP/includes:$IP/languages:$IP/maintenance" ); |
| 60 | + |
| 61 | + if ( $lang == 'test' && $site == 'wikipedia' ) { |
| 62 | + if ( !defined( 'TESTWIKI' ) ) { |
| 63 | + define( 'TESTWIKI', 1 ); |
| 64 | + } |
| 65 | + } |
| 66 | + return MWInit::interpretedPath( '../wmf-config/CommonSettings.php' ); |
| 67 | + } |
| 68 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/WikimediaMaintenance.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 69 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/README |
— | — | @@ -0,0 +1 @@ |
| 2 | +This is where any Wikimedia specific maintenance scripts now live |
\ No newline at end of file |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/README |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 3 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/namespaceDupesWT.php |
— | — | @@ -0,0 +1,308 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * Check for articles to fix after adding/deleting namespaces |
| 5 | + * |
| 6 | + * Copyright (C) 2005-2007 Brion Vibber <brion@pobox.com> |
| 7 | + * http://www.mediawiki.org/ |
| 8 | + * |
| 9 | + * This program is free software; you can redistribute it and/or modify |
| 10 | + * it under the terms of the GNU General Public License as published by |
| 11 | + * the Free Software Foundation; either version 2 of the License, or |
| 12 | + * (at your option) any later version. |
| 13 | + * |
| 14 | + * This program is distributed in the hope that it will be useful, |
| 15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | + * GNU General Public License for more details. |
| 18 | + * |
| 19 | + * You should have received a copy of the GNU General Public License along |
| 20 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 21 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 22 | + * http://www.gnu.org/copyleft/gpl.html |
| 23 | + * |
| 24 | + * @ingroup Maintenance |
| 25 | + */ |
| 26 | + |
| 27 | +require_once( dirname(__FILE__) . '/Maintenance.php' ); |
| 28 | + |
| 29 | +class NamespaceConflictChecker extends Maintenance { |
| 30 | + public function __construct() { |
| 31 | + parent::__construct(); |
| 32 | + $this->mDescription = ""; |
| 33 | + $this->addOption( 'fix', 'Attempt to automatically fix errors' ); |
| 34 | + $this->addOption( 'suffix', "Dupes will be renamed with correct namespace with\n" . |
| 35 | + "\t\t<text> Appended after the article name", false, true ); |
| 36 | + $this->addOption( 'prefix', "Do an explicit check for the given title prefix\n" . |
| 37 | + "\t\tappended after the article name", false, true ); |
| 38 | + } |
| 39 | + |
| 40 | + public function execute() { |
| 41 | + global $wgTitle; |
| 42 | + |
| 43 | + $this->db = wfGetDB( DB_MASTER ); |
| 44 | + $wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' ); |
| 45 | + |
| 46 | + $fix = $this->hasOption( 'fix' ); |
| 47 | + $suffix = $this->getOption( 'suffix', '' ); |
| 48 | + $prefix = $this->getOption( 'prefix', '' ); |
| 49 | + $key = intval( $this->getOption( 'key', 0 ) ); |
| 50 | + |
| 51 | + if( $prefix ) { |
| 52 | + $retval = $this->checkPrefix( $key, $prefix, $fix, $suffix ); |
| 53 | + } else { |
| 54 | + $retval = $this->checkAll( $fix, $suffix ); |
| 55 | + } |
| 56 | + |
| 57 | + if( $retval ) { |
| 58 | + $this->output( "\nLooks good!\n" ); |
| 59 | + } else { |
| 60 | + $this->output( "\nOh noeees\n" ); |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + /** |
| 65 | + * @todo Document |
| 66 | + * @param $fix bool Whether or not to fix broken entries |
| 67 | + * @param $suffix String Suffix to append to renamed articles |
| 68 | + */ |
| 69 | + private function checkAll( $fix, $suffix = '' ) { |
| 70 | + global $wgContLang, $wgNamespaceAliases, $wgCanonicalNamespaceNames; |
| 71 | + global $wgCapitalLinks; |
| 72 | + |
| 73 | + $spaces = array(); |
| 74 | + |
| 75 | + // List interwikis first, so they'll be overridden |
| 76 | + // by any conflicting local namespaces. |
| 77 | + foreach( $this->getInterwikiList() as $prefix ) { |
| 78 | + $name = $wgContLang->ucfirst( $prefix ); |
| 79 | + $spaces[$name] = 0; |
| 80 | + } |
| 81 | + |
| 82 | + // Now pull in all canonical and alias namespaces... |
| 83 | + foreach( $wgCanonicalNamespaceNames as $ns => $name ) { |
| 84 | + // This includes $wgExtraNamespaces |
| 85 | + if( $name !== '' ) { |
| 86 | + $spaces[$name] = $ns; |
| 87 | + } |
| 88 | + } |
| 89 | + foreach( $wgContLang->getNamespaces() as $ns => $name ) { |
| 90 | + if( $name !== '' ) { |
| 91 | + $spaces[$name] = $ns; |
| 92 | + } |
| 93 | + } |
| 94 | + foreach( $wgNamespaceAliases as $name => $ns ) { |
| 95 | + $spaces[$name] = $ns; |
| 96 | + } |
| 97 | + foreach( $wgContLang->getNamespaceAliases() as $name => $ns ) { |
| 98 | + $spaces[$name] = $ns; |
| 99 | + } |
| 100 | + |
| 101 | + // We'll need to check for lowercase keys as well, |
| 102 | + // since we're doing case-sensitive searches in the db. |
| 103 | + foreach( $spaces as $name => $ns ) { |
| 104 | + $moreNames = array(); |
| 105 | + $moreNames[] = $wgContLang->uc( $name ); |
| 106 | + $moreNames[] = $wgContLang->ucfirst( $wgContLang->lc( $name ) ); |
| 107 | + $moreNames[] = $wgContLang->ucwords( $name ); |
| 108 | + $moreNames[] = $wgContLang->ucwords( $wgContLang->lc( $name ) ); |
| 109 | + $moreNames[] = $wgContLang->ucwordbreaks( $name ); |
| 110 | + $moreNames[] = $wgContLang->ucwordbreaks( $wgContLang->lc( $name ) ); |
| 111 | + if( !$wgCapitalLinks ) { |
| 112 | + foreach( $moreNames as $altName ) { |
| 113 | + $moreNames[] = $wgContLang->lcfirst( $altName ); |
| 114 | + } |
| 115 | + $moreNames[] = $wgContLang->lcfirst( $name ); |
| 116 | + } |
| 117 | + foreach( array_unique( $moreNames ) as $altName ) { |
| 118 | + if( $altName !== $name ) { |
| 119 | + $spaces[$altName] = $ns; |
| 120 | + } |
| 121 | + } |
| 122 | + } |
| 123 | + |
| 124 | + ksort( $spaces ); |
| 125 | + asort( $spaces ); |
| 126 | + |
| 127 | + $ok = true; |
| 128 | + foreach( $spaces as $name => $ns ) { |
| 129 | + $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok; |
| 130 | + } |
| 131 | + return $ok; |
| 132 | + } |
| 133 | + |
| 134 | + /** |
| 135 | + * Get the interwiki list |
| 136 | + * @todo Needs to respect interwiki cache! |
| 137 | + * @return array |
| 138 | + */ |
| 139 | + private function getInterwikiList() { |
| 140 | + $result = $this->db->select( 'interwiki', array( 'iw_prefix' ) ); |
| 141 | + $prefixes = array(); |
| 142 | + foreach( $result as $row ) { |
| 143 | + $prefixes[] = $row->iw_prefix; |
| 144 | + } |
| 145 | + $this->db->freeResult( $result ); |
| 146 | + return $prefixes; |
| 147 | + } |
| 148 | + |
| 149 | + /** |
| 150 | + * @todo Document |
| 151 | + * @param $ns int A namespace id |
| 152 | + * @param $name String |
| 153 | + * @param $fix bool Whether to fix broken entries |
| 154 | + * @param $suffix String Suffix to append to renamed articles |
| 155 | + */ |
| 156 | + private function checkNamespace( $ns, $name, $fix, $suffix = '' ) { |
| 157 | + $conflicts = $this->getConflicts( $ns, $name ); |
| 158 | + $count = count( $conflicts ); |
| 159 | + if( $count == 0 ) { |
| 160 | + return true; |
| 161 | + } |
| 162 | + |
| 163 | + $ok = true; |
| 164 | + foreach( $conflicts as $row ) { |
| 165 | + $resolvable = $this->reportConflict( $row, $suffix ); |
| 166 | + $ok = $ok && $resolvable; |
| 167 | + if( $fix && ( $resolvable || $suffix != '' ) ) { |
| 168 | + $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok; |
| 169 | + } |
| 170 | + } |
| 171 | + return $ok; |
| 172 | + } |
| 173 | + |
| 174 | + /** |
| 175 | + * @todo: do this for reals |
| 176 | + */ |
| 177 | + private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) { |
| 178 | + $this->output( "Checking prefix \"$prefix\" vs namespace $key\n" ); |
| 179 | + return $this->checkNamespace( $key, $prefix, $fix, $suffix ); |
| 180 | + } |
| 181 | + |
| 182 | + /** |
| 183 | + * Find pages in mainspace that have a prefix of the new namespace |
| 184 | + * so we know titles that will need migrating |
| 185 | + * @param $ns int Namespace id (id for new namespace?) |
| 186 | + * @param $name String Prefix that is being made a namespace |
| 187 | + */ |
| 188 | + private function getConflicts( $ns, $name ) { |
| 189 | + $page = 'page'; |
| 190 | + $table = $this->db->tableName( $page ); |
| 191 | + |
| 192 | + $prefix = $this->db->strencode( $name ); |
| 193 | + $encNamespace = $this->db->addQuotes( $ns ); |
| 194 | + |
| 195 | + $titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)"; |
| 196 | + if( $ns == 0 ) { |
| 197 | + // An interwiki; try an alternate encoding with '-' for ':' |
| 198 | + $titleSql = $this->db->buildConcat( array( "'$prefix-'", $titleSql ) ); |
| 199 | + } |
| 200 | + |
| 201 | + $sql = "SELECT {$page}_id AS id, |
| 202 | + {$page}_title AS oldtitle, |
| 203 | + $encNamespace + {$page}_namespace AS namespace, |
| 204 | + $titleSql AS title, |
| 205 | + {$page}_namespace AS oldnamespace |
| 206 | + FROM {$table} |
| 207 | + WHERE ( {$page}_namespace=0 OR {$page}_namespace=1 ) |
| 208 | + AND {$page}_title " . $this->db->buildLike( $name . ':', $this->db->anyString() ); |
| 209 | + |
| 210 | + $result = $this->db->query( $sql, __METHOD__ ); |
| 211 | + |
| 212 | + $set = array(); |
| 213 | + foreach( $result as $row ) { |
| 214 | + $set[] = $row; |
| 215 | + } |
| 216 | + $this->db->freeResult( $result ); |
| 217 | + |
| 218 | + return $set; |
| 219 | + } |
| 220 | + |
| 221 | + /** |
| 222 | + * Report any conflicts we find |
| 223 | + */ |
| 224 | + private function reportConflict( $row, $suffix ) { |
| 225 | + $newTitle = Title::makeTitleSafe( $row->namespace, $row->title ); |
| 226 | + if( is_null($newTitle) || !$newTitle->canExist() ) { |
| 227 | + // Title is also an illegal title... |
| 228 | + // For the moment we'll let these slide to cleanupTitles or whoever. |
| 229 | + $this->output( sprintf( "... %d (%d,\"%s\")\n", |
| 230 | + $row->id, |
| 231 | + $row->oldnamespace, |
| 232 | + $row->oldtitle ) ); |
| 233 | + $this->output( "... *** cannot resolve automatically; illegal title ***\n" ); |
| 234 | + return false; |
| 235 | + } |
| 236 | + |
| 237 | + $this->output( sprintf( "... %d (%d,\"%s\") -> (%d,\"%s\") [[%s]]\n", |
| 238 | + $row->id, |
| 239 | + $row->oldnamespace, |
| 240 | + $row->oldtitle, |
| 241 | + $newTitle->getNamespace(), |
| 242 | + $newTitle->getDBkey(), |
| 243 | + $newTitle->getPrefixedText() ) ); |
| 244 | + |
| 245 | + $id = $newTitle->getArticleId(); |
| 246 | + if( $id ) { |
| 247 | + $this->output( "... *** cannot resolve automatically; page exists with ID $id ***\n" ); |
| 248 | + return false; |
| 249 | + } else { |
| 250 | + return true; |
| 251 | + } |
| 252 | + } |
| 253 | + |
| 254 | + /** |
| 255 | + * Resolve any conflicts |
| 256 | + * @param $row Row from the page table to fix |
| 257 | + * @param $resolveable bool |
| 258 | + * @param $suffix String Suffix to append to the fixed page |
| 259 | + */ |
| 260 | + private function resolveConflict( $row, $resolvable, $suffix ) { |
| 261 | + if( !$resolvable ) { |
| 262 | + $this->output( "... *** old title {$row->title}\n" ); |
| 263 | + while( true ) { |
| 264 | + $row->title .= $suffix; |
| 265 | + $this->output( "... *** new title {$row->title}\n" ); |
| 266 | + $title = Title::makeTitleSafe( $row->namespace, $row->title ); |
| 267 | + if ( ! $title ) { |
| 268 | + $this->output( "... !!! invalid title\n" ); |
| 269 | + return false; |
| 270 | + } |
| 271 | + if ( $id = $title->getArticleId() ) { |
| 272 | + $this->output( "... *** page exists with ID $id ***\n" ); |
| 273 | + } else { |
| 274 | + break; |
| 275 | + } |
| 276 | + } |
| 277 | + $this->output( "... *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n" ); |
| 278 | + } |
| 279 | + $this->resolveConflictOn( $row, 'page', 'page' ); |
| 280 | + return true; |
| 281 | + } |
| 282 | + |
| 283 | + /** |
| 284 | + * Resolve a given conflict |
| 285 | + * @param $row Row from the old broken entry |
| 286 | + * @param $table String Table to update |
| 287 | + * @param $prefix String Prefix for column name, like page or ar |
| 288 | + */ |
| 289 | + private function resolveConflictOn( $row, $table, $prefix ) { |
| 290 | + $this->output( "... resolving on $table... " ); |
| 291 | + $newTitle = Title::makeTitleSafe( $row->namespace, $row->title ); |
| 292 | + $this->db->update( $table, |
| 293 | + array( |
| 294 | + "{$prefix}_namespace" => $newTitle->getNamespace(), |
| 295 | + "{$prefix}_title" => $newTitle->getDBkey(), |
| 296 | + ), |
| 297 | + array( |
| 298 | + // "{$prefix}_namespace" => 0, |
| 299 | + // "{$prefix}_title" => $row->oldtitle, |
| 300 | + "{$prefix}_id" => $row->id, |
| 301 | + ), |
| 302 | + __METHOD__ ); |
| 303 | + $this->output( "ok.\n" ); |
| 304 | + return true; |
| 305 | + } |
| 306 | +} |
| 307 | + |
| 308 | +$maintClass = "NamespaceConflictChecker"; |
| 309 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/namespaceDupesWT.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 310 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixUsabilityPrefs.php |
— | — | @@ -0,0 +1,91 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require( dirname( __FILE__ ) . '/../Maintenance.php' ); |
| 5 | + |
| 6 | +class FixUsabilityPrefs extends Maintenance { |
| 7 | + function __construct() { |
| 8 | + parent::__construct(); |
| 9 | + } |
| 10 | + |
| 11 | + function execute() { |
| 12 | + $dbw = wfGetDB( DB_MASTER ); |
| 13 | + |
| 14 | + echo "Fixing usebetatoolbar\n"; |
| 15 | + |
| 16 | + $batchSize = 100; |
| 17 | + $allIds = array(); |
| 18 | + while ( true ) { |
| 19 | + $dbw->begin(); |
| 20 | + $res = $dbw->select( 'user_properties', array( 'up_user' ), |
| 21 | + array( 'up_property' => 'usebetatoolbar', 'up_value' => '' ), |
| 22 | + __METHOD__, |
| 23 | + array( 'LIMIT' => $batchSize, 'FOR UPDATE' ) ); |
| 24 | + if ( !$res->numRows() ) { |
| 25 | + $dbw->commit(); |
| 26 | + break; |
| 27 | + } |
| 28 | + |
| 29 | + $ids = array(); |
| 30 | + foreach ( $res as $row ) { |
| 31 | + $ids[] = $row->up_user; |
| 32 | + } |
| 33 | + $dbw->delete( 'user_properties', |
| 34 | + array( 'up_property' => 'usebetatoolbar', 'up_user' => $ids ), |
| 35 | + __METHOD__ ); |
| 36 | + $dbw->commit(); |
| 37 | + $allIds = array_merge( $allIds, $ids ); |
| 38 | + wfWaitForSlaves( 10 ); |
| 39 | + } |
| 40 | + |
| 41 | + echo "Fixing wikieditor-*\n"; |
| 42 | + |
| 43 | + $likeWikieditor = $dbw->buildLike( 'wikieditor-', $dbw->anyString() ); |
| 44 | + while ( true ) { |
| 45 | + $dbw->begin(); |
| 46 | + $res = $dbw->select( 'user_properties', array( 'DISTINCT up_user' ), |
| 47 | + array( "up_property $likeWikieditor" ), |
| 48 | + __METHOD__, |
| 49 | + array( 'LIMIT' => $batchSize, 'FOR UPDATE' ) ); |
| 50 | + if ( !$res->numRows() ) { |
| 51 | + $dbw->commit(); |
| 52 | + break; |
| 53 | + } |
| 54 | + |
| 55 | + $ids = array(); |
| 56 | + foreach ( $res as $row ) { |
| 57 | + $ids[] = $row->up_user; |
| 58 | + } |
| 59 | + $dbw->delete( 'user_properties', |
| 60 | + array( "up_property $likeWikieditor", 'up_user' => $ids ), |
| 61 | + __METHOD__ ); |
| 62 | + $dbw->commit(); |
| 63 | + $allIds = array_merge( $allIds, $ids ); |
| 64 | + wfWaitForSlaves( 10 ); |
| 65 | + } |
| 66 | + |
| 67 | + $allIds = array_unique( $allIds ); |
| 68 | + |
| 69 | + echo "Invalidating user cache\n"; |
| 70 | + $i = 0; |
| 71 | + foreach ( $allIds as $id ) { |
| 72 | + $user = User::newFromId( $id ); |
| 73 | + if ( !$user->isLoggedIn() ) { |
| 74 | + continue; |
| 75 | + } |
| 76 | + $dbw->begin(); |
| 77 | + $user->invalidateCache(); |
| 78 | + $dbw->commit(); |
| 79 | + $i++; |
| 80 | + if ( $i % 1000 == 0 ) { |
| 81 | + wfWaitForSlaves( 10 ); |
| 82 | + } |
| 83 | + } |
| 84 | + |
| 85 | + echo "Done\n"; |
| 86 | + } |
| 87 | +} |
| 88 | + |
| 89 | +$maintClass = 'FixUsabilityPrefs'; |
| 90 | +require_once( DO_MAINTENANCE ); |
| 91 | + |
| 92 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/fixUsabilityPrefs.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 93 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/addWiki.php |
— | — | @@ -0,0 +1,206 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * @defgroup Wikimedia Wikimedia |
| 5 | + */ |
| 6 | + |
| 7 | +/** |
| 8 | + * Add a new wiki |
| 9 | + * Wikimedia specific! |
| 10 | + * |
| 11 | + * This program is free software; you can redistribute it and/or modify |
| 12 | + * it under the terms of the GNU General Public License as published by |
| 13 | + * the Free Software Foundation; either version 2 of the License, or |
| 14 | + * (at your option) any later version. |
| 15 | + * |
| 16 | + * This program is distributed in the hope that it will be useful, |
| 17 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 18 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 19 | + * GNU General Public License for more details. |
| 20 | + * |
| 21 | + * You should have received a copy of the GNU General Public License along |
| 22 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 23 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 24 | + * http://www.gnu.org/copyleft/gpl.html |
| 25 | + * |
| 26 | + * @file |
| 27 | + * @ingroup Maintenance |
| 28 | + * @ingroup Wikimedia |
| 29 | + */ |
| 30 | +require_once( dirname( __FILE__ ) . '/WikimediaMaintenance.php' ); |
| 31 | + |
| 32 | +class AddWiki extends Maintenance { |
| 33 | + public function __construct() { |
| 34 | + global $wgNoDBParam; |
| 35 | + |
| 36 | + parent::__construct(); |
| 37 | + $this->mDescription = "Add a new wiki to the family. Wikimedia specific!"; |
| 38 | + $this->addArg( 'language', 'Language code of new site, e.g. en' ); |
| 39 | + $this->addArg( 'site', 'Type of site, e.g. wikipedia' ); |
| 40 | + $this->addArg( 'dbname', 'Name of database to create, e.g. enwiki' ); |
| 41 | + $this->addArg( 'domain', 'Domain name of the wiki, e.g. en.wikipedia.org' ); |
| 42 | + |
| 43 | + $wgNoDBParam = true; |
| 44 | + } |
| 45 | + |
| 46 | + public function getDbType() { |
| 47 | + return Maintenance::DB_ADMIN; |
| 48 | + } |
| 49 | + |
| 50 | + public function execute() { |
| 51 | + global $IP, $wgDefaultExternalStore, $wmfVersionNumber; |
| 52 | + if ( !$wmfVersionNumber ) { // set in CommonSettings.php |
| 53 | + $this->error( '$wmfVersionNumber is not set, please use MWScript.php wrapper.', true ); |
| 54 | + } |
| 55 | + |
| 56 | + $lang = $this->getArg( 0 ); |
| 57 | + $site = $this->getArg( 1 ); |
| 58 | + $dbName = $this->getArg( 2 ); |
| 59 | + $domain = $this->getArg( 3 ); |
| 60 | + $languageNames = Language::getLanguageNames(); |
| 61 | + |
| 62 | + if ( !isset( $languageNames[$lang] ) ) { |
| 63 | + $this->error( "Language $lang not found in Names.php", true ); |
| 64 | + } |
| 65 | + $name = $languageNames[$lang]; |
| 66 | + |
| 67 | + $dbw = wfGetDB( DB_MASTER ); |
| 68 | + $common = "/home/wikipedia/common"; |
| 69 | + |
| 70 | + $this->output( "Creating database $dbName for $lang.$site ($name)\n" ); |
| 71 | + |
| 72 | + # Set up the database |
| 73 | + $dbw->query( "SET table_type=Innodb" ); |
| 74 | + $dbw->query( "CREATE DATABASE $dbName" ); |
| 75 | + $dbw->selectDB( $dbName ); |
| 76 | + |
| 77 | + $this->output( "Initialising tables\n" ); |
| 78 | + $dbw->sourceFile( $this->getDir() . '/tables.sql' ); |
| 79 | + $dbw->sourceFile( "$IP/extensions/OAI/update_table.sql" ); |
| 80 | + $dbw->sourceFile( "$IP/extensions/AntiSpoof/sql/patch-antispoof.mysql.sql" ); |
| 81 | + $dbw->sourceFile( "$IP/extensions/CheckUser/cu_changes.sql" ); |
| 82 | + $dbw->sourceFile( "$IP/extensions/CheckUser/cu_log.sql" ); |
| 83 | + $dbw->sourceFile( "$IP/extensions/TitleKey/titlekey.sql" ); |
| 84 | + $dbw->sourceFile( "$IP/extensions/Oversight/hidden.sql" ); |
| 85 | + $dbw->sourceFile( "$IP/extensions/GlobalBlocking/localdb_patches/setup-global_block_whitelist.sql" ); |
| 86 | + $dbw->sourceFile( "$IP/extensions/AbuseFilter/abusefilter.tables.sql" ); |
| 87 | + $dbw->sourceFile( "$IP/extensions/PrefStats/patches/PrefStats.sql" ); |
| 88 | + $dbw->sourceFile( "$IP/extensions/ProofreadPage/ProofreadPage.sql" ); |
| 89 | + $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTrackingEvents.sql" ); |
| 90 | + $dbw->sourceFile( "$IP/extensions/ClickTracking/patches/ClickTracking.sql" ); |
| 91 | + $dbw->sourceFile( "$IP/extensions/UserDailyContribs/patches/UserDailyContribs.sql" ); |
| 92 | + $dbw->sourceFile( "$IP/extensions/Math/db/math.sql" ); |
| 93 | + |
| 94 | + $dbw->query( "INSERT INTO site_stats(ss_row_id) VALUES (1)" ); |
| 95 | + |
| 96 | + # Initialise external storage |
| 97 | + if ( is_array( $wgDefaultExternalStore ) ) { |
| 98 | + $stores = $wgDefaultExternalStore; |
| 99 | + } elseif ( $wgDefaultExternalStore ) { |
| 100 | + $stores = array( $wgDefaultExternalStore ); |
| 101 | + } else { |
| 102 | + $stores = array(); |
| 103 | + } |
| 104 | + if ( count( $stores ) ) { |
| 105 | + global $wgDBuser, $wgDBpassword, $wgExternalServers; |
| 106 | + foreach ( $stores as $storeURL ) { |
| 107 | + $m = array(); |
| 108 | + if ( !preg_match( '!^DB://(.*)$!', $storeURL, $m ) ) { |
| 109 | + continue; |
| 110 | + } |
| 111 | + |
| 112 | + $cluster = $m[1]; |
| 113 | + $this->output( "Initialising external storage $cluster...\n" ); |
| 114 | + |
| 115 | + # Hack |
| 116 | + $wgExternalServers[$cluster][0]['user'] = $wgDBuser; |
| 117 | + $wgExternalServers[$cluster][0]['password'] = $wgDBpassword; |
| 118 | + |
| 119 | + $store = new ExternalStoreDB; |
| 120 | + $extdb = $store->getMaster( $cluster ); |
| 121 | + $extdb->query( "SET table_type=InnoDB" ); |
| 122 | + $extdb->query( "CREATE DATABASE $dbName" ); |
| 123 | + $extdb->selectDB( $dbName ); |
| 124 | + |
| 125 | + # Hack x2 |
| 126 | + $blobsTable = $store->getTable( $extdb ); |
| 127 | + $sedCmd = "sed s/blobs\\\\\\>/$blobsTable/ " . $this->getDir() . "/storage/blobs.sql"; |
| 128 | + $blobsFile = popen( $sedCmd, 'r' ); |
| 129 | + $extdb->sourceStream( $blobsFile ); |
| 130 | + pclose( $blobsFile ); |
| 131 | + $extdb->commit(); |
| 132 | + } |
| 133 | + } |
| 134 | + |
| 135 | + $title = Title::newFromText( wfMessage( 'mainpage' )->inLanguage( $lang )->useDatabase( false )->plain() ); |
| 136 | + $this->output( "Writing main page to " . $title->getPrefixedDBkey() . "\n" ); |
| 137 | + $article = new Article( $title ); |
| 138 | + $ucsite = ucfirst( $site ); |
| 139 | + |
| 140 | + $article->doEdit( $this->getFirstArticle( $ucsite, $name ), '', EDIT_NEW | EDIT_AUTOSUMMARY ); |
| 141 | + |
| 142 | + $this->output( "Adding to dblists\n" ); |
| 143 | + |
| 144 | + # Add to dblist |
| 145 | + $file = fopen( "$common/all.dblist", "a" ); |
| 146 | + fwrite( $file, "$dbName\n" ); |
| 147 | + fclose( $file ); |
| 148 | + |
| 149 | + # Update the sublists |
| 150 | + shell_exec( "cd $common && ./refresh-dblist" ); |
| 151 | + |
| 152 | + # Add to wikiversions.dat |
| 153 | + $file = fopen( "$common/wikiversions.dat", "a" ); |
| 154 | + fwrite( $file, "$dbName php-$wmfVersionNumber\n" ); |
| 155 | + fclose( $file ); |
| 156 | + # Rebuild wikiversions.cdb |
| 157 | + shell_exec( "cd $common/multiversion && ./refreshWikiversionsCDB" ); |
| 158 | + |
| 159 | + # print "Constructing interwiki SQL\n"; |
| 160 | + # Rebuild interwiki tables |
| 161 | + # passthru( '/home/wikipedia/conf/interwiki/update' ); |
| 162 | + |
| 163 | + $time = wfTimestamp( TS_RFC2822 ); |
| 164 | + // These arguments need to be escaped twice: once for echo and once for at |
| 165 | + $escDbName = wfEscapeShellArg( wfEscapeShellArg( $dbName ) ); |
| 166 | + $escTime = wfEscapeShellArg( wfEscapeShellArg( $time ) ); |
| 167 | + $escUcsite = wfEscapeShellArg( wfEscapeShellArg( $ucsite ) ); |
| 168 | + $escName = wfEscapeShellArg( wfEscapeShellArg( $name ) ); |
| 169 | + $escLang = wfEscapeShellArg( wfEscapeShellArg( $lang ) ); |
| 170 | + $escDomain = wfEscapeShellArg( wfEscapeShellArg( $domain ) ); |
| 171 | + shell_exec( "echo notifyNewProjects $escDbName $escTime $escUcsite $escName $escLang $escDomain | at now + 15 minutes" ); |
| 172 | + |
| 173 | + $this->output( "Script ended. You still have to: |
| 174 | + * Add any required settings in InitialiseSettings.php |
| 175 | + * Run sync-common-all |
| 176 | + " ); |
| 177 | + } |
| 178 | + |
| 179 | + private function getFirstArticle( $ucsite, $name ) { |
| 180 | + return <<<EOT |
| 181 | +==This subdomain is reserved for the creation of a [[wikimedia:Our projects|$ucsite]] in '''[[w:en:{$name}|{$name}]]''' language== |
| 182 | + |
| 183 | +* Please '''do not start editing''' this new site. This site has a test project on the [[incubator:|Wikimedia Incubator]] (or on the [[betawikiversity:|Beta Wikiversity]] or on the [[oldwikisource:|Old Wikisource]]) and it will be imported to here. |
| 184 | + |
| 185 | +* If you would like to help translating the interface to this language, please do not translate here, but go to [[translatewiki:|translatewiki.net]], a special wiki for translating the interface. That way everyone can use it on every wiki using the [[mw:|same software]]. |
| 186 | + |
| 187 | +* 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]]. |
| 188 | + |
| 189 | +== Sister projects == |
| 190 | +<span class="plainlinks"> |
| 191 | +[http://www.wikipedia.org Wikipedia] | |
| 192 | +[http://www.wiktionary.org Wiktionary] | |
| 193 | +[http://www.wikibooks.org Wikibooks] | |
| 194 | +[http://www.wikinews.org Wikinews] | |
| 195 | +[http://www.wikiquote.org Wikiquote] | |
| 196 | +[http://www.wikisource.org Wikisource] | |
| 197 | +[http://www.wikiversity.org Wikiversity] |
| 198 | +</span> |
| 199 | + |
| 200 | +See Wikimedia's [[m:|Meta-Wiki]] for the coordination of these projects. |
| 201 | + |
| 202 | +EOT; |
| 203 | + } |
| 204 | +} |
| 205 | + |
| 206 | +$maintClass = "AddWiki"; |
| 207 | +require_once( RUN_MAINTENANCE_IF_MAIN ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/addWiki.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 208 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 209 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/rL.php |
— | — | @@ -0,0 +1,286 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * This program is free software; you can redistribute it and/or modify |
| 5 | + * it under the terms of the GNU General Public License as published by |
| 6 | + * the Free Software Foundation; either version 2 of the License, or |
| 7 | + * (at your option) any later version. |
| 8 | + * |
| 9 | + * This program is distributed in the hope that it will be useful, |
| 10 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | + * GNU General Public License for more details. |
| 13 | + * |
| 14 | + * You should have received a copy of the GNU General Public License along |
| 15 | + * with this program; if not, write to the Free Software Foundation, Inc., |
| 16 | + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 17 | + * http://www.gnu.org/copyleft/gpl.html |
| 18 | + * |
| 19 | + * @ingroup Maintenance |
| 20 | + */ |
| 21 | + |
| 22 | +require_once( dirname(__FILE__) . '/Maintenance.php' ); |
| 23 | + |
| 24 | +class RefreshLinks extends Maintenance { |
| 25 | + public function __construct() { |
| 26 | + parent::__construct(); |
| 27 | + $this->mDescription = "Refresh link tables"; |
| 28 | + $this->addOption( 'dfn-only', 'Delete links from nonexistent articles only' ); |
| 29 | + $this->addOption( 'new-only', 'Only affect articles with just a single edit' ); |
| 30 | + $this->addOption( 'redirects-only', 'Only fix redirects, not all links' ); |
| 31 | + $this->addOption( 'old-redirects-only', 'Only fix redirects with no redirect table entry' ); |
| 32 | + $this->addOption( 'm', 'Maximum replication lag', false, true ); |
| 33 | + $this->addOption( 'e', 'Last page id to refresh', false, true ); |
| 34 | + $this->addArg( 'start', 'Page_id to start from, default 1', false ); |
| 35 | + $this->setBatchSize( 100 ); |
| 36 | + } |
| 37 | + |
| 38 | + public function execute() { |
| 39 | + global $wgMemc; |
| 40 | + global $wgCacheEpoch; |
| 41 | + $wgCacheEpoch = '20100423090000'; |
| 42 | + if( !$this->hasOption( 'dfn-only' ) ) { |
| 43 | + $start = $this->getArg( 0, 1 ); |
| 44 | + $new = $this->getOption( 'new-only', false ); |
| 45 | + $max = $this->getOption( 'm', false ); |
| 46 | + $end = $this->getOption( 'e', 0 ); |
| 47 | + $redir = $this->getOption( 'redirects-only', false ); |
| 48 | + $oldRedir = $this->getOption( 'old-redirects-only', false ); |
| 49 | + $this->doRefreshLinks( $start, $new, $max, $end, $redir, $oldRedir ); |
| 50 | + } |
| 51 | + $this->deleteLinksFromNonexistent( $max, $this->mBatchSize ); |
| 52 | + } |
| 53 | + |
| 54 | + /** |
| 55 | + * Do the actual link refreshing. |
| 56 | + * @param $start int Page_id to start from |
| 57 | + * @param $newOnly bool Only do pages with 1 edit |
| 58 | + * @param $maxLag int Max DB replication lag |
| 59 | + * @param $end int Page_id to stop at |
| 60 | + * @param $redirectsOnly bool Only fix redirects |
| 61 | + * @param $oldRedirectsOnly bool Only fix redirects without redirect entries |
| 62 | + */ |
| 63 | + private function doRefreshLinks( $start, $newOnly = false, $maxLag = false, |
| 64 | + $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false ) { |
| 65 | + global $wgUser, $wgParser, $wgUseTidy; |
| 66 | + |
| 67 | + $reportingInterval = 100; |
| 68 | + $dbr = wfGetDB( DB_SLAVE ); |
| 69 | + $start = intval( $start ); |
| 70 | + |
| 71 | + # Don't generate TeX PNGs (lack of a sensible current directory causes errors anyway) |
| 72 | + $wgUser->setOption('math', MW_MATH_SOURCE); |
| 73 | + |
| 74 | + # Don't generate extension images (e.g. Timeline) |
| 75 | + #if( method_exists( $wgParser, "clearTagHooks" ) ) { |
| 76 | + # $wgParser->clearTagHooks(); |
| 77 | + #} |
| 78 | + |
| 79 | + # Don't use HTML tidy |
| 80 | + $wgUseTidy = false; |
| 81 | + |
| 82 | + $what = $redirectsOnly ? "redirects" : "links"; |
| 83 | + |
| 84 | + if( $oldRedirectsOnly ) { |
| 85 | + # This entire code path is cut-and-pasted from below. Hurrah. |
| 86 | + $res = $dbr->query( |
| 87 | + "SELECT page_id ". |
| 88 | + "FROM page ". |
| 89 | + "LEFT JOIN redirect ON page_id=rd_from ". |
| 90 | + "WHERE page_is_redirect=1 AND rd_from IS NULL AND ". |
| 91 | + ($end == 0 ? "page_id >= $start" |
| 92 | + : "page_id BETWEEN $start AND $end"), |
| 93 | + __METHOD__ |
| 94 | + ); |
| 95 | + $num = $dbr->numRows( $res ); |
| 96 | + $this->output( "Refreshing $num old redirects from $start...\n" ); |
| 97 | + |
| 98 | + foreach( $res as $row ) { |
| 99 | + if ( !( ++$i % $reportingInterval ) ) { |
| 100 | + $this->output( "$i\n" ); |
| 101 | + wfWaitForSlaves( $maxLag ); |
| 102 | + } |
| 103 | + $this->fixRedirect( $row->page_id ); |
| 104 | + } |
| 105 | + } elseif( $newOnly ) { |
| 106 | + $this->output( "Refreshing $what from " ); |
| 107 | + $res = $dbr->select( 'page', |
| 108 | + array( 'page_id' ), |
| 109 | + array( |
| 110 | + 'page_is_new' => 1, |
| 111 | + "page_id >= $start" ), |
| 112 | + __METHOD__ |
| 113 | + ); |
| 114 | + $num = $dbr->numRows( $res ); |
| 115 | + $this->output( "$num new articles...\n" ); |
| 116 | + |
| 117 | + $i = 0; |
| 118 | + foreach ( $res as $row ) { |
| 119 | + if ( !( ++$i % $reportingInterval ) ) { |
| 120 | + $this->output( "$i\n" ); |
| 121 | + wfWaitForSlaves( $maxLag ); |
| 122 | + } |
| 123 | + if($redirectsOnly) |
| 124 | + $this->fixRedirect( $row->page_id ); |
| 125 | + else |
| 126 | + $this->fixLinksFromArticle( $row->page_id ); |
| 127 | + } |
| 128 | + } else { |
| 129 | + if ( !$end ) { |
| 130 | + $maxPage = $dbr->selectField( 'page', 'max(page_id)', false ); |
| 131 | + $maxRD = $dbr->selectField( 'redirect', 'max(rd_from)', false ); |
| 132 | + $end = max( $maxPage, $maxRD ); |
| 133 | + } |
| 134 | + $this->output( "Refreshing redirects table.\n" ); |
| 135 | + $this->output( "Starting from page_id $start of $end.\n" ); |
| 136 | + |
| 137 | + for ($id = $start; $id <= $end; $id++) { |
| 138 | + |
| 139 | + if ( !($id % $reportingInterval) ) { |
| 140 | + $this->output( "$id\n" ); |
| 141 | + wfWaitForSlaves( $maxLag ); |
| 142 | + } |
| 143 | + $this->fixRedirect( $id ); |
| 144 | + } |
| 145 | + |
| 146 | + if(!$redirectsOnly) { |
| 147 | + $this->output( "Refreshing links table.\n" ); |
| 148 | + $this->output( "Starting from page_id $start of $end.\n" ); |
| 149 | + |
| 150 | + for ($id = $start; $id <= $end; $id++) { |
| 151 | + |
| 152 | + if ( !($id % $reportingInterval) ) { |
| 153 | + $this->output( "$id\n" ); |
| 154 | + wfWaitForSlaves( $maxLag ); |
| 155 | + } |
| 156 | + $this->fixLinksFromArticle( $id ); |
| 157 | + } |
| 158 | + } |
| 159 | + } |
| 160 | + } |
| 161 | + |
| 162 | + /** |
| 163 | + * Update the redirect entry for a given page |
| 164 | + * @param $id int The page_id of the redirect |
| 165 | + */ |
| 166 | + private function fixRedirect( $id ){ |
| 167 | + global $wgTitle; |
| 168 | + |
| 169 | + $wgTitle = Title::newFromID( $id ); |
| 170 | + $dbw = wfGetDB( DB_MASTER ); |
| 171 | + |
| 172 | + if ( is_null( $wgTitle ) ) { |
| 173 | + // This page doesn't exist (any more) |
| 174 | + // Delete any redirect table entry for it |
| 175 | + $dbw->delete( 'redirect', array( 'rd_from' => $id ), |
| 176 | + __METHOD__ ); |
| 177 | + return; |
| 178 | + } |
| 179 | + $article = new Article($wgTitle); |
| 180 | + |
| 181 | + $rt = $article->followRedirect(); |
| 182 | + |
| 183 | + if($rt == false || !is_object($rt)) { |
| 184 | + // $wgTitle is not a redirect |
| 185 | + // Delete any redirect table entry for it |
| 186 | + $dbw->delete( 'redirect', array( 'rd_from' => $id ), |
| 187 | + __METHOD__ ); |
| 188 | + } else { |
| 189 | + $article->updateRedirectOn($dbw,$rt); |
| 190 | + } |
| 191 | + } |
| 192 | + |
| 193 | + /** |
| 194 | + * Run LinksUpdate for all links on a given page_id |
| 195 | + * @param $id int The page_id |
| 196 | + */ |
| 197 | + private function fixLinksFromArticle( $id ) { |
| 198 | + global $wgTitle, $wgParser; |
| 199 | + |
| 200 | + $wgTitle = Title::newFromID( $id ); |
| 201 | + $dbw = wfGetDB( DB_MASTER ); |
| 202 | + |
| 203 | + $linkCache =& LinkCache::singleton(); |
| 204 | + $linkCache->clear(); |
| 205 | + |
| 206 | + if ( is_null( $wgTitle ) ) { |
| 207 | + return; |
| 208 | + } |
| 209 | + $dbw->begin(); |
| 210 | + |
| 211 | + $revision = Revision::newFromTitle( $wgTitle ); |
| 212 | + if ( !$revision ) { |
| 213 | + return; |
| 214 | + } |
| 215 | + |
| 216 | + $options = new ParserOptions; |
| 217 | + $parserOutput = $wgParser->parse( $revision->getText(), $wgTitle, $options, true, true, $revision->getId() ); |
| 218 | + $update = new LinksUpdate( $wgTitle, $parserOutput, false ); |
| 219 | + $update->doUpdate(); |
| 220 | + $dbw->commit(); |
| 221 | + } |
| 222 | + |
| 223 | + /** |
| 224 | + * Removes non-existing links from pages from pagelinks, imagelinks, |
| 225 | + * categorylinks, templatelinks and externallinks tables. |
| 226 | + * |
| 227 | + * @param $maxLag |
| 228 | + * @param $batchSize The size of deletion batches |
| 229 | + * |
| 230 | + * @author Merlijn van Deen <valhallasw@arctus.nl> |
| 231 | + */ |
| 232 | + private function deleteLinksFromNonexistent( $maxLag = 0, $batchSize = 100 ) { |
| 233 | + wfWaitForSlaves( $maxLag ); |
| 234 | + |
| 235 | + $dbw = wfGetDB( DB_MASTER ); |
| 236 | + |
| 237 | + $lb = wfGetLBFactory()->newMainLB(); |
| 238 | + $dbr = $lb->getConnection( DB_SLAVE ); |
| 239 | + $dbr->bufferResults( false ); |
| 240 | + |
| 241 | + $linksTables = array( // table name => page_id field |
| 242 | + 'pagelinks' => 'pl_from', |
| 243 | + 'imagelinks' => 'il_from', |
| 244 | + 'categorylinks' => 'cl_from', |
| 245 | + 'templatelinks' => 'tl_from', |
| 246 | + 'externallinks' => 'el_from', |
| 247 | + ); |
| 248 | + |
| 249 | + foreach ( $linksTables as $table => $field ) { |
| 250 | + $this->output( "Retrieving illegal entries from $table... " ); |
| 251 | + |
| 252 | + // SELECT DISTINCT( $field ) FROM $table LEFT JOIN page ON $field=page_id WHERE page_id IS NULL; |
| 253 | + $results = $dbr->select( array( $table, 'page' ), |
| 254 | + $field, |
| 255 | + array('page_id' => null ), |
| 256 | + __METHOD__, |
| 257 | + 'DISTINCT', |
| 258 | + array( 'page' => array( 'LEFT JOIN', "$field=page_id")) |
| 259 | + ); |
| 260 | + |
| 261 | + $counter = 0; |
| 262 | + $list = array(); |
| 263 | + $this->output( "0.." ); |
| 264 | + |
| 265 | + foreach( $results as $row ) { |
| 266 | + $counter++; |
| 267 | + $list[] = $row->$field; |
| 268 | + if ( ( $counter % $batchSize ) == 0 ) { |
| 269 | + wfWaitForSlaves(5); |
| 270 | + $dbw->delete( $table, array( $field => $list ), __METHOD__ ); |
| 271 | + |
| 272 | + $this->output( $counter . ".." ); |
| 273 | + $list = array(); |
| 274 | + } |
| 275 | + } |
| 276 | + $this->output( $counter ); |
| 277 | + if (count($list) > 0) { |
| 278 | + $dbw->delete( $table, array( $field => $list ), __METHOD__ ); |
| 279 | + } |
| 280 | + $this->output( "\n" ); |
| 281 | + } |
| 282 | + $lb->closeAll(); |
| 283 | + } |
| 284 | +} |
| 285 | + |
| 286 | +$maintClass = 'RefreshLinks'; |
| 287 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/rL.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 288 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/WMFSite.php |
— | — | @@ -0,0 +1,19 @@ |
| 2 | +<?php |
| 3 | +/** |
| 4 | + * A simple little class referring to a specific WMF site. |
| 5 | + * @ingroup Maintenance |
| 6 | + */ |
| 7 | +class WMFSite { |
| 8 | + var $suffix, $lateral, $url; |
| 9 | + |
| 10 | + function __construct( $s, $l, $u ) { |
| 11 | + $this->suffix = $s; |
| 12 | + $this->lateral = $l; |
| 13 | + $this->url = $u; |
| 14 | + } |
| 15 | + |
| 16 | + function getURL( $lang, $urlprotocol ) { |
| 17 | + $xlang = str_replace( '_', '-', $lang ); |
| 18 | + return "$urlprotocol//$xlang.{$this->url}/wiki/\$1"; |
| 19 | + } |
| 20 | +} |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/WMFSite.php |
___________________________________________________________________ |
Added: svn:keywords |
1 | 21 | + Author Date Id Revision |
Added: svn:eol-style |
2 | 22 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupMl.php |
— | — | @@ -0,0 +1,90 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require( dirname( __FILE__ ) .'/commandLine.inc' ); |
| 5 | + |
| 6 | +$file = fopen( $args[0], 'r' ); |
| 7 | +if ( !$file ) { |
| 8 | + exit( 1 ); |
| 9 | +} |
| 10 | + |
| 11 | +$wgUser = User::newFromName( 'Malayalam cleanup script' ); |
| 12 | +if ( $wgUser->isAnon() ) { |
| 13 | + $wgUser->addToDatabase(); |
| 14 | +} |
| 15 | + |
| 16 | +$dbw = wfGetDB( DB_MASTER ); |
| 17 | + |
| 18 | +while ( !feof( $file ) ) { |
| 19 | + $line = fgets( $file ); |
| 20 | + if ( $line === false ) { |
| 21 | + echo "Read error\n"; |
| 22 | + exit( 1 ); |
| 23 | + } |
| 24 | + $line = trim( $line ); |
| 25 | + // Remove BOM |
| 26 | + $line = str_replace( "\xef\xbb\xbf", '', $line ); |
| 27 | + |
| 28 | + if ( $line === '' ) { |
| 29 | + continue; |
| 30 | + } |
| 31 | + if ( !preg_match( '/^\[\[(.*)]]$/', $line, $m ) ) { |
| 32 | + echo "Invalid line: $line\n"; |
| 33 | + print bin2hex( $line ) . "\n"; |
| 34 | + continue; |
| 35 | + } |
| 36 | + $brokenTitle = Title::newFromText( $m[1] ); |
| 37 | + if ( !preg_match( '/^Broken\//', $brokenTitle->getDBkey() ) ) { |
| 38 | + echo "Unbroken title: $line\n"; |
| 39 | + continue; |
| 40 | + } |
| 41 | + |
| 42 | + $unbrokenTitle = Title::makeTitleSafe( |
| 43 | + $brokenTitle->getNamespace(), |
| 44 | + preg_replace( '/^Broken\//', '', $brokenTitle->getDBkey() ) ); |
| 45 | + |
| 46 | + # Check that the broken title is a redirect |
| 47 | + $revision = Revision::newFromTitle( $brokenTitle ); |
| 48 | + if ( !$revision ) { |
| 49 | + echo "Does not exist: $line\n"; |
| 50 | + continue; |
| 51 | + } |
| 52 | + $text = $revision->getText(); |
| 53 | + if ( $text === false ) { |
| 54 | + echo "Cannot load text: $line\n"; |
| 55 | + continue; |
| 56 | + } |
| 57 | + $redir = Title::newFromRedirect( $text ); |
| 58 | + if ( !$redir ) { |
| 59 | + echo "Not a redirect: $line\n"; |
| 60 | + continue; |
| 61 | + } |
| 62 | + |
| 63 | + |
| 64 | + if ( $unbrokenTitle->exists() ) { |
| 65 | + # Exists already, just delete this redirect |
| 66 | + $article = new Article( $brokenTitle ); |
| 67 | + $success = $article->doDeleteArticle( 'Redundant redirect' ); |
| 68 | + if ( $success ) { |
| 69 | + echo "Deleted: $line\n"; |
| 70 | + } else { |
| 71 | + echo "Failed to delete: $line\n"; |
| 72 | + } |
| 73 | + } else { |
| 74 | + # Does not exist, move this redirect to the unbroken title |
| 75 | + # Do not leave a redirect behind |
| 76 | + $result = $brokenTitle->moveTo( $unbrokenTitle, /*auth*/ false, |
| 77 | + 'Fixing broken redirect', /*createRedirect*/ false ); |
| 78 | + if ( $result === true ) { |
| 79 | + echo "Moved: $line\n"; |
| 80 | + } else { |
| 81 | + $error = reset( $result ); |
| 82 | + echo "Move error: {$error[0]}: $line\n"; |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + $dbw->commit(); |
| 87 | + sleep( 1 ); |
| 88 | + wfWaitForSlaves( 5 ); |
| 89 | +} |
| 90 | + |
| 91 | + |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/cleanupMl.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 92 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/unsuppressCrossWiki.php |
— | — | @@ -0,0 +1,46 @@ |
| 2 | +<?php |
| 3 | + |
| 4 | +require_once( dirname( __FILE__ ) . '/Maintenance.php' ); |
| 5 | + |
| 6 | +class unsuppressCrossWiki extends Maintenance { |
| 7 | + public function __construct() { |
| 8 | + parent::__construct(); |
| 9 | + $this->mDescription = "Show number of jobs waiting in master database"; |
| 10 | + } |
| 11 | + |
| 12 | + public function execute() { |
| 13 | + $userName = 'The Thing That Should Not Be'; // <- targer username |
| 14 | + |
| 15 | + $user = new CentralAuthUser( $userName ); |
| 16 | + if ( !$user->exists() ) { |
| 17 | + echo "Cannot unsuppress non-existent user {$userName}!\n"; |
| 18 | + exit( 0 ); |
| 19 | + } |
| 20 | + $userName = $user->getName(); // sanity |
| 21 | + $wikis = $user->listAttached(); // wikis with attached accounts |
| 22 | + foreach ( $wikis as $wiki ) { |
| 23 | + $lb = wfGetLB( $wiki ); |
| 24 | + $dbw = $lb->getConnection( DB_MASTER, array(), $wiki ); |
| 25 | + # Get local ID like $user->localUserData( $wiki ) does |
| 26 | + $localUserId = $dbw->selectField( 'user', 'user_id', |
| 27 | + array( 'user_name' => $userName ), __METHOD__ ); |
| 28 | + |
| 29 | + $delUserBit = Revision::DELETED_USER; |
| 30 | + $hiddenCount = $dbw->selectField( 'revision', 'COUNT(*)', |
| 31 | + array( 'rev_user' => $localUserId, "rev_deleted & $delUserBit != 0" ), __METHOD__ ); |
| 32 | + echo "$hiddenCount edits have the username hidden on \"$wiki\"\n"; |
| 33 | + # Unsuppress username on edits |
| 34 | + if ( $hiddenCount > 0 ) { |
| 35 | + echo "Unsuppressed edits of attached account (local id $localUserId) on \"$wiki\"..."; |
| 36 | + IPBlockForm::unsuppressUserName( $userName, $localUserId, $dbw ); |
| 37 | + echo "done!\n\n"; |
| 38 | + } |
| 39 | + $lb->reuseConnection( $dbw ); // not really needed |
| 40 | + # Don't lag too bad |
| 41 | + wfWaitForSlaves( 5 ); |
| 42 | + } |
| 43 | + } |
| 44 | +} |
| 45 | + |
| 46 | +$maintClass = "unsuppressCrossWiki"; |
| 47 | +require_once( DO_MAINTENANCE ); |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/unsuppressCrossWiki.php |
___________________________________________________________________ |
Added: svn:eol-style |
1 | 48 | + native |
Index: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/jobs-loop.sh |
— | — | @@ -0,0 +1,41 @@ |
| 2 | +#!/bin/bash |
| 3 | + |
| 4 | +trap 'kill %-; exit' SIGTERM |
| 5 | +[ ! -z "$1" ] && { |
| 6 | + echo "starting type-specific job runner: $1" |
| 7 | + type=$1 |
| 8 | +} |
| 9 | + |
| 10 | +#types="htmlCacheUpdate sendMail enotifNotify uploadFromUrl fixDoubleRedirect renameUser" |
| 11 | +types="sendMail enotifNotify uploadFromUrl fixDoubleRedirect" |
| 12 | + |
| 13 | +cd `readlink -f /usr/local/apache/common/multiversion` |
| 14 | +while [ 1 ];do |
| 15 | + # Do the prioritised types |
| 16 | + moreprio=y |
| 17 | + while [ -n "$moreprio" ] ; do |
| 18 | + moreprio= |
| 19 | + for type in $types; do |
| 20 | + db=`php -n MWScript.php nextJobDB.php --wiki=aawiki --type="$type"` |
| 21 | + if [ -n "$db" ]; then |
| 22 | + echo "$db $type" |
| 23 | + nice -n 20 php MWScript.php runJobs.php --wiki="$db" --procs=5 --type="$type" --maxtime=300 & |
| 24 | + wait |
| 25 | + moreprio=y |
| 26 | + fi |
| 27 | + done |
| 28 | + done |
| 29 | + |
| 30 | + # Do the remaining types |
| 31 | + db=`php -n MWScript.php nextJobDB.php --wiki=aawiki` |
| 32 | + |
| 33 | + if [ -z "$db" ];then |
| 34 | + # No jobs to do, wait for a while |
| 35 | + echo "No jobs..." |
| 36 | + sleep 5 |
| 37 | + else |
| 38 | + echo "$db" |
| 39 | + nice -n 20 php MWScript.php runJobs.php --wiki="$db" --procs=5 --maxtime=300 & |
| 40 | + wait |
| 41 | + fi |
| 42 | +done |
Property changes on: branches/wmf/1.18wmf1/extensions/WikimediaMaintenance/jobs-loop.sh |
___________________________________________________________________ |
Added: svn:mergeinfo |
1 | 43 | Merged /branches/wmf/1.16wmf4/maintenance/jobs-loop.sh:r67177,69199,76243,77266 |
2 | 44 | Merged /trunk/phase3/maintenance/jobs-loop.sh:r52290,52402,52404,52718,52737,52759,52776,52791,52800,52808,52812-52813,52815-52819,52822,52846,52850,52852-52853,52855-52857,52859,52924,52986,53128-53129,53190,53197,53199,53203-53204,53210-53211,53247,53249,53252,53267,53270,53293,53305,53344,53369,53427,53502-53504,53506,53777,54384,54494,54592,54599-54602,54604,54613,54764,54793,54806,55178,55626,56325,56862,56867,57154-57447,57541,57916,58151,58219,58633,58816,77555,77558-77560,77563-77565,77573 |
3 | 45 | Merged /branches/wmf-deployment/maintenance/jobs-loop.sh:r60970 |
4 | 46 | Merged /branches/REL1_15/phase3/maintenance/jobs-loop.sh:r51646 |
Added: svn:eol-style |
5 | 47 | + native |
Added: svn:executable |
6 | 48 | + * |