X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fimport%2FWikiRevision.php;h=4325a1a3dc671bb825ffd994617da421ae030fbe;hb=04d1aa3033f40a38d721f7f0e88b5bac440d2869;hp=3513f8ce42f186067eb9b1a138e54fa2a915b6b6;hpb=e5879da149afe183ce889ef6f4158086c9b4735f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/import/WikiRevision.php b/includes/import/WikiRevision.php index 3513f8ce42..c006874aec 100644 --- a/includes/import/WikiRevision.php +++ b/includes/import/WikiRevision.php @@ -23,6 +23,8 @@ * @file * @ingroup SpecialPage */ +use MediaWiki\Logger\LoggerFactory; +use MediaWiki\MediaWikiServices; /** * Represents a revision, log entry or upload during the import process. @@ -32,14 +34,7 @@ * * @ingroup SpecialPage */ -class WikiRevision { - - /** - * @since 1.17 - * @deprecated in 1.29. Unused. - * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now. - */ - public $importer = null; +class WikiRevision implements ImportableUploadRevision, ImportableOldRevision { /** * @since 1.2 @@ -59,14 +54,6 @@ class WikiRevision { */ public $timestamp = "20010115000000"; - /** - * @since 1.2 - * @var int - * @deprecated in 1.29. Unused. - * @note Introduced in 436a028086fb3f01c4605c5ad2964d56f9306aca, unused there, unused now. - */ - public $user = 0; - /** * @since 1.2 * @var string @@ -170,9 +157,9 @@ class WikiRevision { /** * @since 1.12.2 - * @var mixed + * @var string|null */ - protected $src; + protected $src = null; /** * @since 1.18 @@ -298,7 +285,7 @@ class WikiRevision { /** * @since 1.12.2 - * @param mixed $src + * @param string|null $src */ public function setSrc( $src ) { $this->src = $src; @@ -494,7 +481,7 @@ class WikiRevision { /** * @since 1.12.2 - * @return mixed + * @return string|null */ public function getSrc() { return $this->src; @@ -511,6 +498,17 @@ class WikiRevision { return false; } + /** + * @since 1.31 + * @return bool|string + */ + public function getSha1Base36() { + if ( $this->sha1base36 ) { + return $this->sha1base36; + } + return false; + } + /** * @since 1.17 * @return string @@ -577,106 +575,16 @@ class WikiRevision { /** * @since 1.4.1 + * @deprecated in 1.31. Use OldRevisionImporter::import * @return bool */ public function importOldRevision() { - $dbw = wfGetDB( DB_MASTER ); - - # Sneak a single revision into place - $user = $this->getUserObj() ?: User::newFromName( $this->getUser() ); - if ( $user ) { - $userId = intval( $user->getId() ); - $userText = $user->getName(); + if ( $this->mNoUpdates ) { + $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporterNoUpdates(); } else { - $userId = 0; - $userText = $this->getUser(); - $user = new User; + $importer = MediaWikiServices::getInstance()->getWikiRevisionOldRevisionImporter(); } - - // avoid memory leak...? - Title::clearCaches(); - - $page = WikiPage::factory( $this->title ); - $page->loadPageData( 'fromdbmaster' ); - if ( !$page->exists() ) { - // must create the page... - $pageId = $page->insertOn( $dbw ); - $created = true; - $oldcountable = null; - } else { - $pageId = $page->getId(); - $created = false; - - // Note: sha1 has been in XML dumps since 2012. If you have an - // older dump, the duplicate detection here won't work. - $prior = $dbw->selectField( 'revision', '1', - [ 'rev_page' => $pageId, - 'rev_timestamp' => $dbw->timestamp( $this->timestamp ), - 'rev_sha1' => $this->sha1base36 ], - __METHOD__ - ); - if ( $prior ) { - // @todo FIXME: This could fail slightly for multiple matches :P - wfDebug( __METHOD__ . ": skipping existing revision for [[" . - $this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" ); - return false; - } - } - - if ( !$pageId ) { - // This seems to happen if two clients simultaneously try to import the - // same page - wfDebug( __METHOD__ . ': got invalid $pageId when importing revision of [[' . - $this->title->getPrefixedText() . ']], timestamp ' . $this->timestamp . "\n" ); - return false; - } - - // Select previous version to make size diffs correct - // @todo This assumes that multiple revisions of the same page are imported - // in order from oldest to newest. - $prevId = $dbw->selectField( 'revision', 'rev_id', - [ - 'rev_page' => $pageId, - 'rev_timestamp <= ' . $dbw->addQuotes( $dbw->timestamp( $this->timestamp ) ), - ], - __METHOD__, - [ 'ORDER BY' => [ - 'rev_timestamp DESC', - 'rev_id DESC', // timestamp is not unique per page - ] - ] - ); - - # @todo FIXME: Use original rev_id optionally (better for backups) - # Insert the row - $revision = new Revision( [ - 'title' => $this->title, - 'page' => $pageId, - 'content_model' => $this->getModel(), - 'content_format' => $this->getFormat(), - // XXX: just set 'content' => $this->getContent()? - 'text' => $this->getContent()->serialize( $this->getFormat() ), - 'comment' => $this->getComment(), - 'user' => $userId, - 'user_text' => $userText, - 'timestamp' => $this->timestamp, - 'minor_edit' => $this->minor, - 'parent_id' => $prevId, - ] ); - $revision->insertOn( $dbw ); - $changed = $page->updateIfNewerOn( $dbw, $revision ); - - if ( $changed !== false && !$this->mNoUpdates ) { - wfDebug( __METHOD__ . ": running updates\n" ); - // countable/oldcountable stuff is handled in WikiImporter::finishImportPage - $page->doEditUpdates( - $revision, - $user, - [ 'created' => $created, 'oldcountable' => 'no-change' ] - ); - } - - return true; + return $importer->import( $this ); } /** @@ -686,14 +594,7 @@ class WikiRevision { public function importLogItem() { $dbw = wfGetDB( DB_MASTER ); - $user = $this->getUserObj() ?: User::newFromName( $this->getUser() ); - if ( $user ) { - $userId = intval( $user->getId() ); - $userText = $user->getName(); - } else { - $userId = 0; - $userText = $this->getUser(); - } + $user = $this->getUserObj() ?: User::newFromName( $this->getUser(), false ); # @todo FIXME: This will not record autoblocks if ( !$this->getTitle() ) { @@ -709,7 +610,6 @@ class WikiRevision { 'log_timestamp' => $dbw->timestamp( $this->timestamp ), 'log_namespace' => $this->getTitle()->getNamespace(), 'log_title' => $this->getTitle()->getDBkey(), - # 'log_user_text' => $this->user_text, 'log_params' => $this->params ], __METHOD__ ); @@ -724,12 +624,11 @@ class WikiRevision { 'log_type' => $this->type, 'log_action' => $this->action, 'log_timestamp' => $dbw->timestamp( $this->timestamp ), - 'log_user' => $userId, - 'log_user_text' => $userText, 'log_namespace' => $this->getTitle()->getNamespace(), 'log_title' => $this->getTitle()->getDBkey(), 'log_params' => $this->params - ] + CommentStore::getStore()->insert( $dbw, 'log_comment', $this->getComment() ); + ] + CommentStore::getStore()->insert( $dbw, 'log_comment', $this->getComment() ) + + ActorMigration::newMigration()->getInsertValues( $dbw, 'log_user', $user ); $dbw->insert( 'logging', $data, __METHOD__ ); return true; @@ -737,106 +636,26 @@ class WikiRevision { /** * @since 1.12.2 + * @deprecated in 1.31. Use UploadImporter::import * @return bool */ public function importUpload() { - # Construct a file - $archiveName = $this->getArchiveName(); - if ( $archiveName ) { - wfDebug( __METHOD__ . "Importing archived file as $archiveName\n" ); - $file = OldLocalFile::newFromArchiveName( $this->getTitle(), - RepoGroup::singleton()->getLocalRepo(), $archiveName ); - } else { - $file = wfLocalFile( $this->getTitle() ); - $file->load( File::READ_LATEST ); - wfDebug( __METHOD__ . 'Importing new file as ' . $file->getName() . "\n" ); - if ( $file->exists() && $file->getTimestamp() > $this->getTimestamp() ) { - $archiveName = $file->getTimestamp() . '!' . $file->getName(); - $file = OldLocalFile::newFromArchiveName( $this->getTitle(), - RepoGroup::singleton()->getLocalRepo(), $archiveName ); - wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" ); - } - } - if ( !$file ) { - wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" ); - return false; - } - - # Get the file source or download if necessary - $source = $this->getFileSrc(); - $autoDeleteSource = $this->isTempSrc(); - if ( !strlen( $source ) ) { - $source = $this->downloadSource(); - $autoDeleteSource = true; - } - if ( !strlen( $source ) ) { - wfDebug( __METHOD__ . ": Could not fetch remote file.\n" ); - return false; - } - - $tmpFile = new TempFSFile( $source ); - if ( $autoDeleteSource ) { - $tmpFile->autocollect(); - } - - $sha1File = ltrim( sha1_file( $source ), '0' ); - $sha1 = $this->getSha1(); - if ( $sha1 && ( $sha1 !== $sha1File ) ) { - wfDebug( __METHOD__ . ": Corrupt file $source.\n" ); - return false; - } - - $user = $this->getUserObj() ?: User::newFromName( $this->getUser() ); - - # Do the actual upload - if ( $archiveName ) { - $status = $file->uploadOld( $source, $archiveName, - $this->getTimestamp(), $this->getComment(), $user ); - } else { - $flags = 0; - $status = $file->upload( $source, $this->getComment(), $this->getComment(), - $flags, false, $this->getTimestamp(), $user ); - } - - if ( $status->isGood() ) { - wfDebug( __METHOD__ . ": Successful\n" ); - return true; - } else { - wfDebug( __METHOD__ . ': failed: ' . $status->getHTML() . "\n" ); - return false; - } + $importer = MediaWikiServices::getInstance()->getWikiRevisionUploadImporter(); + $statusValue = $importer->import( $this ); + return $statusValue->isGood(); } /** * @since 1.12.2 + * @deprecated in 1.31. Use UploadImporter::downloadSource * @return bool|string */ public function downloadSource() { - if ( !$this->config->get( 'EnableUploads' ) ) { - return false; - } - - $tempo = tempnam( wfTempDir(), 'download' ); - $f = fopen( $tempo, 'wb' ); - if ( !$f ) { - wfDebug( "IMPORT: couldn't write to temp file $tempo\n" ); - return false; - } - - // @todo FIXME! - $src = $this->getSrc(); - $data = Http::get( $src, [], __METHOD__ ); - if ( !$data ) { - wfDebug( "IMPORT: couldn't fetch source $src\n" ); - fclose( $f ); - unlink( $tempo ); - return false; - } - - fwrite( $f, $data ); - fclose( $f ); - - return $tempo; + $importer = new ImportableUploadRevisionImporter( + $this->config->get( 'EnableUploads' ), + LoggerFactory::getInstance( 'UploadRevisionImporter' ) + ); + return $importer->downloadSource( $this ); } }