Check for unknown slot.
Bug: T220525 Change-Id: I89ac1679ea70cb403433f8b97fe11e8eb6811280
This commit is contained in:
parent
7ffacacc6b
commit
c69489f44c
6 changed files with 81 additions and 6 deletions
|
|
@ -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()
|
||||
);
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
55
tests/phpunit/data/import/UndefinedContentModel.xml
Normal file
55
tests/phpunit/data/import/UndefinedContentModel.xml
Normal 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>
|
||||
|
|
@ -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/' ];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
Loading…
Reference in a new issue