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 <[email protected]>
Gerrit-Reviewer: Aaron Schulz <[email protected]>
Gerrit-Reviewer: BryanDavis <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits