public function execute()
 {
     if (!($this->hasOption('file') ^ $this->hasOption('dump'))) {
         $this->error("You must provide a file or dump", true);
     }
     $this->checkOptions();
     if ($this->hasOption('file')) {
         $revision = new WikiRevision();
         $revision->setText(file_get_contents($this->getOption('file')));
         $revision->setTitle(Title::newFromText(rawurldecode(basename($this->getOption('file'), '.txt'))));
         $this->handleRevision($revision);
         return;
     }
     $this->startTime = microtime(true);
     if ($this->getOption('dump') == '-') {
         $source = new ImportStreamSource($this->getStdin());
     } else {
         $this->error("Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true);
     }
     $importer = new WikiImporter($source);
     $importer->setRevisionCallback(array(&$this, 'handleRevision'));
     $this->from = $this->getOption('from', null);
     $this->count = 0;
     $importer->doImport();
     $this->conclusions();
     $delta = microtime(true) - $this->startTime;
     $this->error("Done {$this->count} revisions in " . round($delta, 2) . " seconds ");
     if ($delta > 0) {
         $this->error(round($this->count / $delta, 2) . " pages/sec");
     }
     # Perform the memory_get_peak_usage() when all the other data has been output so there's no damage if it dies.
     # It is only available since 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
     $this->error("Memory peak usage of " . memory_get_peak_usage() . " bytes\n");
 }
 /**
  * @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);
 }
 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);
     }
 }
Exemple #4
0
 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);
 }