26require_once __DIR__ .
'/Maintenance.php';
36 parent::__construct();
37 $this->
addDescription(
'Reassign edits from one user to another' );
38 $this->
addOption(
"force",
"Reassign even if the target user doesn't exist" );
39 $this->
addOption(
"norc",
"Don't update the recent changes table" );
40 $this->
addOption(
"report",
"Print out details of what would be changed, but don't update it" );
41 $this->
addArg(
'from',
'Old user to take edits from' );
42 $this->
addArg(
'to',
'New user to give edits to' );
47 # Set up the users involved
51 # If the target doesn't exist, and --force is not set, stop here
52 if ( $to->getId() || $this->hasOption(
'force' ) ) {
56 # If reporting, and there were items, advise the user to run without --report
58 $this->
output(
"Run the script again without --report to update.\n" );
61 $ton = $to->getName();
62 $this->
error(
"User '{$ton}' not found." );
81 $this->
output(
"Checking current edits..." );
82 $revQueryInfo = ActorMigration::newMigration()->getWhere( $dbw,
'rev_user', $from );
84 [
'revision' ] + $revQueryInfo[
'tables'],
86 $revQueryInfo[
'conds'],
89 $revQueryInfo[
'joins']
91 $row = $dbw->fetchObject(
$res );
93 $this->
output(
"found {$cur}.\n" );
95 $this->
output(
"Checking deleted edits..." );
96 $arQueryInfo = ActorMigration::newMigration()->getWhere( $dbw,
'ar_user', $from,
false );
98 [
'archive' ] + $arQueryInfo[
'tables'],
100 $arQueryInfo[
'conds'],
103 $arQueryInfo[
'joins']
105 $row = $dbw->fetchObject(
$res );
107 $this->
output(
"found {$del}.\n" );
109 # Don't count recent changes if we're not supposed to
111 $this->
output(
"Checking recent changes..." );
112 $rcQueryInfo = ActorMigration::newMigration()->getWhere( $dbw,
'rc_user', $from,
false );
114 [
'recentchanges' ] + $rcQueryInfo[
'tables'],
116 $rcQueryInfo[
'conds'],
119 $rcQueryInfo[
'joins']
121 $row = $dbw->fetchObject(
$res );
123 $this->
output(
"found {$rec}.\n" );
128 $total = $cur + $del + $rec;
129 $this->
output(
"\nTotal entries to change: {$total}\n" );
134 $this->
output(
"\nReassigning current edits..." );
136 'revision_actor_temp',
137 [
'revactor_actor' => $to->getActorId( $dbw ) ],
138 [
'revactor_actor' => $from->getActorId() ],
141 $this->
output(
"done.\nReassigning deleted edits..." );
142 $dbw->update(
'archive',
143 [
'ar_actor' => $to->getActorId( $dbw ) ],
144 [ $arQueryInfo[
'conds'] ], __METHOD__ );
145 $this->
output(
"done.\n" );
146 # Update recent changes if required
148 $this->
output(
"Updating recent changes..." );
149 $dbw->update(
'recentchanges',
150 [
'rc_actor' => $to->getActorId( $dbw ) ],
151 [ $rcQueryInfo[
'conds'] ], __METHOD__ );
152 $this->
output(
"done.\n" );
const RUN_MAINTENANCE_IF_MAIN
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
error( $err, $die=0)
Throw an error to the user.
addArg( $arg, $description, $required=true)
Add some args that are needed.
beginTransaction(IDatabase $dbw, $fname)
Begin a transcation on a DB.
commitTransaction(IDatabase $dbw, $fname)
Commit the transcation on a DB handle and wait for replica DBs to catch up.
output( $out, $channel=null)
Throw some output to the user.
hasArg( $argId=0)
Does a given argument exist?
hasOption( $name)
Checks to see if a particular option exists.
getArg( $argId=0, $default=null)
Get an argument.
addDescription( $text)
Set the description text.
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
fatalError( $msg, $exitCode=1)
Output a message and terminate the current script.
Maintenance script that reassigns edits from a user or IP address to another user.
execute()
Do the actual work.
__construct()
Default constructor.
initialiseUser( $username)
Initialise the user object.
doReassignEdits(&$from, &$to, $rc=false, $report=false)
Reassign edits from one user to another.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
static isIP( $name)
Does the string match an anonymous IP address?