* (bug 7859) Update Kazakh translations
[lhc/web/wiklou.git] / maintenance / namespaceDupes.php
index 94e43bc..c5c1ec5 100644 (file)
@@ -1,76 +1,96 @@
 <?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 
+# 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.,
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 # http://www.gnu.org/copyleft/gpl.html
 
-$options = array( 'fix' );
+$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 ) {
+
+       function checkAll( $fix, $suffix = '' ) {
                global $wgContLang;
                $spaces = $wgContLang->getNamespaces();
                $ok = true;
                foreach( $spaces as $ns => $name ) {
-                       $ok = $this->checkNamespace( $ns, $name, $fix ) && $ok;
+                       $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
                }
                return $ok;
        }
-       
-       function checkNamespace( $ns, $name, $fix ) {
+
+       function checkNamespace( $ns, $name, $fix, $suffix = '' ) {
                echo "Checking namespace $ns: \"$name\"\n";
                if( $name == '' ) {
                        echo "... skipping article namespace\n";
-                       return;
+                       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 );
+                       $resolvable = $this->reportConflict( $row, $suffix );
                        $ok = $ok && $resolvable;
-                       if( $fix && $resolvable ) {
-                               $ok = $this->resolveConflict( $row ) && $ok;
+                       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,
@@ -78,27 +98,27 @@ class NamespaceConflictChecker {
                          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 ) {
-               $newTitle = Title::makeTitle( $row->namespace, $row->title );
+
+       function reportConflict( $row, $suffix ) {
+               $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
                printf( "... %d (0,\"%s\") -> (%d,\"%s\") [[%s]]\n",
                        $row->id,
                        $row->oldtitle,
-                       $row->namespace,
-                       $row->title,
+                       $newTitle->getNamespace(),
+                       $newTitle->getDbKey(),
                        $newTitle->getPrefixedText() );
-               
+
                $id = $newTitle->getArticleId();
                if( $id ) {
                        echo "...  *** cannot resolve automatically; page exists with ID $id ***\n";
@@ -107,9 +127,14 @@ class NamespaceConflictChecker {
                        return true;
                }
        }
-       
-       function resolveConflict( $row ) {
-               $tables = $this->newSchema() 
+
+       function resolveConflict( $row, $resolvable, $suffix ) {
+               if( !$resolvable ) {
+                       $row->title .= $suffix;
+                       $title = Title::makeTitleSafe( $row->namespace, $row->title );
+                       echo "...  *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n";
+               }
+               $tables = $this->newSchema()
                        ? array( 'page' )
                        : array( 'cur', 'old' );
                foreach( $tables as $table ) {
@@ -117,34 +142,27 @@ class NamespaceConflictChecker {
                }
                return true;
        }
-       
+
        function resolveConflictOn( $row, $table ) {
                $fname = 'NamespaceConflictChecker::resolveConflictOn';
                echo "... resolving on $table... ";
+               $newTitle = Title::makeTitleSafe( $row->namespace, $row->title );
                $this->db->update( $table,
                        array(
-                               "{$table}_namespace" => $row->namespace,
-                               "{$table}_title"     => $row->title,
+                               "{$table}_namespace" => $newTitle->getNamespace(),
+                               "{$table}_title"     => $newTitle->getDbKey(),
                        ),
                        array(
                                "{$table}_namespace" => 0,
                                "{$table}_title"     => $row->oldtitle,
                        ),
                        $fname );
+               echo "ok.\n";
                return true;
        }
-       
+
        function newSchema() {
-               global $wgVersion;
-               return version_compare( $wgVersion, '1.5alpha', 'ge' );
-       }
-       
-       function pageTable() {
-               if( $this->newSchema() ) {
-                       return 'page';
-               } else {
-                       return 'cur';
-               }
+               return class_exists( 'Revision' );
        }
 }
 
@@ -154,9 +172,17 @@ class NamespaceConflictChecker {
 $wgTitle = Title::newFromText( 'Namespace title conflict cleanup script' );
 
 $fix = isset( $options['fix'] );
-$dbw =& wfGetDB( DB_MASTER );
+$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 );
-$retval = $duper->checkAll( $fix );
+
+if( $prefix ) {
+       $retval = $duper->checkPrefix( $key, $prefix, $fix, $suffix );
+} else {
+       $retval = $duper->checkAll( $fix, $suffix );
+}
 
 if( $retval ) {
        echo "\nLooks good!\n";
@@ -166,4 +192,4 @@ if( $retval ) {
        exit( -1 );
 }
 
-?>
\ No newline at end of file
+?>