diff options
Diffstat (limited to 'MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php')
-rw-r--r-- | MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php | 160 |
1 files changed, 90 insertions, 70 deletions
diff --git a/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php b/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php index 1314e0e4..29f4d531 100644 --- a/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php +++ b/MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php @@ -13,8 +13,6 @@ use SplObjectStorage; use Status; use Title; use TitleParser; -use TranslatablePage; -use TranslateUtils; class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { /** @var TranslatablePageMover */ @@ -52,8 +50,13 @@ class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { ); $this->addOption( - 'move-subpages', - 'Move subpages under the current page' + 'skip-subpages', + 'Skip moving subpages under the current page' + ); + + $this->addOption( + 'skip-talkpages', + 'Skip moving talk pages under pages being moved' ); $this->requireExtension( 'Translate' ); @@ -70,29 +73,28 @@ class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { $newPagename = $this->getArg( 1 ); $username = $this->getArg( 2 ); $reason = $this->getOption( 'reason', '' ); - $moveSubpages = $this->hasOption( 'move-subpages' ); + $moveSubpages = !$this->hasOption( 'skip-subpages' ); + $moveTalkpages = !$this->hasOption( 'skip-talkpages' ); - if ( is_callable( [ $mwService, 'getUserFactory' ] ) ) { - // MW 1.35+ - $userFactory = $mwService->getUserFactory(); - $user = $userFactory->newFromName( $username ); - } else { - $user = \User::newFromName( $username ); - // Set to null if $user is false - $user = $user ?: null; - } + $userFactory = $mwService->getUserFactory(); + $user = $userFactory->newFromName( $username ); if ( $user === null || !$user->isRegistered() ) { $this->fatalError( "User $username does not exist." ); } $outputMsg = "Check if '$currentPagename' can be moved to '$newPagename'"; - $subpageMsg = '(excluding subpages)'; + $subpageMsg = 'excluding subpages'; if ( $moveSubpages ) { - $subpageMsg = '(including subpages)'; + $subpageMsg = 'including subpages'; } - $this->output( "$outputMsg $subpageMsg\n" ); + $talkpageMsg = 'excluding talkpages'; + if ( $moveTalkpages ) { + $talkpageMsg = 'including talkpages'; + } + + $this->output( "$outputMsg ($subpageMsg; $talkpageMsg)\n" ); try { $currentTitle = $this->getTitleFromInput( $currentPagename ?? '' ); @@ -105,21 +107,21 @@ class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { // When moving translatable pages from script, remove all limits on the number of // pages that can be moved $this->pageMover->disablePageMoveLimit(); - $blockers = $this->pageMover->checkMoveBlockers( - $currentTitle, - $newTitle, - $user, - $reason, - $moveSubpages - ); - - if ( count( $blockers ) ) { - $fatalErrorMsg = $this->parseErrorMessage( $blockers ); + try { + $pageCollection = $this->pageMover->getPageMoveCollection( + $currentTitle, + $newTitle, + $user, + $reason, + $moveSubpages, + $moveTalkpages + ); + } catch ( ImpossiblePageMove $e ) { + $fatalErrorMsg = $this->parseErrorMessage( $e->getBlockers() ); $this->fatalError( $fatalErrorMsg ); } - $groupedPagesToMove = $this->getGroupedPagesToMove( $currentTitle ); - $this->displayPagesToMove( $currentTitle, $newTitle, $groupedPagesToMove ); + $this->displayPagesToMove( $pageCollection ); $haveConfirmation = $this->getConfirmation(); if ( !$haveConfirmation ) { @@ -129,7 +131,7 @@ class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { $this->output( "Starting page move\n" ); - $pagesToMove = $this->pageMover->getPagesToMove( $currentTitle, $newTitle, $moveSubpages ); + $pagesToMove = $pageCollection->getListOfPages(); $this->pageMover->moveSynchronously( $currentTitle, @@ -170,77 +172,95 @@ class MoveTranslatablePageMaintenanceScript extends BaseMaintenanceScript { } } - /** @return Title[][] */ - private function getGroupedPagesToMove( Title $source ): array { - $page = TranslatablePage::newFromTitle( $source ); + private function displayPagesToMove( PageMoveCollection $pageCollection ): void { + $infoMessage = "\nThe following pages will be moved:\n"; + $count = 0; + $subpagesCount = 0; + $talkpagesCount = 0; - $types = [ - 'pt-movepage-list-pages' => [ $source ], - 'pt-movepage-list-translation' => $page->getTranslationPages(), - 'pt-movepage-list-section' => $page->getTranslationUnitPages( 'all' ), - 'pt-movepage-list-translatable' => $this->pageMover->getTranslatableSubpages( $page ) + /** @var PageMoveOperation[][] */ + $pagesToMove = [ + 'pt-movepage-list-pages' => [ $pageCollection->getTranslatablePage() ], + 'pt-movepage-list-translation' => $pageCollection->getTranslationPagesPair(), + 'pt-movepage-list-section' => $pageCollection->getUnitPagesPair() ]; - if ( TranslateUtils::allowsSubpages( $source ) ) { - $types[ 'pt-movepage-list-other'] = $this->pageMover->getNormalSubpages( $page ); + $subpages = $pageCollection->getSubpagesPair(); + if ( $subpages ) { + $pagesToMove[ 'pt-movepage-list-other'] = $subpages; } - return $types; - } - - private function displayPagesToMove( Title $currentTitle, Title $newTitle, array $pagesToMove ): void { - $infoMessage = "\nThe following pages will be moved:\n"; - $count = 0; - $subpagesCount = 0; - $base = $currentTitle->getPrefixedText(); - foreach ( $pagesToMove as $type => $pages ) { - $infoMessage .= $this->getSeparator(); - $pageCount = count( $pages ); - $infoMessage .= $this->message( $type )->numParams( $pageCount )->text() . "\n\n"; - if ( !$pageCount ) { - $infoMessage .= $this->message( 'pt-movepage-list-no-pages' )->text() . "\n"; + $lines = []; + $infoMessage .= $this->getSectionHeader( $type, $pages ); + if ( !count( $pages ) ) { continue; } - if ( $type === 'pt-movepage-list-translatable' ) { - $infoMessage .= $this->message( 'pt-movepage-list-translatable-note' )->text() . "\n"; - } - - $canBeMoved = $type !== 'pt-movepage-list-translatable'; - $lines = []; - foreach ( $pages as $currentPage ) { - if ( $canBeMoved ) { - $count++; - } + foreach ( $pages as $pagePairs ) { + $count++; if ( $type === 'pt-movepage-list-other' ) { $subpagesCount++; } - if ( $canBeMoved ) { - $to = $this->pageMover->newPageTitle( $base, $currentPage, $newTitle ); - $lines[] = '* ' . $currentPage->getPrefixedText() . ' → ' . $to; - } else { - $lines[] = '* ' . $currentPage->getPrefixedText(); + $old = $pagePairs->getOldTitle(); + $new = $pagePairs->getNewTitle(); + + if ( $new ) { + $line = '* ' . $old->getPrefixedText() . ' → ' . $new->getPrefixedText(); + if ( $pagePairs->hasTalkpage() ) { + $count++; + $talkpagesCount++; + $line .= ' ' . $this->message( 'pt-movepage-talkpage-exists' )->text(); + } + + $lines[] = $line; } } $infoMessage .= implode( "\n", $lines ) . "\n"; } + $translatableSubpages = $pageCollection->getTranslatableSubpages(); + $infoMessage .= $this->getSectionHeader( 'pt-movepage-list-translatable', $translatableSubpages ); + + if ( $translatableSubpages ) { + $lines = []; + $infoMessage .= $this->message( 'pt-movepage-list-translatable-note' )->text() . "\n"; + foreach ( $translatableSubpages as $page ) { + $lines[] = '* ' . $page->getPrefixedText(); + } + + $infoMessage .= implode( "\n", $lines ) . "\n"; + } + $this->output( $infoMessage ); $this->logSeparator(); $this->output( $this->message( 'pt-movepage-list-count' ) - ->numParams( $count, $subpagesCount ) + ->numParams( $count, $subpagesCount, $talkpagesCount ) ->text() . "\n" ); $this->logSeparator(); $this->output( "\n" ); } + private function getSectionHeader( string $type, array $pages ): string { + $infoMessage = $this->getSeparator(); + $pageCount = count( $pages ); + + // $type can be: pt-movepage-list-pages, pt-movepage-list-translation, pt-movepage-list-section + // pt-movepage-list-other + $infoMessage .= $this->message( $type )->numParams( $pageCount )->text() . "\n\n"; + if ( !$pageCount ) { + $infoMessage .= $this->message( 'pt-movepage-list-no-pages' )->text() . "\n"; + } + + return $infoMessage; + } + private function getConfirmation(): bool { $line = self::readconsole( 'Type "MOVE" to begin the move operation: ' ); return strtolower( $line ) === 'move'; |