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