diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2006-10-11 18:12:39 +0000 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2006-10-11 18:12:39 +0000 |
commit | 183851b06bd6c52f3cae5375f433da720d410447 (patch) | |
tree | a477257decbf3360127f6739c2f9d0ec57a03d39 /maintenance/namespaceDupes.php |
MediaWiki 1.7.1 wiederhergestellt
Diffstat (limited to 'maintenance/namespaceDupes.php')
-rw-r--r-- | maintenance/namespaceDupes.php | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/maintenance/namespaceDupes.php b/maintenance/namespaceDupes.php new file mode 100644 index 00000000..ad56eee7 --- /dev/null +++ b/maintenance/namespaceDupes.php @@ -0,0 +1,194 @@ +<?php +# Copyright (C) 2005 Brion Vibber <brion@pobox.com> +# http://www.mediawiki.org/ +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# http://www.gnu.org/copyleft/gpl.html + +$options = array( 'fix', 'suffix', 'help' ); + +/** */ +require_once( 'commandLine.inc' ); +#require_once( 'maintenance/userDupes.inc' ); + +if(isset( $options['help'] ) ) { +print <<<END +usage: namespaceDupes.php [--fix] [--suffix=<text>] [--help] + --help : this help message + --fix : attempt to automatically fix errors + --suffix=<text> : dupes will be renamed with correct namespace with <text> + appended after the article name. + +END; +die; +} + +class NamespaceConflictChecker { + function NamespaceConflictChecker( &$db ) { + $this->db =& $db; + } + + function checkAll( $fix, $suffix = '' ) { + global $wgContLang; + $spaces = $wgContLang->getNamespaces(); + $ok = true; + foreach( $spaces as $ns => $name ) { + $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok; + } + return $ok; + } + + function checkNamespace( $ns, $name, $fix, $suffix = '' ) { + echo "Checking namespace $ns: \"$name\"\n"; + if( $name == '' ) { + echo "... skipping article namespace\n"; + return true; + } + + $conflicts = $this->getConflicts( $ns, $name ); + $count = count( $conflicts ); + if( $count == 0 ) { + echo "... no conflicts detected!\n"; + return true; + } + + echo "... $count conflicts detected:\n"; + $ok = true; + foreach( $conflicts as $row ) { + $resolvable = $this->reportConflict( $row, $suffix ); + $ok = $ok && $resolvable; + if( $fix && ( $resolvable || $suffix != '' ) ) { + $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok; + } + } + return $ok; + } + + /** + * @fixme: do this for reals + */ + function checkPrefix( $key, $prefix, $fix, $suffix = '' ) { + echo "Checking prefix \"$prefix\" vs namespace $key\n"; + return $this->checkNamespace( $key, $prefix, $fix, $suffix ); + } + + function getConflicts( $ns, $name ) { + $page = $this->newSchema() ? 'page' : 'cur'; + $table = $this->db->tableName( $page ); + + $prefix = $this->db->strencode( $name ); + $likeprefix = str_replace( '_', '\\_', $prefix); + + $sql = "SELECT {$page}_id AS id, + {$page}_title AS oldtitle, + $ns AS namespace, + TRIM(LEADING '$prefix:' FROM {$page}_title) AS title + FROM {$table} + WHERE {$page}_namespace=0 + AND {$page}_title LIKE '$likeprefix:%'"; + + $result = $this->db->query( $sql, 'NamespaceConflictChecker::getConflicts' ); + + $set = array(); + while( $row = $this->db->fetchObject( $result ) ) { + $set[] = $row; + } + $this->db->freeResult( $result ); + + return $set; + } + + function reportConflict( $row, $suffix ) { + $newTitle = Title::makeTitle( $row->namespace, $row->title ); + printf( "... %d (0,\"%s\") -> (%d,\"%s\") [[%s]]\n", + $row->id, + $row->oldtitle, + $row->namespace, + $row->title, + $newTitle->getPrefixedText() ); + + $id = $newTitle->getArticleId(); + if( $id ) { + echo "... *** cannot resolve automatically; page exists with ID $id ***\n"; + return false; + } else { + return true; + } + } + + function resolveConflict( $row, $resolvable, $suffix ) { + if( !$resolvable ) { + $row->title .= $suffix; + $title = Title::makeTitle( $row->namespace, $row->title ); + echo "... *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n"; + } + $tables = $this->newSchema() + ? array( 'page' ) + : array( 'cur', 'old' ); + foreach( $tables as $table ) { + $this->resolveConflictOn( $row, $table ); + } + return true; + } + + function resolveConflictOn( $row, $table ) { + $fname = 'NamespaceConflictChecker::resolveConflictOn'; + echo "... resolving on $table... "; + $this->db->update( $table, + array( + "{$table}_namespace" => $row->namespace, + "{$table}_title" => $row->title, + ), + array( + "{$table}_namespace" => 0, + "{$table}_title" => $row->oldtitle, + ), + $fname ); + echo "ok.\n"; + return true; + } + + function newSchema() { + return class_exists( 'Revision' ); + } +} + + + + +$wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' ); + +$fix = isset( $options['fix'] ); +$suffix = isset( $options['suffix'] ) ? $options['suffix'] : ''; +$prefix = isset( $options['prefix'] ) ? $options['prefix'] : ''; +$key = isset( $options['key'] ) ? intval( $options['key'] ) : 0; +$dbw =& wfGetDB( DB_MASTER ); +$duper = new NamespaceConflictChecker( $dbw ); + +if( $prefix ) { + $retval = $duper->checkPrefix( $key, $prefix, $fix, $suffix ); +} else { + $retval = $duper->checkAll( $fix, $suffix ); +} + +if( $retval ) { + echo "\nLooks good!\n"; + exit( 0 ); +} else { + echo "\nOh noeees\n"; + exit( -1 ); +} + +?> |