Inject DeferredUpdatesManager into DeletePage

And remove hacky conditionals for unit tests. Note that the
isDeletePageUnitTest hack cannot be removed yet due to other
non-DI-friendly dependencies.

Change-Id: I215abd01ee8f4ea96539022147f0ce079cdf6c5e
This commit is contained in:
Daimona Eaytoy 2023-05-30 14:23:52 +02:00
parent 7fe5d4b578
commit b30b837896
4 changed files with 31 additions and 18 deletions

View file

@ -2467,7 +2467,8 @@ return [
$services->getContentLanguage()->getCode()
),
$services->getArchivedRevisionLookup(),
$services->getRestrictionStore()
$services->getRestrictionStore(),
$services->getDeferredUpdatesManager()
);
},

View file

@ -7,7 +7,6 @@ use BagOStuff;
use ChangeTags;
use Content;
use DeferrableUpdate;
use DeferredUpdates;
use DeletePageJob;
use Exception;
use JobQueueGroup;
@ -16,6 +15,7 @@ use ManualLogEntry;
use MediaWiki\Cache\BacklinkCacheFactory;
use MediaWiki\CommentStore\CommentStore;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Deferred\DeferredUpdatesManager;
use MediaWiki\Deferred\LinksUpdate\LinksDeletionUpdate;
use MediaWiki\Deferred\LinksUpdate\LinksUpdate;
use MediaWiki\HookContainer\HookContainer;
@ -91,6 +91,8 @@ class DeletePage {
private $namespaceInfo;
/** @var ITextFormatter */
private $contLangMsgTextFormatter;
/** @var DeferredUpdatesManager */
private DeferredUpdatesManager $deferredUpdatesManager;
/** @var bool */
private $isDeletePageUnitTest = false;
@ -145,6 +147,7 @@ class DeletePage {
* @param BacklinkCacheFactory $backlinkCacheFactory
* @param NamespaceInfo $namespaceInfo
* @param ITextFormatter $contLangMsgTextFormatter
* @param DeferredUpdatesManager $deferredUpdatesManager
* @param ProperPageIdentity $page
* @param Authority $deleter
*/
@ -163,6 +166,7 @@ class DeletePage {
BacklinkCacheFactory $backlinkCacheFactory,
NamespaceInfo $namespaceInfo,
ITextFormatter $contLangMsgTextFormatter,
DeferredUpdatesManager $deferredUpdatesManager,
ProperPageIdentity $page,
Authority $deleter
) {
@ -181,6 +185,7 @@ class DeletePage {
$this->backlinkCacheFactory = $backlinkCacheFactory;
$this->namespaceInfo = $namespaceInfo;
$this->contLangMsgTextFormatter = $contLangMsgTextFormatter;
$this->deferredUpdatesManager = $deferredUpdatesManager;
$this->page = $wikiPageFactory->newFromTitle( $page );
$this->deleter = $deleter;
@ -838,17 +843,14 @@ class DeletePage {
}
// Update site status
if ( !$this->isDeletePageUnitTest ) {
// TODO Remove conditional once DeferredUpdates is servicified (T265749)
DeferredUpdates::addUpdate( SiteStatsUpdate::factory(
[ 'edits' => 1, 'articles' => $countable ? -1 : 0, 'pages' => -1 ]
) );
$this->deferredUpdatesManager->addUpdate( SiteStatsUpdate::factory(
[ 'edits' => 1, 'articles' => $countable ? -1 : 0, 'pages' => -1 ]
) );
// Delete pagelinks, update secondary indexes, etc
$updates = $this->getDeletionUpdates( $page, $revRecord );
foreach ( $updates as $update ) {
DeferredUpdates::addUpdate( $update );
}
// Delete pagelinks, update secondary indexes, etc
$updates = $this->getDeletionUpdates( $page, $revRecord );
foreach ( $updates as $update ) {
$this->deferredUpdatesManager->addUpdate( $update );
}
// Reparse any pages transcluding this page
@ -886,11 +888,8 @@ class DeletePage {
// Reset the page object and the Title object
$page->loadFromRow( false, WikiPage::READ_LATEST );
if ( !$this->isDeletePageUnitTest ) {
// TODO Remove conditional once DeferredUpdates is servicified (T265749)
// Search engine
DeferredUpdates::addUpdate( new SearchUpdate( $page->getId(), $page->getTitle() ) );
}
// Search engine
$this->deferredUpdatesManager->addUpdate( new SearchUpdate( $page->getId(), $page->getTitle() ) );
}
/**
@ -904,6 +903,10 @@ class DeletePage {
* @return DeferrableUpdate[]
*/
public function getDeletionUpdates( WikiPage $page, RevisionRecord $rev ): array {
if ( $this->isDeletePageUnitTest ) {
// Hack: LinksDeletionUpdate reads from the global state in the constructor
return [];
}
$slotContent = array_map( static function ( SlotRecord $slot ) {
return $slot->getContent();
}, $rev->getSlots()->getSlots() );

View file

@ -30,6 +30,7 @@ use MediaWiki\Collation\CollationFactory;
use MediaWiki\CommentStore\CommentStore;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Content\IContentHandlerFactory;
use MediaWiki\Deferred\DeferredUpdatesManager;
use MediaWiki\EditPage\SpamChecker;
use MediaWiki\HookContainer\HookContainer;
use MediaWiki\Permissions\Authority;
@ -155,6 +156,9 @@ class PageCommandFactory implements
/** @var RestrictionStore */
private $restrictionStore;
/** @var DeferredUpdatesManager */
private DeferredUpdatesManager $deferredUpdatesManager;
public function __construct(
Config $config,
LBFactory $lbFactory,
@ -184,7 +188,8 @@ class PageCommandFactory implements
PageUpdaterFactory $pageUpdaterFactory,
ITextFormatter $contLangMsgTextFormatter,
ArchivedRevisionLookup $archivedRevisionLookup,
RestrictionStore $restrictionStore
RestrictionStore $restrictionStore,
DeferredUpdatesManager $deferredUpdatesManager
) {
$this->config = $config;
$this->lbFactory = $lbFactory;
@ -215,6 +220,7 @@ class PageCommandFactory implements
$this->contLangMsgTextFormatter = $contLangMsgTextFormatter;
$this->archivedRevisionLookup = $archivedRevisionLookup;
$this->restrictionStore = $restrictionStore;
$this->deferredUpdatesManager = $deferredUpdatesManager;
}
/**
@ -258,6 +264,7 @@ class PageCommandFactory implements
$this->backlinkCacheFactory,
$this->namespaceInfo,
$this->contLangMsgTextFormatter,
$this->deferredUpdatesManager,
$page,
$deleter
);

View file

@ -9,6 +9,7 @@ use Generator;
use JobQueueGroup;
use MediaWiki\Cache\BacklinkCacheFactory;
use MediaWiki\Config\ServiceOptions;
use MediaWiki\Deferred\DeferredUpdatesManager;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MainConfigNames;
use MediaWiki\Page\DeletePage;
@ -113,6 +114,7 @@ class DeletePageTest extends MediaWikiUnitTestCase {
$this->createMock( BacklinkCacheFactory::class ),
$nsInfo ?? $this->createMock( NamespaceInfo::class ),
$this->createMock( ITextFormatter::class ),
$this->createMock( DeferredUpdatesManager::class ),
$page,
$deleter ?? $this->createMock( Authority::class )
);