r106657 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r106656‎ | r106657 | r106658 >
Date:15:14, 19 December 2011
Author:catrope
Status:ok
Tags:
Comment:
1.18wmf1: Copying WikimediaMaintenance extension from trunk
Modified paths:
  • /branches/wmf/1.18wmf1/extensions/WikimediaMaintenance (added) (history)

Diff [purge]

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
1120 + 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
130 + 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
112 + 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
1105 + 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
136 + 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
1186 + Author Date Id Revision
Added: svn:eol-style
2187 + 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
1305 + Author Date Id Revision
Added: svn:eol-style
2306 + 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
141 + 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
165 + 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
1115 + native
Added: svn:executable
2116 + *
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
120 Merged /branches/wmf-deployment/maintenance/storage/make-all-blobs:r60970
221 Merged /branches/REL1_15/phase3/maintenance/storage/make-all-blobs:r51646
322 Merged /branches/wmf/1.16wmf4/maintenance/storage/make-all-blobs:r67177,69199,76243,77266
423 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
524 + native
Added: svn:executable
625 + *
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
1115 + native
Added: svn:executable
2116 + *
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
124 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
225 Merged /branches/wmf-deployment/maintenance/storage/testRctComplete.php:r60970
326 Merged /branches/REL1_15/phase3/maintenance/storage/testRctComplete.php:r51646
427 Merged /branches/wmf/1.16wmf4/maintenance/storage/testRctComplete.php:r67177,69199,76243,77266
Added: svn:eol-style
528 + 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
1291 + Author Date Id Revision
Added: svn:eol-style
2292 + 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
17 + 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
172 + Author Date Id Revision
Added: svn:eol-style
273 + 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
170 + 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
120 + 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
1288 + Author Date Id Revision
Added: svn:eol-style
2289 + 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
1156 + 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
166 + 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
190 + 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
120 + 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
1560 + 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
169 + 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
186 + 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
169 + 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
13 + 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
1310 + 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
193 + 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
1208 + Author Date Id Revision
Added: svn:eol-style
2209 + 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
1288 + 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
121 + Author Date Id Revision
Added: svn:eol-style
222 + 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
192 + 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
148 + 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
143 Merged /branches/wmf/1.16wmf4/maintenance/jobs-loop.sh:r67177,69199,76243,77266
244 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
345 Merged /branches/wmf-deployment/maintenance/jobs-loop.sh:r60970
446 Merged /branches/REL1_15/phase3/maintenance/jobs-loop.sh:r51646
Added: svn:eol-style
547 + native
Added: svn:executable
648 + *

Status & tagging log