public function execute()
 {
     global $wgLang, $wgParser;
     $provided = $this->getArg(0);
     $namespace = $wgLang->getNsIndex($provided);
     if (!$namespace) {
         $this->error("Invalid namespace provided: {$provided}");
         return;
     }
     $namespaceName = $wgLang->getNsText($namespace);
     if (!MWNamespace::hasSubpages($namespace)) {
         $this->error("Subpages are not enabled in the {$namespaceName} namespace.");
         $this->error("In order to convert this namespace to Flow, you must enable subpages using:");
         $this->error("\$wgNamespacesWithSubpages[{$namespace}] = true;");
         return;
     }
     $noConvertTemplates = explode(',', $this->getOption('no-convert-templates', ''));
     if ($noConvertTemplates === array('')) {
         // explode( ',', '' ) returns array( '' )
         $noConvertTemplates = array();
     }
     // Convert to Title objects
     foreach ($noConvertTemplates as &$template) {
         $title = Title::newFromText($template, NS_TEMPLATE);
         if (!$title) {
             $this->error("Invalid template name: {$template}");
             return;
         }
         $template = $title;
     }
     // @todo send to prod logger?
     $logger = new MaintenanceDebugLogger($this);
     $dbw = wfGetDB(DB_MASTER);
     $converter = new \Flow\Import\Converter($dbw, Flow\Container::get('importer'), $logger, FlowHooks::getOccupationController()->getTalkpageManager(), new Flow\Import\Wikitext\ConversionStrategy($wgParser, new Flow\Import\NullImportSourceStore(), $logger, $noConvertTemplates, $this->getOption('archive-pattern', null)));
     $logger->info("Starting conversion of {$namespaceName} namespace");
     // Iterate over all existing pages of the namespace.
     $it = new NamespaceIterator($dbw, $namespace);
     // NamespaceIterator is an IteratorAggregate. Get an Iterator
     // so we can wrap that.
     $it = $it->getIterator();
     $converter->convertAll($it);
     $logger->info("Finished conversion of {$namespaceName} namespace");
 }
 public function execute()
 {
     $cacheDir = $this->getOption('cacheremoteapidir');
     if (!is_dir($cacheDir)) {
         if (!mkdir($cacheDir)) {
             throw new Flow\Exception\FlowException('Provided dir for caching remote api calls is not creatable.');
         }
     }
     if (!is_writable($cacheDir)) {
         throw new Flow\Exception\FlowException('Provided dir for caching remote api calls is not writable.');
     }
     $api = new RemoteApiBackend($this->getOption('remoteapi'), $cacheDir);
     $importer = Flow\Container::get('importer');
     $importer->setAllowUnknownUsernames(true);
     $talkPageManagerUser = \FlowHooks::getOccupationController()->getTalkpageManager();
     $srcPageName = $this->getOption('srcpage');
     if ($this->hasOption('dstpage')) {
         $dstPageName = $this->getOption('dstpage');
     } else {
         $dstPageName = $srcPageName;
     }
     $dstTitle = Title::newFromText($dstPageName);
     $source = new LiquidThreadsApiImportSource($api, $srcPageName, $talkPageManagerUser);
     $logFilename = $this->getOption('logfile');
     $sourceStore = new FileImportSourceStore($logFilename);
     $logger = new MaintenanceDebugLogger($this);
     if ($this->getOption('debug')) {
         $logger->setMaximumLevel(LogLevel::DEBUG);
     } else {
         $logger->setMaximumLevel(LogLevel::INFO);
     }
     $importer->setLogger($logger);
     $api->setLogger($logger);
     $logger->info("Starting LQT conversion of page {$srcPageName}");
     $importer->import($source, $dstTitle, $sourceStore);
     $logger->info("Finished LQT conversion of page {$srcPageName}");
 }
<?php

