diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index cf3c041b5fe..fd21d6c5fbd 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -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() ); }, diff --git a/includes/import/ImportableOldRevisionImporter.php b/includes/import/ImportableOldRevisionImporter.php index b1033d3be5a..ae3a37c9233 100644 --- a/includes/import/ImportableOldRevisionImporter.php +++ b/includes/import/ImportableOldRevisionImporter.php @@ -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 ); diff --git a/tests/phpunit/data/import/UndefinedContentModel.xml b/tests/phpunit/data/import/UndefinedContentModel.xml new file mode 100644 index 00000000000..3cff369dbb0 --- /dev/null +++ b/tests/phpunit/data/import/UndefinedContentModel.xml @@ -0,0 +1,55 @@ + + + Test + wiki + http://example.com/wiki/ + MediaWiki Test + first-letter + + Medium + Spezial + + Diskussion + Benutzer + Benutzer Diskussion + Project + Project Diskussion + Datei + Datei Diskussion + MediaWiki + MediaWiki Diskussion + Vorlage + Vorlage Diskussion + Hilfe + Hilfe Diskussion + Kategorie + Kategorie Diskussion + + + + {{page1_title}} + 0 + 1 + + 4 + 2020-07-10T04:11:31Z + + Heffalump + 3 + + Testing slots + 4 + wikitext + text/x-wiki + Hello + + importfailuretest + 4 + not-a-defined-model + text/x-wiki + This is a slot + + 2zn8g94g6g8vb3y98u8wbnxxhtmksm6 + + + diff --git a/tests/phpunit/data/import/UnknownSlotRole.xml b/tests/phpunit/data/import/UndefinedSlotRole.xml similarity index 100% rename from tests/phpunit/data/import/UnknownSlotRole.xml rename to tests/phpunit/data/import/UndefinedSlotRole.xml diff --git a/tests/phpunit/includes/import/ImportFailureTest.php b/tests/phpunit/includes/import/ImportFailureTest.php index 9cd40c4b191..df207b65194 100644 --- a/tests/phpunit/includes/import/ImportFailureTest.php +++ b/tests/phpunit/includes/import/ImportFailureTest.php @@ -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/' ]; } /** diff --git a/tests/phpunit/includes/import/ImportableOldRevisionImporterTest.php b/tests/phpunit/includes/import/ImportableOldRevisionImporterTest.php index de0048c6851..3ff6ee89783 100644 --- a/tests/phpunit/includes/import/ImportableOldRevisionImporterTest.php +++ b/tests/phpunit/includes/import/ImportableOldRevisionImporterTest.php @@ -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 );