56 $dbw = $this->dbProvider->getPrimaryDatabase();
58 # Sneak a single revision into place
59 $user = $importableRevision->
getUserObj() ?: $this->userFactory->newFromName( $importableRevision->
getUser() );
61 $userId = $user->getId();
62 $userText = $user->getName();
65 $userText = $importableRevision->
getUser();
66 $user = $this->userFactory->newAnonymous();
72 $page = $this->wikiPageFactory->newFromTitle( $importableRevision->
getTitle() );
73 $page->loadPageData( IDBAccessObject::READ_LATEST );
74 $mustCreatePage = !$page->exists();
75 if ( $mustCreatePage ) {
76 $pageId = $page->insertOn( $dbw );
78 $pageId = $page->getId();
83 $prior = (bool)$dbw->newSelectQueryBuilder()
87 'rev_page' => $pageId,
88 'rev_timestamp' => $dbw->timestamp( $importableRevision->
getTimestamp() ),
91 ->caller( __METHOD__ )->fetchField();
94 $this->logger->debug( __METHOD__ .
": skipping existing revision for [[" .
95 $importableRevision->
getTitle()->getPrefixedText() .
"]], timestamp " .
105 $this->logger->debug( __METHOD__ .
': got invalid $pageId when importing revision of [[' .
106 $importableRevision->
getTitle()->getPrefixedText() .
']], timestamp ' .
114 $queryBuilder = $this->revisionStore->newSelectQueryBuilder( $dbw )
116 ->where( [
'rev_page' => $pageId ] )
117 ->andWhere( $dbw->expr(
118 'rev_timestamp',
'<=', $dbw->timestamp( $importableRevision->
getTimestamp() )
120 ->orderBy( [
'rev_timestamp',
'rev_id' ], SelectQueryBuilder::SORT_DESC );
121 $prevRevRow = $queryBuilder->caller( __METHOD__ )->fetchRow();
123 # @todo FIXME: Use original rev_id optionally (better for backups)
126 $revisionRecord->setParentId( $prevRevRow ? (
int)$prevRevRow->rev_id : 0 );
127 $revisionRecord->setComment(
128 CommentStoreComment::newUnsavedComment( $importableRevision->
getComment() )
132 $revUser = $this->userFactory->newFromAnyId( $userId, $userText );
133 }
catch ( InvalidArgumentException $ex ) {
134 $revUser = RequestContext::getMain()->getUser();
136 $revisionRecord->setUser( $revUser );
138 $originalRevision = $prevRevRow
139 ? $this->revisionStore->newRevisionFromRow(
141 IDBAccessObject::READ_LATEST,
146 foreach ( $importableRevision->
getSlotRoles() as $role ) {
147 if ( !$this->slotRoleRegistry->isDefinedRole( $role ) ) {
148 throw new RuntimeException(
"Undefined slot role $role" );
151 $newContent = $importableRevision->
getContent( $role );
152 if ( !$originalRevision || !$originalRevision->hasSlot( $role ) ) {
153 $revisionRecord->setContent( $role, $newContent );
155 $originalSlot = $originalRevision->getSlot( $role );
156 if ( !$originalSlot->hasSameContent( $importableRevision->
getSlot( $role ) ) ) {
157 $revisionRecord->setContent( $role, $newContent );
159 $revisionRecord->inheritSlot( $originalRevision->getSlot( $role ) );
164 $revisionRecord->setTimestamp( $importableRevision->
getTimestamp() );
165 $revisionRecord->setMinorEdit( $importableRevision->
getMinor() );
166 $revisionRecord->setPageId( $pageId );
168 $latestRevId = $page->getLatest();
170 $inserted = $this->revisionStore->insertRevisionOn( $revisionRecord, $dbw );
171 if ( $latestRevId ) {
174 $latestRevTimestamp = (int)$this->revisionStore->getTimestampFromId(
176 IDBAccessObject::READ_LATEST
179 $latestRevTimestamp = 0;
181 if ( $importableRevision->
getTimestamp() >= $latestRevTimestamp ) {
182 $changed = $page->updateRevisionOn( $dbw, $inserted, $latestRevId );
187 $tags = $importableRevision->
getTags();
188 if ( $tags !== [] ) {
192 if ( $changed !==
false && $this->doUpdates ) {
193 $this->logger->debug( __METHOD__ .
": running updates" );
197 'created' => $mustCreatePage,
198 'oldcountable' =>
'no-change',
199 'causeAction' =>
'import-page',
200 'causeAgent' => $user->getName(),
203 $updater = $this->pageUpdaterFactory->newDerivedPageDataUpdater( $page );
204 $updater->prepareUpdate( $inserted, $options );
205 $updater->doUpdates();