MediaWiki  master
rollbackEdits.php
Go to the documentation of this file.
1 <?php
25 require_once __DIR__ . '/Maintenance.php';
26 
33 class RollbackEdits extends Maintenance {
34  public function __construct() {
35  parent::__construct();
36  $this->addDescription(
37  "Rollback all edits by a given user or IP provided they're the most recent edit" );
38  $this->addOption(
39  'titles',
40  'A list of titles, none means all titles where the given user is the most recent',
41  false,
42  true
43  );
44  $this->addOption( 'user', 'A user or IP to rollback all edits for', true, true );
45  $this->addOption( 'summary', 'Edit summary to use', false, true );
46  $this->addOption( 'bot', 'Mark the edits as bot' );
47  }
48 
49  public function execute() {
50  $user = $this->getOption( 'user' );
51  $username = User::isIP( $user ) ? $user : User::getCanonicalName( $user );
52  if ( !$username ) {
53  $this->fatalError( 'Invalid username' );
54  }
55 
56  $bot = $this->hasOption( 'bot' );
57  $summary = $this->getOption( 'summary', $this->mSelf . ' mass rollback' );
58  $titles = [];
59  $results = [];
60  if ( $this->hasOption( 'titles' ) ) {
61  foreach ( explode( '|', $this->getOption( 'titles' ) ) as $title ) {
62  $t = Title::newFromText( $title );
63  if ( !$t ) {
64  $this->error( 'Invalid title, ' . $title );
65  } else {
66  $titles[] = $t;
67  }
68  }
69  } else {
70  $titles = $this->getRollbackTitles( $user );
71  }
72 
73  if ( !$titles ) {
74  $this->output( 'No suitable titles to be rolled back.' );
75 
76  return;
77  }
78 
79  $doer = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
80 
81  foreach ( $titles as $t ) {
82  $page = WikiPage::factory( $t );
83  $this->output( 'Processing ' . $t->getPrefixedText() . '... ' );
84  if ( !$page->commitRollback( $user, $summary, $bot, $results, $doer ) ) {
85  $this->output( "Done!\n" );
86  } else {
87  $this->output( "Failed!\n" );
88  }
89  }
90  }
91 
97  private function getRollbackTitles( $user ) {
98  $dbr = $this->getDB( DB_REPLICA );
99  $titles = [];
100  $actorQuery = ActorMigration::newMigration()
101  ->getWhere( $dbr, 'rev_user', User::newFromName( $user, false ) );
102  $results = $dbr->select(
103  [ 'page', 'revision' ] + $actorQuery['tables'],
104  [ 'page_namespace', 'page_title' ],
105  $actorQuery['conds'],
106  __METHOD__,
107  [],
108  [ 'revision' => [ 'JOIN', 'page_latest = rev_id' ] ] + $actorQuery['joins']
109  );
110  foreach ( $results as $row ) {
111  $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
112  }
113 
114  return $titles;
115  }
116 }
117 
118 $maintClass = RollbackEdits::class;
119 require_once RUN_MAINTENANCE_IF_MAIN;
static factory(Title $title)
Create a WikiPage object of the appropriate class for the given title.
Definition: WikiPage.php:142
const RUN_MAINTENANCE_IF_MAIN
Definition: Maintenance.php:39
error( $err, $die=0)
Throw an error to the user.
static isIP( $name)
Does the string match an anonymous IP address?
Definition: User.php:891
getOption( $name, $default=null)
Get an option, or return the default.
Maintenance script to rollback all edits by a given user or IP provided they&#39;re the most recent edit...
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
Definition: Maintenance.php:86
hasOption( $name)
Checks to see if a particular option exists.
static getCanonicalName( $name, $validate='valid')
Given unvalidated user input, return a canonical username, or false if the username is invalid...
Definition: User.php:1139
static newMigration()
Static constructor.
addDescription( $text)
Set the description text.
$maintClass
output( $out, $channel=null)
Throw some output to the user.
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:586
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
const DB_REPLICA
Definition: defines.php:25
fatalError( $msg, $exitCode=1)
Output a message and terminate the current script.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:515
getRollbackTitles( $user)
Get all pages that should be rolled back for a given user.
getDB( $db, $groups=[], $dbDomain=false)
Returns a database to be used by current maintenance script.
static newSystemUser( $name, $options=[])
Static factory method for creation of a "system" user from username.
Definition: User.php:737
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319