require_once "{$IP}/maintenance/commandLine.inc";
require_once "{$IP}/extensions/Flow/FlowActions.php";
$moderationChangeTypes = array('hide-post', 'hide-topic', 'delete-post', 'delete-topic', 'suppress-post', 'suppress-topic', 'lock-topic', 'restore-post', 'restore-topic');
$csvOutput = fopen('repair_results_from_parent_' . wfWikiId() . '.csv', 'w');
if (!$csvOutput) {
    die("Could not open results file\n");
}
fputcsv($csvOutput, array("uuid", "esurl", "flags"));
$dbr = Flow\Container::get('db.factory')->getDB(DB_SLAVE);
$it = new EchoBatchRowIterator($dbr, 'flow_revision', array('rev_id'), 10);
$it->addConditions(array('rev_user_wiki' => wfWikiId()));
$it->setFetchColumns(array('rev_change_type', 'rev_parent_id'));
$totalNullContentWithParent = 0;
$totalNullParentContent = 0;
$totalBadQueryResult = 0;
$totalMatched = 0;
foreach ($it as $batch) {
    foreach ($batch as $rev) {
        $item = ExternalStore::fetchFromURL($rev->rev_content);
        if ($item) {
            // contains valid data
            continue;
        }
        $changeType = $rev->rev_change_type;
        while (is_string($wgFlowActions[$changeType])) {
            $changeType = $wgFlowActions[$changeType];
        }
        if (!in_array($changeType, $moderationChangeTypes)) {
            // doesn't inherit content
コード例 #4
0
<?php

$c = new Flow\Container();
// MediaWiki
if (defined('RUN_MAINTENANCE_IF_MAIN')) {
    $c['user'] = new User();
} else {
    $c['user'] = isset($GLOBALS['wgUser']) ? $GLOBALS['wgUser'] : new User();
}
$c['output'] = $GLOBALS['wgOut'];
$c['request'] = $GLOBALS['wgRequest'];
$c['memcache'] = function ($c) {
    global $wgFlowUseMemcache, $wgMemc;
    if ($wgFlowUseMemcache) {
        return $wgMemc;
    } else {
        return new \HashBagOStuff();
    }
};
$c['cache.version'] = $GLOBALS['wgFlowCacheVersion'];
// Flow config
$c['flow_actions'] = function ($c) {
    global $wgFlowActions;
    return new Flow\FlowActions($wgFlowActions);
};
// Always returns the correct database for flow storage
$c['db.factory'] = function ($c) {
    global $wgFlowDefaultWikiDb, $wgFlowCluster;
    return new Flow\DbFactory($wgFlowDefaultWikiDb, $wgFlowCluster);
};
// Database Access Layer external from main implementation
<?php

require_once "{$IP}/maintenance/commandLine.inc";
require_once "{$IP}/extensions/Flow/FlowActions.php";
$moderationChangeTypes = array('hide-post', 'hide-topic', 'delete-post', 'delete-topic', 'suppress-post', 'suppress-topic', 'lock-topic', 'restore-post', 'restore-topic');
$plaintextChangeTypes = array('edit-title', 'new-topic');
$csvOutput = fopen('repair_results_' . wfWikiId() . '.csv', 'w');
if (!$csvOutput) {
    die("Could not open results file\n");
}
fputcsv($csvOutput, array("uuid", "esurl", "flags"));
$it = new EchoBatchRowIterator(Flow\Container::get('db.factory')->getDB(DB_SLAVE), 'flow_revision', array('rev_id'), 10);
$it->addConditions(array('rev_user_wiki' => wfWikiId()));
$it->setFetchColumns(array('rev_content', 'rev_content_length', 'rev_change_type', 'rev_parent_id'));
$dbr = wfGetDB(DB_SLAVE);
$totalMissingConsidered = 0;
$totalCompleteMatch = 0;
$totalMultipleMatches = 0;
$totalResolvedMultipleMatches = 0;
$totalNoMatch = 0;
$totalNoChangeRevisions = 0;
$totalMatchButInvalid = 0;
foreach ($it as $batch) {
    foreach ($batch as $rev) {
        $item = ExternalStore::fetchFromURL($rev->rev_content);
        if ($item) {
            // contains valid data
            continue;
        }
        ++$totalMissingConsidered;
        $uuid = Flow\Model\UUID::create($rev->rev_id);
<?php

require_once "{$IP}/maintenance/commandLine.inc";
require_once "{$IP}/extensions/Flow/FlowActions.php";
if (!isset($argv[1])) {
    die("Usage: {$argv[0]} <csv>\n\n");
}
if (!is_file($argv[1])) {
    die('Provided CSV file does not exist');
}
$csv = fopen($argv[1], "r");
if (fgetcsv($csv) !== array('uuid', 'esurl', 'flags')) {
    die('Provided CSV file does not have the expected header');
}
$fixed = 0;
$dbw = Flow\Container::get('db.factory')->getDB(DB_MASTER);
while ($row = fgetcsv($csv)) {
    if (count($row) !== 3) {
        var_dump($row);
        die('All rows in CSV file must have 2 entries');
    }
    list($uuid, $esUrl, $flags) = $row;
    if (!$uuid || !$esUrl || !$flags) {
        var_dump($row);
        die('All rows in CSV file must have a uuid, flags and an external store url');
    }
    $uuid = Flow\Model\UUID::create($uuid);
    $dbw->update('flow_revision', array('rev_content' => $esUrl, 'rev_flags' => $flags), array('rev_id' => $uuid->getBinary()));
    ++$fixed;
}
echo "Updated {$fixed} revisions\n\n";