https://www.mediawiki.org/wiki/Special:Code/MediaWiki/101992

Revision: 101992
Author:   ariel
Date:     2011-11-04 14:19:52 +0000 (Fri, 04 Nov 2011)
Log Message:
-----------
allow renames for user with specific uid set in row; minor formatting cleanup; 
refactor (one large function -> several smaller ones)

Modified Paths:
--------------
    trunk/extensions/Renameuser/renameUserCleanup.php

Modified: trunk/extensions/Renameuser/renameUserCleanup.php
===================================================================
--- trunk/extensions/Renameuser/renameUserCleanup.php   2011-11-04 13:59:02 UTC 
(rev 101991)
+++ trunk/extensions/Renameuser/renameUserCleanup.php   2011-11-04 14:19:52 UTC 
(rev 101992)
@@ -35,6 +35,7 @@
                $this->mDescription = "Maintenance script to finish incomplete 
rename user, in particular to reassign edits that were missed";
                $this->addOption( 'olduser', 'Old user name', true, true );
                $this->addOption( 'newuser', 'New user name', true, true );
+               $this->addOption( 'olduid', 'Old user id in revision records 
(DANGEROUS)', false, true );
                $this->mBatchSize = 1000;
        }
 
@@ -42,23 +43,42 @@
                $this->output( "Rename User Cleanup starting...\n\n" );
                $olduser = User::newFromName( $this->getOption( 'olduser' ) );
                $newuser = User::newFromName( $this->getOption( 'newuser' ) );
+               $olduid = $this->getOption( 'olduid' );
 
