Current File : /home/jvzmxxx/wiki1/extensions/Flow/maintenance/convertAllLqtPages.php
<?php

use Flow\Container;
use Flow\Import\SourceStore\File as FileImportSourceStore;
use Flow\Import\SourceStore\FlowRevisionsDb as FlowRevisionsDBImportSourceStore;
use Flow\Import\LiquidThreadsApi\ConversionStrategy;
use Flow\Import\LiquidThreadsApi\LocalApiBackend;
use Flow\Utils\NamespaceIterator;
use Flow\Utils\PagesWithPropertyIterator;
use Psr\Log\LogLevel;

require_once ( getenv( 'MW_INSTALL_PATH' ) !== false
	? getenv( 'MW_INSTALL_PATH' ) . '/maintenance/Maintenance.php'
	: dirname( __FILE__ ) . '/../../../maintenance/Maintenance.php' );

/**
 * Converts all LiquidThreads pages on a wiki to Flow. When using the logfile
 * option this process is idempotent.It may be run many times and will only import
 * one copy of each item.
 */
class ConvertAllLqtPages extends Maintenance {
	public function __construct() {
		parent::__construct();
		$this->mDescription = "Converts LiquidThreads data to Flow data";
		$this->addOption( 'logfile', 'File to read and store associations between imported items and their sources. This is required for the import to be idempotent.', false, true );
		$this->addOption( 'force-recovery-conversion', 'If a previous logfile was lost, this option can be set to attempt to map threads to topics that have already been imported to prevent doubles.' );
		$this->addOption( 'debug', 'Include debug information with progress report' );
	}

	public function execute() {
		$logfile = $this->getOption( 'logfile' );
		if ( $logfile ) {
			$sourceStore = new FileImportSourceStore( $logfile );
		} elseif ( $this->getOption( 'force-recovery-conversion' ) ) {
			// fallback: if we don't have a sourcestore to go on, at least look
			// at DB to figure out what's already imported...
			$dbr = Container::get( 'db.factory' )->getDB( DB_SLAVE );
			$sourceStore = new FlowRevisionsDBImportSourceStore( $dbr );
		} else {
			$this->error( 'Param logfile or force-recovery-conversion required!' );
			$this->maybeHelp( true );
			die( 1 );
		}

		$logger = new MaintenanceDebugLogger( $this );
		if ( $this->getOption( 'debug' ) ) {
			$logger->setMaximumLevel( LogLevel::DEBUG );
		} else {
			$logger->setMaximumLevel( LogLevel::INFO );
		}

		$importer = Flow\Container::get( 'importer' );
		$talkpageManagerUser = FlowHooks::getOccupationController()->getTalkpageManager();

		$dbw = wfGetDB( DB_MASTER );
		$strategy = new ConversionStrategy(
			$dbw,
			$sourceStore,
			new LocalApiBackend( $talkpageManagerUser ),
			Container::get( 'url_generator' ),
			$talkpageManagerUser,
			Container::get( 'controller.notification' )
		);

		$converter = new \Flow\Import\Converter(
			$dbw,
			$importer,
			$logger,
			$talkpageManagerUser,
			$strategy
		);

		$titles = $this->buildIterator( $logger, $dbw );

		$logger->info( "Starting full wiki LQT conversion of all LiquidThreads pages" );
		$converter->convertAll( $titles );
		$logger->info( "Finished conversion" );
	}

	/**
	 * @param $logger
	 * @param $dbw
	 * @return AppendIterator
	 */
	private function buildIterator( $logger, $dbw ) {
		global $wgLqtTalkPages;

		$iterator = new AppendIterator();

		$logger->info( "Considering for conversion: pages with the 'use-liquid-threads' property" );
		$withProperty = new PagesWithPropertyIterator( $dbw, 'use-liquid-threads' );
		$iterator->append( $withProperty->getIterator() );

		if ( $wgLqtTalkPages ) {
			foreach ( MWNamespace::getTalkNamespaces() as $ns ) {
				$logger->info( "Considering for conversion: pages in namespace $ns" );
				$it = new NamespaceIterator( $dbw, $ns );
				$iterator->append( $it->getIterator() );
			}
		}

		return $iterator;
	}
}

$maintClass = "ConvertAllLqtPages";
require_once ( RUN_MAINTENANCE_IF_MAIN );