protected function rename($row, DatabaseBase $dbw) { $wiki = $row->utr_wiki; $name = $row->utr_name; $newNamePrefix = User::getCanonicalName($name . '~' . str_replace('_', '-', $wiki), 'usable'); if (!$newNamePrefix) { $this->log("ERROR: New name '{$name}~{$wiki}' is not valid"); return; } $this->log("Beginning rename of {$newNamePrefix}"); $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); } if ($newNamePrefix !== $newCAUser->getName()) { $this->log("WARNING: New name is now {$newCAUser->getName()}"); } $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, 'reason' => $this->getOption('reason'))); 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); }