jenkins-bot has submitted this change and it was merged.

Change subject: Add forceRenameUsers.php
......................................................................


Add forceRenameUsers.php

This script forcibly renames and globalizes all users
in the `users_to_rename` table that have already been
notified by a script that is yet to be written.

Change-Id: I4ddffd4f3da5ee986538278e7da350c409713e16
---
M central-auth.sql
M db_patches/patch-users_to_rename.sql
M includes/UsersToRename/UsersToRenameDatabaseUpdates.php
A maintenance/forceRenameUsers.php
4 files changed, 148 insertions(+), 0 deletions(-)

Approvals:
  Aaron Schulz: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/central-auth.sql b/central-auth.sql
index c8a5c46..1438386 100644
--- a/central-auth.sql
+++ b/central-auth.sql
@@ -251,3 +251,4 @@
 
 CREATE UNIQUE INDEX /*i*/utr_user ON /*_*/users_to_rename (utr_name, utr_wiki);
 CREATE INDEX /*i*/utr_notif ON /*_*/users_to_rename (utr_status);
+CREATE INDEX /*i*/utr_wiki ON /*_*/users_to_rename (utr_wiki);
diff --git a/db_patches/patch-users_to_rename.sql 
b/db_patches/patch-users_to_rename.sql
index 24164cb..eb35864 100644
--- a/db_patches/patch-users_to_rename.sql
+++ b/db_patches/patch-users_to_rename.sql
@@ -18,3 +18,4 @@
 
 CREATE UNIQUE INDEX /*i*/utr_user ON /*_*/users_to_rename (utr_name, utr_wiki);
 CREATE INDEX /*i*/utr_notif ON /*_*/users_to_rename (utr_status);
+CREATE INDEX /*i*/utr_wiki ON /*_*/users_to_rename (utr_wiki);
diff --git a/includes/UsersToRename/UsersToRenameDatabaseUpdates.php 
b/includes/UsersToRename/UsersToRenameDatabaseUpdates.php
index fa1de9a..a6f25a2 100644
--- a/includes/UsersToRename/UsersToRenameDatabaseUpdates.php
+++ b/includes/UsersToRename/UsersToRenameDatabaseUpdates.php
@@ -2,6 +2,9 @@
 
 class UsersToRenameDatabaseUpdates {
 
+       const NOTIFIED = 4;
+       const RENAMED = 8;
+
        /**
         * @var DatabaseBase
         */
@@ -11,6 +14,23 @@
                $this->db = $db;
        }
 
+       public function markRenamed( $name, $wiki ) {
+               $this->db->update(
+                       'users_to_rename',
+                       array( 'utr_status' => self::RENAMED ),
+                       array( 'utr_wiki' => $wiki, 'utr_name' => $name ),
+                       __METHOD__
+               );
+       }
+
+       public function remove( $name, $wiki ) {
+               $this->db->delete(
+                       'users_to_rename',
+                       array( 'utr_wiki' => $wiki, 'utr_name' => $name ),
+                       __METHOD__
+               );
+       }
+
        /**
         * @param string $name
         * @param string $wiki
diff --git a/maintenance/forceRenameUsers.php b/maintenance/forceRenameUsers.php
new file mode 100644
index 0000000..0168011
--- /dev/null
+++ b/maintenance/forceRenameUsers.php
@@ -0,0 +1,126 @@
+<?php
+
+$IP = getenv( 'MW_INSTALL_PATH' );
+if ( $IP === false ) {
+       $IP = __DIR__ . '/../../..';
+}
+require_once( "$IP/maintenance/Maintenance.php" );
+
+/**
+ * Starts the process of migrating users who have
+ * unattached accounts to their new names
+ * with globalized accounts.
+ *
+ * Requires populateUsersToRename.php to be run first
+ */
+class ForceRenameUsers extends Maintenance {
+
+       public function __construct() {
+               $this->mDescription = 'Forcibly renames and migrates unattached 
accounts to global ones';
+               $this->addOption( 'dbname', 'Database name of the wiki to 
rename users from', true, true );
+       }
+
+       private function log( $msg ) {
+               wfDebugLog( 'CentralAuthSULRename', $msg );
+               $this->output( $msg . '\n' );
+       }
+
+       public function execute() {
+               $dbw = CentralAuthUser::getCentralDB();
+               $dbr = CentralAuthUser::getCentralSlaveDB();
+               while ( true ) {
+                       $rowsToRename = $this->findUsers( $this->getOption( 
'dbname' ), $dbr, $dbw );
+                       if ( !$rowsToRename ) {
+                               break;
+                       }
+
+                       foreach ( $rowsToRename as $row ) {
+                               $this->rename( $row, $dbw );
+                       }
+
+                       CentralAuthUser::waitForSlaves();
+               }
+       }
+
+       protected function rename( $row, DatabaseBase $dbw ) {
+               $wiki = $row->utr_wiki;
+               $name = $row->utr_name;
+               $newNamePrefix = "$name~$wiki";
+               $newCAUser = new CentralAuthUser( $newNamePrefix );
+               $count = 0;
+               // Edge case: Someone created User:Foo~wiki manually.
+               // So just start appending numbers to the end of the name
+               // until we get one that isn't used.
+               while ( $newCAUser->exists() ) {
+                       $count++;
+                       $newCAUser = new CentralAuthUser( $newNamePrefix . 
(string)$count );
+               }
+               $this->log( "Renaming $name to {$newCAUser->getName()}." );
+
+               $statuses = new GlobalRenameUserStatus( $name );
+               $success = $statuses->setStatuses( array( array(
+                       'ru_wiki' => $wiki,
+                       'ru_oldname' => $name,
+                       'ru_newname' => $newCAUser->getName(),
+                       'ru_status' => 'queued'
+               ) ) );
+
+               if ( !$success ) {
+                       $this->log( "WARNING: Race condition, renameuser_status 
already set for {$newCAUser->getName()}. Skipping." );
+                       return;
+               }
+
+               $this->log( "Set renameuser_status for 
{$newCAUser->getName()}." );
+
+               $job = new LocalRenameUserJob(
+                       Title::newFromText( 'Global rename job' ),
+                       array(
+                               'from' => $name,
+                               'to' => $newCAUser->getName(),
+                               'renamer' => 'Maintenance script',
+                               'movepages' => true,
+                               'suppressredirects' => true,
+                               'promotetoglobal' => true,
+                       )
+               );
+
+               JobQueueGroup::singleton( $row->utr_wiki )->push( $job );
+               $this->log( "Submitted job for {$newCAUser->getName()}." );
+               $updates = new UsersToRenameDatabaseUpdates( $dbw );
+               $updates->markRenamed( $row->utr_name, $row->utr_wiki );
+       }
+
+       /**
+        * @param string $wiki
+        * @param DatabaseBase $dbr
+        * @param DatabaseBase $dbw
+        * @return stdClass[]
+        */
+       protected function findUsers( $wiki, DatabaseBase $dbr, DatabaseBase 
$dbw ) {
+               $rows = $dbr->select(
+                       'users_to_rename',
+                       array( 'utr_name', 'utr_wiki' ),
+                       array( 'utr_status' => 
UsersToRenameDatabaseUpdates::NOTIFIED, 'utr_wiki' => $wiki ),
+                       __METHOD__,
+                       array( 'LIMIT' => 50 )
+               );
+
+               $rowsToRename = array();
+               $updates = new UsersToRenameDatabaseUpdates( $dbw );
+
+               foreach ( $rows as $row ) {
+                       $caUser = new CentralAuthUser( $row->utr_name );
+                       if ( $caUser->attachedOn( $row->utr_wiki ) ) {
+                               $this->output( "'{row->utr_name}' has become 
attached to a global account since the list as last generated." );
+                               $updates->remove( $row->utr_name, 
$row->utr_wiki );
+                       } else {
+                               $rowsToRename[] = $row;
+                       }
+               }
+
+               return $rowsToRename;
+       }
+}
+
+$maintClass = 'ForceRenameUsers';
+require_once RUN_MAINTENANCE_IF_MAIN;

-- 
To view, visit https://gerrit.wikimedia.org/r/161632
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I4ddffd4f3da5ee986538278e7da350c409713e16
Gerrit-PatchSet: 8
Gerrit-Project: mediawiki/extensions/CentralAuth
Gerrit-Branch: master
Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Aaron Schulz <asch...@wikimedia.org>
Gerrit-Reviewer: BryanDavis <bda...@wikimedia.org>
Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to