public function execute() { $userName = $this->getOption('user', false); $summary = $this->getOption('summary', 'Imported from text file'); $useTimestamp = $this->hasOption('use-timestamp'); $rc = $this->hasOption('rc'); $bot = $this->hasOption('bot'); $overwrite = $this->hasOption('overwrite'); $prefix = $this->getOption('prefix', ''); // Get all the arguments. A loop is required since Maintenance doesn't // support an arbitrary number of arguments. $files = []; $i = 0; while ($arg = $this->getArg($i++)) { if (file_exists($arg)) { $files[$arg] = file_get_contents($arg); } else { // use glob to support the Windows shell, which doesn't automatically // expand wildcards $found = false; foreach (glob($arg) as $filename) { $found = true; $files[$filename] = file_get_contents($filename); } if (!$found) { $this->error("Fatal error: The file '{$arg}' does not exist!", 1); } } } $count = count($files); $this->output("Importing {$count} pages...\n"); if ($userName === false) { $user = User::newSystemUser('Maintenance script', ['steal' => true]); } else { $user = User::newFromName($userName); } if (!$user) { $this->error("Invalid username\n", true); } if ($user->isAnon()) { $user->addToDatabase(); } $exit = 0; $successCount = 0; $failCount = 0; $skipCount = 0; foreach ($files as $file => $text) { $pageName = $prefix . pathinfo($file, PATHINFO_FILENAME); $timestamp = $useTimestamp ? wfTimestamp(TS_UNIX, filemtime($file)) : wfTimestampNow(); $title = Title::newFromText($pageName); // Have to check for # manually, since it gets interpreted as a fragment if (!$title || $title->hasFragment()) { $this->error("Invalid title {$pageName}. Skipping.\n"); $skipCount++; continue; } $exists = $title->exists(); $oldRevID = $title->getLatestRevID(); $oldRev = $oldRevID ? Revision::newFromId($oldRevID) : null; $actualTitle = $title->getPrefixedText(); if ($exists) { $touched = wfTimestamp(TS_UNIX, $title->getTouched()); if (!$overwrite) { $this->output("Title {$actualTitle} already exists. Skipping.\n"); $skipCount++; continue; } elseif ($useTimestamp && intval($touched) >= intval($timestamp)) { $this->output("File for title {$actualTitle} has not been modified since the " . "destination page was touched. Skipping.\n"); $skipCount++; continue; } } $rev = new WikiRevision(ConfigFactory::getDefaultInstance()->makeConfig('main')); $rev->setText(rtrim($text)); $rev->setTitle($title); $rev->setUserObj($user); $rev->setComment($summary); $rev->setTimestamp($timestamp); if ($exists && $overwrite && $rev->getContent()->equals($oldRev->getContent())) { $this->output("File for title {$actualTitle} contains no changes from the current " . "revision. Skipping.\n"); $skipCount++; continue; } $status = $rev->importOldRevision(); $newId = $title->getLatestRevID(); if ($status) { $action = $exists ? 'updated' : 'created'; $this->output("Successfully {$action} {$actualTitle}\n"); $successCount++; } else { $action = $exists ? 'update' : 'create'; $this->output("Failed to {$action} {$actualTitle}\n"); $failCount++; $exit = 1; } // Create the RecentChanges entry if necessary if ($rc && $status) { if ($exists) { if (is_object($oldRev)) { $oldContent = $oldRev->getContent(); RecentChange::notifyEdit($timestamp, $title, $rev->getMinor(), $user, $summary, $oldRevID, $oldRev->getTimestamp(), $bot, '', $oldContent ? $oldContent->getSize() : 0, $rev->getContent()->getSize(), $newId, 1); } } else { RecentChange::notifyNew($timestamp, $title, $rev->getMinor(), $user, $summary, $bot, '', $rev->getContent()->getSize(), $newId, 1); } } } $this->output("Done! {$successCount} succeeded, {$skipCount} skipped.\n"); if ($exit) { $this->error("Import failed with {$failCount} failed pages.\n", $exit); } }