<?php
/**
- *
- *
- * Created on Dec 29, 2015
- *
* Copyright © 2015 Geoffrey Mon <geofbot@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
*
* @file
*/
+use MediaWiki\MediaWikiServices;
use Wikimedia\Timestamp\TimestampException;
use Wikimedia\Rdbms\IDatabase;
*/
class MergeHistory {
- /** @const int Maximum number of revisions that can be merged at once */
+ /** Maximum number of revisions that can be merged at once */
const REVISION_LIMIT = 5000;
/** @var Title Page from which history will be merged */
/** @var MWTimestamp|bool Timestamp upto which history from the source will be merged */
protected $timestampLimit;
- /** @var integer Number of revisions merged (for Special:MergeHistory success message) */
+ /** @var int Number of revisions merged (for Special:MergeHistory success message) */
protected $revisionsMerged;
/**
// Convert into a Status object
if ( $errors ) {
foreach ( $errors as $error ) {
- call_user_func_array( [ $status, 'fatal' ], $error );
+ $status->fatal( ...$error );
}
}
return $permCheck;
}
+ $this->dbw->startAtomic( __METHOD__ );
+
$this->dbw->update(
'revision',
[ 'rev_page' => $this->dest->getArticleID() ],
// Check if this did anything
$this->revisionsMerged = $this->dbw->affectedRows();
if ( $this->revisionsMerged < 1 ) {
+ $this->dbw->endAtomic( __METHOD__ );
$status->fatal( 'mergehistory-fail-no-change' );
+
return $status;
}
// Make the source page a redirect if no revisions are left
- $haveRevisions = $this->dbw->selectField(
+ $haveRevisions = $this->dbw->lockForUpdate(
'revision',
- 'rev_timestamp',
[ 'rev_page' => $this->source->getArticleID() ],
- __METHOD__,
- [ 'FOR UPDATE' ]
+ __METHOD__
);
if ( !$haveRevisions ) {
if ( $reason ) {
}
$this->dest->invalidateCache(); // update histories
+ // Duplicate watchers of the old article to the new article on history merge
+ $store = MediaWikiServices::getInstance()->getWatchedItemStore();
+ $store->duplicateAllAssociatedEntries( $this->source, $this->dest );
+
// Update our logs
$logEntry = new ManualLogEntry( 'merge', 'merge' );
$logEntry->setPerformer( $user );
Hooks::run( 'ArticleMergeComplete', [ $this->source, $this->dest ] );
+ $this->dbw->endAtomic( __METHOD__ );
+
return $status;
}
}