+               $this->checkUserExistence( $olduser, $newuser );
+               $this->checkRenameLog( $olduser, $newuser );
+
+               if ( $olduid ) {
+                       $this->doUpdates( $olduser, $newuser, $olduid, $dbw );
+               }
+               $this->doUpdates( $olduser, $newuser, $newuser->getId(), $dbw );
+               $this->doUpdates( $olduser, $newuser, 0, $dbw );
+               
+               print "Done!\n";
+               exit(0);
+       }
+
+
+       public function checkUserExistence( $olduser, $newuser ) {
                if ( !$newuser->getId() ) {
                        $this->error( "No such user: " . $this->getOption( 
'newuser' ), true );
                        exit(1);
                }
                if ($olduser->getId() ) {
-                       print( "WARNING!!: Old user still exists: " . 
$this->getOption( 'olduser' ) . "\n");
-                       print("proceed anyways? We'll only re-attribute edits 
that have the new user uid (or 0) and the old user name.  [N/y]  ");
+                       print "WARNING!!: Old user still exists: " . 
$this->getOption( 'olduser' ) . "\n";
+                       print "proceed anyways? We'll only re-attribute edits 
that have the new user uid (or 0)";
+                       print " or the uid specified by the caller, and the old 
user name.  [N/y]   ";
                        $stdin = fopen ("php://stdin","rt");
                        $line = fgets($stdin);
                        fclose($stdin);
                        if ( $line[0] != "Y" && $line[0] != "y" ) {
-                               print("Exiting at user's request\n");
+                               print "Exiting at user's request\n";
                                exit(0);
                        }
                }
+       }
 
+       public function checkRenameLog( $olduser, $newuser ) {
                $dbr = wfGetDB( DB_SLAVE );
                $result = $dbr->select( 'logging', '*',
                        array( 'log_type' => 'renameuser',
@@ -80,130 +100,111 @@
                                __METHOD__
                        );
                        if (! $result ||  ! $result->numRows() ) {
-                               print("No log entry found for a rename of 
".$olduser->getName()." to ".$newuser->getName().", proceed anyways??? [N/y] ");
+                               print "No log entry found for a rename of 
".$olduser->getName()." to ".$newuser->getName().", proceed anyways??? [N/y] ";
                                $stdin = fopen ("php://stdin","rt");
                                $line = fgets($stdin);
                                fclose($stdin);
                                if ( $line[0] != "Y" && $line[0] != "y" ) {
-                                       print("Exiting at user's request\n");
+                                       print "Exiting at user's request\n";
                                        exit(1);
                                }
                        }
                        else {
                                foreach ( $result as $row ) {
-                                       print("Found possible log entry of the 
rename, please check: ".$row->log_title." with comment ".$row->log_comment." on 
$row->log_timestamp\n");
+                                       print "Found possible log entry of the 
rename, please check: ".$row->log_title." with comment ".$row->log_comment." on 
$row->log_timestamp\n";
                                }
                        }
                }
                else {
                        foreach ( $result as $row ) {
-                               print("Found log entry of the rename: 
".$olduser->getName()." to ".$newuser->getName()." on $row->log_timestamp\n");
+                               print "Found log entry of the rename: 
".$olduser->getName()." to ".$newuser->getName()." on $row->log_timestamp\n";
                        }
                }
                if ($result && $result->numRows() > 1) {
-                       print("More than one rename entry found in the log, not 
sure what to do. Continue anyways? [N/y]  ");
+                       print "More than one rename entry found in the log, not 
sure what to do. Continue anyways? [N/y]  ";
                        $stdin = fopen ("php://stdin","rt");
                        $line = fgets($stdin);
                        fclose($stdin);
                        if ( $line[0] != "Y" && $line[0] != "y" ) {
-                               print("Exiting at user's request\n");
+                               print "Exiting at user's request\n";
                                exit(1);
                        }
                }
-               $dbw = wfGetDB( DB_MASTER );
+       }
 
-               $this->updateTable('revision', 'rev_user_text', 'rev_user', 
'rev_timestamp', $olduser, $newuser, $dbw);
-               $this->updateTable('archive', 'ar_user_text', 'ar_user', 
'ar_timestamp',  $olduser, $newuser, $dbw);
-               $this->updateTable('logging', 'log_user_text', 'log_user', 
'log_timestamp', $olduser, $newuser, $dbw);
-               $this->updateTable('image', 'img_user_text', 'img_user', 
'img_timestamp', $olduser, $newuser, $dbw);
-               $this->updateTable('oldimage', 'oi_user_text', 'oi_user', 
'oi_timestamp', $olduser, $newuser, $dbw);
-               $this->updateTable('filearchive', 'fa_user_text','fa_user', 
'fa_timestamp', $olduser, $newuser, $dbw);
-               print "Done!\n";
-               exit(0);
+
+       public function doUpdates( $olduser, $newuser, $uid, $dbw ) {
+               $this->updateTable( 'revision', 'rev_user_text', 'rev_user', 
'rev_timestamp', $olduser, $newuser, $uid );
+               $this->updateTable( 'archive', 'ar_user_text', 'ar_user', 
'ar_timestamp',  $olduser, $newuser, $uid );
+               $this->updateTable( 'logging', 'log_user_text', 'log_user', 
'log_timestamp', $olduser, $newuser, $uid );
+               $this->updateTable( 'image', 'img_user_text', 'img_user', 
'img_timestamp', $olduser, $newuser, $uid );
+               $this->updateTable( 'oldimage', 'oi_user_text', 'oi_user', 
'oi_timestamp', $olduser, $newuser, $uid );
+               $this->updateTable( 'filearchive', 'fa_user_text','fa_user', 
'fa_timestamp', $olduser, $newuser, $uid );
        }
 
-       public function 
updateTable($table,$usernamefield,$useridfield,$timestampfield,$olduser,$newuser,$dbw)
 {
-               $doUid = 0;
+       public function updateTable( 
$table,$usernamefield,$useridfield,$timestampfield,$olduser,$newuser,$uid ) {
+               $dbw = wfGetDB( DB_MASTER );
 
                $contribs = $dbw->selectField( $table, 'count(*)',
-                       array( $usernamefield => $olduser->getName(), 
$useridfield => $newuser->getId() ), __METHOD__ );
-               if ($contribs == 0) {
-                       $contribs = $dbw->selectField( $table, 'count(*)',
-                               array( $usernamefield => $olduser->getName(), 
$useridfield => 0 ), __METHOD__ );
-                       if ($contribs > 0) {
-                               print("Found $contribs edits to be 
re-attributed from table $table but the uid present is 0 (should be 
".$newuser->getId().")\n");
-                               print("If you proceed, the uid field will be 
set to that of the new user name (i.e. ".$newuser->getId().") in these 
rows.\n");
-                               $doUid = 1;
-                       }
-                       else {
-                               print("No edits to be re-attributed from table 
$table\n");
-                               return(0);
-                       }
+                       array( $usernamefield => $olduser->getName(), 
$useridfield => $uid ), __METHOD__ );
+
+               if ( $contribs == 0 ) {
+                       print "No edits to be re-attributed from table 
$table\n" ;
+                       return(0);
                }
-               else {
-                       print("total number of edits to be re-attributed from 
table $table: $contribs\n");
+
+               print "Found $contribs edits to be re-attributed from table 
$table for uid $uid\n";
+               if ( $uid != $newuser->getId() ) {
+                       print "If you proceed, the uid field will be set to 
that of the new user name (i.e. ".$newuser->getId().") in these rows.\n";
                }
-               print("proceed? [N/y]  ");
+
+               print "Proceed? [N/y]  ";
                $stdin = fopen ("php://stdin","rt");
                $line = fgets($stdin);
                fclose($stdin);
                if ( $line[0] != "Y" && $line[0] != "y" ) {
-                       print("skipping at user's request\n");
+                       print "Skipping at user's request\n";
                        return(0);
                }
-               $selectConds = array( $usernamefield => $olduser->getName() );
-               $updateFields = array( $usernamefield => $newuser->getName() );
-               $updateConds = array( $usernamefield => $olduser->getName() );
 
-               $extraConds = array( $useridfield => $newuser->getId() );
-               $extraCondsNoUid = array( $useridfield => 0 );
-               # uid in rows is set properly, use as cond to find rows, don't 
bother to update it
-               if (! $doUid) {
-                       $selectConds = array_merge( $selectConds, $extraConds );
-                       $updateConds =  array_merge( $updateConds, $extraConds 
);
-               }
-               # uid in edit rows is 0, we will set it and we will only update 
rows with 0 uid and the old user name
-               else {
-                       $selectConds = array_merge( $selectConds, 
$extraCondsNoUid );
-                       $updateConds =  array_merge( $updateConds, 
$extraCondsNoUid );
-                       $updateFields = array_merge( $updateFields, $extraConds 
);
-               }
+               $selectConds = array( $usernamefield => $olduser->getName(), 
$useridfield => $uid );
+               $updateFields = array( $usernamefield => $newuser->getName(), 
$useridfield => $newuser->getId() );
 
-               while ($contribs > 0) {
-                       print("doing batch of up to approximately 
".$this->mBatchSize."\n");
-                       print("do this batch? [N/y]  ");
+               while ( $contribs > 0 ) {
+                       print "Doing batch of up to approximately 
".$this->mBatchSize."\n";
+                       print "Do this batch? [N/y]  ";
                        $stdin = fopen ("php://stdin","rt");
                        $line = fgets($stdin);
                        fclose($stdin);
                        if ( $line[0] != "Y" && $line[0] != "y" ) {
-                               print("skipping at user's request\n");
+                               print "Skipping at user's request\n";
                                return(0);
                        }
                        $dbw->begin();
                        $result = $dbw->select( $table, $timestampfield, 
$selectConds , __METHOD__,
                                array( 'ORDER BY' => $timestampfield.' DESC', 
'LIMIT' => $this->mBatchSize ) );
                        if (! $result) {
-                               print("There were rows for updating but now 
they are gone. Skipping.\n");
+                               print "There were rows for updating but now 
they are gone. Skipping.\n";
                                $dbw->rollback();
                                return(0);
                        }
                        $result->seek($result->numRows() -1 );
                        $row = $result->fetchObject();
                        $timestamp = $row->$timestampfield;
-                       $updateCondsWithTime = array_merge( $updateConds, array 
("$timestampfield >= $timestamp") );
+                       $updateCondsWithTime = array_merge( $selectConds, array 
("$timestampfield >= $timestamp") );
                        $success = $dbw->update( $table, $updateFields, 
$updateCondsWithTime, __METHOD__ );
-                       if ($success) {
+                       if ( $success ) {
                                $rowsDone = $dbw->affectedRows();
                                $dbw->commit();
                        }
                        else {
-                               print("problem with the update, rolling back 
and exiting\n");
+                               print "Problem with the update, rolling back 
and exiting\n";
                                $dbw->rollback();
                                exit(1);
                        }
                        //$contribs = User::edits( $olduser->getId() );
                        $contribs = $dbw->selectField( $table, 'count(*)', 
$selectConds, __METHOD__ );
-                       print("updated $rowsDone edits; $contribs edits 
remaining to be re-attributed\n");
+                       print "Updated $rowsDone edits; $contribs edits 
remaining to be re-attributed\n";
                }
                return(0);
        }


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to