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); } }
/** * @param array $pageInfo * @param array $uploadInfo * @return mixed */ private function processUpload($pageInfo, $uploadInfo) { $revision = new WikiRevision($this->config); $text = isset($uploadInfo['text']) ? $uploadInfo['text'] : ''; $revision->setTitle($pageInfo['_title']); $revision->setID($pageInfo['id']); $revision->setTimestamp($uploadInfo['timestamp']); $revision->setText($text); $revision->setFilename($uploadInfo['filename']); if (isset($uploadInfo['archivename'])) { $revision->setArchiveName($uploadInfo['archivename']); } $revision->setSrc($uploadInfo['src']); if (isset($uploadInfo['fileSrc'])) { $revision->setFileSrc($uploadInfo['fileSrc'], !empty($uploadInfo['isTempSrc'])); } if (isset($uploadInfo['sha1base36'])) { $revision->setSha1Base36($uploadInfo['sha1base36']); } $revision->setSize(intval($uploadInfo['size'])); $revision->setComment($uploadInfo['comment']); if (isset($uploadInfo['contributor']['ip'])) { $revision->setUserIP($uploadInfo['contributor']['ip']); } if (isset($uploadInfo['contributor']['username'])) { $revision->setUserName($uploadInfo['contributor']['username']); } $revision->setNoUpdates($this->mNoUpdates); return call_user_func($this->mUploadCallback, $revision); }
private function processUpload($pageInfo, $uploadInfo) { $revision = new WikiRevision(); $revision->setTitle($pageInfo['_title']); $revision->setID($uploadInfo['id']); $revision->setTimestamp($uploadInfo['timestamp']); $revision->setText($uploadInfo['text']); $revision->setFilename($uploadInfo['filename']); $revision->setSrc($uploadInfo['src']); $revision->setSize(intval($uploadInfo['size'])); $revision->setComment($uploadInfo['comment']); if (isset($uploadInfo['contributor']['ip'])) { $revision->setUserIP($uploadInfo['contributor']['ip']); } if (isset($uploadInfo['contributor']['username'])) { $revision->setUserName($uploadInfo['contributor']['username']); } return $this->uploadCallback($revision); }