summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php')
-rw-r--r--MLEB/Translate/src/PageTranslation/MoveTranslatablePageMaintenanceScript.php160
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';