private $countableCache = [];
/** @var bool */
private $disableStatisticsUpdate = false;
+ private $usernamePrefix = 'imported';
+ private $assignKnownUsers = false;
+ private $triedCreations = [];
/**
* Creates an ImportXMLReader drawing from the source provided
if ( is_callable( $this->mNoticeCallback ) ) {
call_user_func( $this->mNoticeCallback, $msg, $params );
} else { # No ImportReporter -> CLI
- echo wfMessage( $msg, $params )->text() . "\n";
+ // T177997: the command line importers should call setNoticeCallback()
+ // for their own custom callback to echo the notice
+ wfDebug( wfMessage( $msg, $params )->text() . "\n" );
}
}
$this->mImportUploads = $import;
}
+ /**
+ * @since 1.31
+ * @param string $usernamePrefix Prefix to apply to unknown (and possibly also known) usernames
+ * @param bool $assignKnownUsers Whether to apply the prefix to usernames that exist locally
+ */
+ public function setUsernamePrefix( $usernamePrefix, $assignKnownUsers ) {
+ $this->usernamePrefix = rtrim( (string)$usernamePrefix, ':>' );
+ $this->assignKnownUsers = (bool)$assignKnownUsers;
+ }
+
/**
* Statistics update can cause a lot of time
* @since 1.29
$buffer = "";
while ( $this->reader->read() ) {
switch ( $this->reader->nodeType ) {
- case XMLReader::TEXT:
- case XMLReader::CDATA:
- case XMLReader::SIGNIFICANT_WHITESPACE:
- $buffer .= $this->reader->value;
- break;
- case XMLReader::END_ELEMENT:
- return $buffer;
+ case XMLReader::TEXT:
+ case XMLReader::CDATA:
+ case XMLReader::SIGNIFICANT_WHITESPACE:
+ $buffer .= $this->reader->value;
+ break;
+ case XMLReader::END_ELEMENT:
+ return $buffer;
}
}
/**
* Primary entry point
+ * @throws Exception
* @throws MWException
* @return bool
*/
}
if ( !isset( $logInfo['contributor']['username'] ) ) {
- $revision->setUsername( 'Unknown user' );
+ $revision->setUsername( $this->usernamePrefix . '>Unknown user' );
} else {
- $revision->setUsername( $logInfo['contributor']['username'] );
+ $revision->setUsername( $this->prefixUsername( $logInfo['contributor']['username'] ) );
}
return $this->logItemCallback( $revision );
/**
* @param array $pageInfo
* @param array $revisionInfo
+ * @throws MWException
* @return bool|mixed
*/
private function processRevision( $pageInfo, $revisionInfo ) {
if ( isset( $revisionInfo['contributor']['ip'] ) ) {
$revision->setUserIP( $revisionInfo['contributor']['ip'] );
} elseif ( isset( $revisionInfo['contributor']['username'] ) ) {
- $revision->setUsername( $revisionInfo['contributor']['username'] );
+ $revision->setUsername( $this->prefixUsername( $revisionInfo['contributor']['username'] ) );
} else {
- $revision->setUsername( 'Unknown user' );
+ $revision->setUsername( $this->usernamePrefix . '>Unknown user' );
}
if ( isset( $revisionInfo['sha1'] ) ) {
$revision->setSha1Base36( $revisionInfo['sha1'] );
$revision->setUserIP( $uploadInfo['contributor']['ip'] );
}
if ( isset( $uploadInfo['contributor']['username'] ) ) {
- $revision->setUsername( $uploadInfo['contributor']['username'] );
+ $revision->setUsername( $this->prefixUsername( $uploadInfo['contributor']['username'] ) );
}
$revision->setNoUpdates( $this->mNoUpdates );
return call_user_func( $this->mUploadCallback, $revision );
}
+ /**
+ * Add an interwiki prefix to the username, if appropriate
+ * @since 1.31
+ * @param string $name Name being imported
+ * @return string Name, possibly with the prefix prepended.
+ */
+ protected function prefixUsername( $name ) {
+ if ( !User::isUsableName( $name ) ) {
+ return $name;
+ }
+
+ if ( $this->assignKnownUsers ) {
+ if ( User::idFromName( $name ) ) {
+ return $name;
+ }
+
+ // See if any extension wants to create it.
+ if ( !isset( $this->triedCreations[$name] ) ) {
+ $this->triedCreations[$name] = true;
+ if ( !Hooks::run( 'ImportHandleUnknownUser', [ $name ] ) &&
+ User::idFromName( $name, User::READ_LATEST )
+ ) {
+ return $name;
+ }
+ }
+ }
+
+ return substr( $this->usernamePrefix . '>' . $name, 0, 255 );
+ }
+
/**
* @return array
*/