jenkins-bot has submitted this change and it was merged. Change subject: Add TitleMoveComplete hook ......................................................................
Add TitleMoveComplete hook Change-Id: If35ad0903336b01fff18925f2677e8a03e00f381 --- M extension.json M src/CognateHooks.php M src/hooks/CognatePageHookHandler.php M tests/phpunit/hooks/CognatePageHookHandlerTest.php 4 files changed, 139 insertions(+), 3 deletions(-) Approvals: WMDE-leszek: Looks good to me, approved jenkins-bot: Verified diff --git a/extension.json b/extension.json index f544dfb..77d8e0c 100644 --- a/extension.json +++ b/extension.json @@ -26,6 +26,7 @@ "LanguageLinks": [ "CognateHooks::onLanguageLinks" ], "WikiPageDeletionUpdates": [ "CognateHooks::onWikiPageDeletionUpdates" ], "ArticleUndelete": [ "CognateHooks::onArticleUndelete" ], + "TitleMoveComplete": [ "CognateHooks::onTitleMoveComplete" ], "LoadExtensionSchemaUpdates": [ "CognateHooks::onLoadExtensionSchemaUpdates" ], "UnitTestsList": [ "CognateHooks::onUnitTestsList" ] }, diff --git a/src/CognateHooks.php b/src/CognateHooks.php index 9bc2d4b..18b9f8b 100644 --- a/src/CognateHooks.php +++ b/src/CognateHooks.php @@ -37,6 +37,17 @@ return true; } + public static function onTitleMoveComplete() { + call_user_func_array( + [ + MediaWikiServices::getInstance()->getService( 'CognatePageHookHandler' ), + 'onTitleMoveComplete' + ], + func_get_args() + ); + return true; + } + /** * @param Title $title * @param array $links diff --git a/src/hooks/CognatePageHookHandler.php b/src/hooks/CognatePageHookHandler.php index ae09a79..8d7a433 100644 --- a/src/hooks/CognatePageHookHandler.php +++ b/src/hooks/CognatePageHookHandler.php @@ -123,6 +123,38 @@ } /** + * Occurs whenever a request to move an article is completed, after the database transaction commits. + * @see https://www.mediawiki.org/wiki/Manual:Hooks/TitleMoveComplete + * + * @param Title $title + * @param Title $newTitle + * @param User $user + * @param int $oldid + * @param int $newid + * @param string $reason + * @param Revision $revision + */ + public function onTitleMoveComplete( + Title $title, + Title $newTitle, + User $user, + $oldid, + $newid, + $reason, + Revision $revision + ) { + $oldTitleValue = $title->getTitleValue(); + $newTitleValue = $newTitle->getTitleValue(); + $store = $this->getStore(); + if ( $this->isActionableTarget( $oldTitleValue ) ) { + $store->deletePage( $this->languageCode, $oldTitleValue ); + } + if ( $this->isActionableTarget( $newTitleValue ) ) { + $store->savePage( $this->languageCode, $newTitleValue ); + } + } + + /** * Actionable targets have a namespace id that is: * - One of the default MediaWiki (between NS_MAIN and NS_CATEGORY_TALK * - Defined as a namespace to record in the configuration diff --git a/tests/phpunit/hooks/CognatePageHookHandlerTest.php b/tests/phpunit/hooks/CognatePageHookHandlerTest.php index 3e40c4d..a5b87fe 100644 --- a/tests/phpunit/hooks/CognatePageHookHandlerTest.php +++ b/tests/phpunit/hooks/CognatePageHookHandlerTest.php @@ -45,7 +45,7 @@ $this->store->expects( $this->never() ) ->method( 'savePage' ); - $this->call_onPageContentSaveComplete( [ 120 ], 'abc2', new TitleValue( 0, 'ArticleDbKey' ) ); + $this->call_onPageContentSaveComplete( [ NS_PROJECT ], 'abc2', new TitleValue( 0, 'ArticleDbKey' ) ); } /** @@ -101,7 +101,7 @@ ->method( 'savePage' ); $updates = $this->call_onWikiPageDeletionUpdates( - [ 120 ], + [ NS_PROJECT ], 'abc2', new TitleValue( 0, 'ArticleDbKey' ) ); @@ -162,7 +162,7 @@ ->method( 'savePage' ); $this->call_onArticleUndelete( - [ 120 ], + [ NS_PROJECT ], 'abc2', new TitleValue( 0, 'ArticleDbKey' ) ); @@ -185,4 +185,96 @@ ); } + public function test_onTitleMoveComplete_namespaceMatch() { + $this->store->expects( $this->once() ) + ->method( 'deletePage' ) + ->with( 'abc2', new TitleValue( 0, 'ArticleDbKeyOld' ) ); + $this->store->expects( $this->once() ) + ->method( 'savePage' ) + ->with( 'abc2', new TitleValue( 0, 'ArticleDbKeyNew' ) ); + + $this->call_onTitleMoveComplete( + [ 0 ], + 'abc2', + new TitleValue( 0, 'ArticleDbKeyOld' ), + new TitleValue( 0, 'ArticleDbKeyNew' ) + ); + } + + public function test_onTitleMoveComplete_noNamespaceMatch() { + $this->store->expects( $this->never() ) + ->method( 'deletePage' ); + $this->store->expects( $this->never() ) + ->method( 'savePage' ); + + $this->call_onTitleMoveComplete( + [ NS_PROJECT ], + 'abc2', + new TitleValue( 0, 'ArticleDbKeyOld' ), + new TitleValue( 0, 'ArticleDbKeyNew' ) + ); + } + + public function test_onTitleMoveComplete_namespaceMatchOld() { + $this->store->expects( $this->once() ) + ->method( 'deletePage' ) + ->with( 'abc2', new TitleValue( NS_PROJECT, 'ArticleDbKeyOld' ) ); + $this->store->expects( $this->never() ) + ->method( 'savePage' ); + + $this->call_onTitleMoveComplete( + [ NS_PROJECT ], + 'abc2', + new TitleValue( NS_PROJECT, 'ArticleDbKeyOld' ), + new TitleValue( 0, 'ArticleDbKeyNew' ) + ); + } + + public function test_onTitleMoveComplete_namespaceMatchNew() { + $this->store->expects( $this->never() ) + ->method( 'deletePage' ); + $this->store->expects( $this->once() ) + ->method( 'savePage' ) + ->with( 'abc2', new TitleValue( NS_PROJECT, 'ArticleDbKeyNew' ) ); + + $this->call_onTitleMoveComplete( + [ NS_PROJECT ], + 'abc2', + new TitleValue( 0, 'ArticleDbKeyOld' ), + new TitleValue( NS_PROJECT, 'ArticleDbKeyNew' ) + ); + } + + /** + * @param int[] $namespaces + * @param string $language + * @param LinkTarget $linkTarget + */ + private function call_onTitleMoveComplete( + array $namespaces, + $language, + LinkTarget $linkTarget, + LinkTarget $newLinkTarget + ) { + $handler = new CognatePageHookHandler( $namespaces, $language ); + $handler->onTitleMoveComplete( + Title::newFromLinkTarget( $linkTarget ), + Title::newFromLinkTarget( $newLinkTarget ), + User::newFromId( 0 ), + null, + null, + null, + $this->getMockRevision() + ); + } + + /** + * @return PHPUnit_Framework_MockObject_MockObject|Revision + */ + private function getMockRevision() { + return $this->getMockBuilder( 'Revision' ) + ->disableOriginalConstructor() + ->getMock(); + } + } -- To view, visit https://gerrit.wikimedia.org/r/311696 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: If35ad0903336b01fff18925f2677e8a03e00f381 Gerrit-PatchSet: 5 Gerrit-Project: mediawiki/extensions/Cognate Gerrit-Branch: master Gerrit-Owner: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: Addshore <addshorew...@gmail.com> Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de> Gerrit-Reviewer: Gabriel Birke <gabriel.bi...@wikimedia.de> Gerrit-Reviewer: Tobias Gritschacher <tobias.gritschac...@wikimedia.de> Gerrit-Reviewer: WMDE-Fisch <christoph.jau...@wikimedia.de> Gerrit-Reviewer: WMDE-leszek <leszek.mani...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits