Merge "Handle missing namespace prefix in XML dumps more gracefully"

This commit is contained in:
jenkins-bot 2017-03-08 05:07:56 +00:00 committed by Gerrit Code Review
commit 22806b0a45
3 changed files with 27 additions and 3 deletions

View file

@ -433,6 +433,9 @@ class XmlDumpWriter {
global $wgContLang;
$prefix = $wgContLang->getFormattedNsText( $title->getNamespace() );
// @todo Emit some kind of warning to the user if $title->getNamespace() !==
// NS_MAIN and $prefix === '' (viz. pages in an unregistered namespace)
if ( $prefix !== '' ) {
$prefix .= ':';
}

View file

@ -115,15 +115,23 @@ class NamespaceAwareForeignTitleFactory implements ForeignTitleFactory {
protected function parseTitleWithNs( $title, $ns ) {
$pieces = explode( ':', $title, 2 );
// Is $title of the form Namespace:Title (true), or just Title (false)?
$titleIncludesNamespace = ( $ns != '0' && count( $pieces ) === 2 );
if ( isset( $this->foreignNamespaces[$ns] ) ) {
$namespaceName = $this->foreignNamespaces[$ns];
} else {
$namespaceName = $ns == '0' ? '' : $pieces[0];
// If the foreign wiki is misconfigured, XML dumps can contain a page with
// a non-zero namespace ID, but whose title doesn't contain a colon
// (T114115). In those cases, output a made-up namespace name to avoid
// collisions. The ImportTitleFactory might replace this with something
// more appropriate.
$namespaceName = $titleIncludesNamespace ? $pieces[0] : "Ns$ns";
}
// We assume that the portion of the page title before the colon is the
// namespace name, except in the case of namespace 0
if ( $ns != '0' ) {
// namespace name, except in the case of namespace 0.
if ( $titleIncludesNamespace ) {
$pageName = $pieces[1];
} else {
$pageName = $title;

View file

@ -36,10 +36,18 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
'MainNamespaceArticle', null,
new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
],
[
'Magic:_The_Gathering', 0,
new ForeignTitle( 0, '', 'Magic:_The_Gathering' ),
],
[
'Talk:Nice_talk', 1,
new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
],
[
'Talk:Magic:_The_Gathering', 1,
new ForeignTitle( 1, 'Talk', 'Magic:_The_Gathering' ),
],
[
'Bogus:Nice_talk', 0,
new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
@ -56,6 +64,11 @@ class NamespaceAwareForeignTitleFactoryTest extends MediaWikiTestCase {
'Bogus:Nice_talk', 1,
new ForeignTitle( 1, 'Talk', 'Nice_talk' ),
],
// Misconfigured wiki with unregistered namespace (T114115)
[
'Nice_talk', 1234,
new ForeignTitle( 1234, 'Ns1234', 'Nice_talk' ),
],
];
}