Check for unknown slot.

Bug: T220525
Change-Id: I89ac1679ea70cb403433f8b97fe11e8eb6811280
This commit is contained in:
Cindy Cicalese 2020-07-18 18:17:25 -04:00
parent 7ffacacc6b
commit c69489f44c
6 changed files with 81 additions and 6 deletions

View file

@ -792,7 +792,8 @@ return [
true,
LoggerFactory::getInstance( 'OldRevisionImporter' ),
$services->getDBLoadBalancer(),
$services->getRevisionStore()
$services->getRevisionStore(),
$services->getSlotRoleRegistry()
);
},
@ -1368,7 +1369,8 @@ return [
false,
LoggerFactory::getInstance( 'OldRevisionImporter' ),
$services->getDBLoadBalancer(),
$services->getRevisionStore()
$services->getRevisionStore(),
$services->getSlotRoleRegistry()
);
},

View file

@ -2,6 +2,7 @@
use MediaWiki\Revision\MutableRevisionRecord;
use MediaWiki\Revision\RevisionStore;
use MediaWiki\Revision\SlotRoleRegistry;
use Psr\Log\LoggerInterface;
use Wikimedia\Rdbms\ILoadBalancer;
@ -30,22 +31,34 @@ class ImportableOldRevisionImporter implements OldRevisionImporter {
*/
private $revisionStore;
/**
* @var SlotRoleRegistry
*/
private $slotRoleRegistry;
/**
* @param bool $doUpdates
* @param LoggerInterface $logger
* @param ILoadBalancer $loadBalancer
* @param RevisionStore $revisionStore
* @param SlotRoleRegistry|null $slotRoleRegistry
*/
public function __construct(
$doUpdates,
LoggerInterface $logger,
ILoadBalancer $loadBalancer,
RevisionStore $revisionStore
RevisionStore $revisionStore,
SlotRoleRegistry $slotRoleRegistry = null
) {
$this->doUpdates = $doUpdates;
$this->logger = $logger;
$this->loadBalancer = $loadBalancer;
$this->revisionStore = $revisionStore;
// @todo: temporary - remove when FileImporter extension is updated
if ( !$slotRoleRegistry ) {
$slotRoleRegistry = \MediaWiki\MediaWikiServices::getInstance()->getSlotRoleRegistry();
}
$this->slotRoleRegistry = $slotRoleRegistry;
}
public function import( ImportableOldRevision $importableRevision, $doUpdates = true ) {
@ -144,6 +157,10 @@ class ImportableOldRevisionImporter implements OldRevisionImporter {
$originalRevision =
$prevRevRow ? $this->revisionStore->newRevisionFromRow( $prevRevRow ) : null;
foreach ( $importableRevision->getSlotRoles() as $role ) {
if ( !$this->slotRoleRegistry->isDefinedRole( $role ) ) {
throw new MWException( "Undefined slot role $role" );
}
$newContent = $importableRevision->getContent( $role );
if ( !$originalRevision || !$originalRevision->hasSlot( $role ) ) {
$revisionRecord->setContent( $role, $newContent );

View file

@ -0,0 +1,55 @@
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.11/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.11/ http://www.mediawiki.org/xml/export-0.11.xsd" version="0.11" xml:lang="de">
<siteinfo>
<sitename>Test</sitename>
<dbname>wiki</dbname>
<base>http://example.com/wiki/</base>
<generator>MediaWiki Test</generator>
<case>first-letter</case>
<namespaces>
<namespace key="-2" case="first-letter">Medium</namespace>
<namespace key="-1" case="first-letter">Spezial</namespace>
<namespace key="0" case="first-letter" />
<namespace key="1" case="first-letter">Diskussion</namespace>
<namespace key="2" case="first-letter">Benutzer</namespace>
<namespace key="3" case="first-letter">Benutzer Diskussion</namespace>
<namespace key="4" case="first-letter">Project</namespace>
<namespace key="5" case="first-letter">Project Diskussion</namespace>
<namespace key="6" case="first-letter">Datei</namespace>
<namespace key="7" case="first-letter">Datei Diskussion</namespace>
<namespace key="8" case="first-letter">MediaWiki</namespace>
<namespace key="9" case="first-letter">MediaWiki Diskussion</namespace>
<namespace key="10" case="first-letter">Vorlage</namespace>
<namespace key="11" case="first-letter">Vorlage Diskussion</namespace>
<namespace key="12" case="first-letter">Hilfe</namespace>
<namespace key="13" case="first-letter">Hilfe Diskussion</namespace>
<namespace key="14" case="first-letter">Kategorie</namespace>
<namespace key="15" case="first-letter">Kategorie Diskussion</namespace>
</namespaces>
</siteinfo>
<page>
<title>{{page1_title}}</title>
<ns>0</ns>
<id>1</id>
<revision>
<id>4</id>
<timestamp>2020-07-10T04:11:31Z</timestamp>
<contributor>
<username>Heffalump</username>
<id>3</id>
</contributor>
<comment>Testing slots</comment>
<origin>4</origin>
<model>wikitext</model>
<format>text/x-wiki</format>
<text bytes="5" sha1="syvtbocopvw4f81bf07ocly0sl8ybqo" xml:space="preserve">Hello</text>
<content>
<role>importfailuretest</role>
<origin>4</origin>
<model>not-a-defined-model</model>
<format>text/x-wiki</format>
<text bytes="14" sha1="p2w9gtded1hduym7e0wokxbezokvq8c" xml:space="preserve">This is a slot</text>
</content>
<sha1>2zn8g94g6g8vb3y98u8wbnxxhtmksm6</sha1>
</revision>
</page>
</mediawiki>

View file

@ -81,8 +81,8 @@ class ImportFailureTest extends MediaWikiLangTestCase {
yield [ 'MissingMainTextField', 'MWException', '/^Missing text field in import.$/' ];
yield [ 'MissingSlotTextField', 'MWException', '/^Missing text field in import.$/' ];
yield [ 'MissingSlotRole', 'MWException', '/^Missing role for imported slot.$/' ];
yield [ 'UnknownSlotRole', 'PHPUnit\Framework\Error\Notice',
'/SlotRoleRegistry::getRoleHandler: known but undefined slot role/' ];
yield [ 'UndefinedSlotRole', 'MWException', '/^Undefined slot role .*$/' ];
yield [ 'UndefinedContentModel', 'MWException', '/not registered on this wiki/' ];
}
/**

View file

@ -43,7 +43,8 @@ class ImportableOldRevisionImporterTest extends MediaWikiIntegrationTestCase {
true,
new NullLogger(),
$services->getDBLoadBalancer(),
$services->getRevisionStore()
$services->getRevisionStore(),
$services->getSlotRoleRegistry()
);
$result = $importer->import( $revision );
$this->assertTrue( $result );