? 'ok'
: '(disabled; requires PHP bzip2 module)';
- $this->mDescription = <<<TEXT
+ $this->addDescription(
+ <<<TEXT
This script reads pages from an XML file as produced from Special:Export or
dumpBackup.php, and saves them into the current wiki.
Note that for very large data sets, importDump.php may be slow; there are
alternate methods which can be much faster for full site restoration:
<https://www.mediawiki.org/wiki/Manual:Importing_XML_dumps>
-TEXT;
+TEXT
+ );
$this->stderr = fopen( "php://stderr", "wt" );
$this->addOption( 'report',
'Report position and speed after every n pages processed', false, true );
$this->addOption( 'namespaces',
'Import only the pages from namespaces belonging to the list of ' .
'pipe-separated namespace names or namespace indexes', false, true );
+ $this->addOption( 'rootpage', 'Pages will be imported as subpages of the specified page',
+ false, true );
$this->addOption( 'dry-run', 'Parse dump without actually importing pages' );
$this->addOption( 'debug', 'Output extra verbose debug information' );
$this->addOption( 'uploads', 'Process file upload data if included (experimental)' );
}
$this->output( "Done!\n" );
- $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges\n" );
+ $this->output( "You might want to run rebuildrecentchanges.php to regenerate RecentChanges,\n" );
+ $this->output( "and initSiteStats.php to update page and revision counts\n" );
}
function setNsfilter( array $namespaces ) {
return;
}
- $this->nsFilter = array_unique( array_map( array( $this, 'getNsIndex' ), $namespaces ) );
+ $this->nsFilter = array_unique( array_map( [ $this, 'getNsIndex' ], $namespaces ) );
}
private function getNsIndex( $namespace ) {
global $wgContLang;
- if ( ( $result = $wgContLang->getNsIndex( $namespace ) ) !== false ) {
+ $result = $wgContLang->getNsIndex( $namespace );
+ if ( $result !== false ) {
return $result;
}
$ns = intval( $namespace );
* @return bool
*/
private function skippedNamespace( $obj ) {
+ $title = null;
if ( $obj instanceof Title ) {
- $ns = $obj->getNamespace();
+ $title = $obj;
} elseif ( $obj instanceof Revision ) {
- $ns = $obj->getTitle()->getNamespace();
+ $title = $obj->getTitle();
} elseif ( $obj instanceof WikiRevision ) {
- $ns = $obj->title->getNamespace();
+ $title = $obj->title;
} else {
throw new MWException( "Cannot get namespace of object in " . __METHOD__ );
}
+ if ( is_null( $title ) ) {
+ // Probably a log entry
+ return false;
+ }
+
+ $ns = $title->getNamespace();
+
return is_array( $this->nsFilter ) && !in_array( $ns, $this->nsFilter );
}
if ( !$this->dryRun ) {
// bluuuh hack
// call_user_func( $this->uploadCallback, $revision );
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = $this->getDB( DB_MASTER );
- return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
+ return $dbw->deadlockLoop( [ $revision, 'importUpload' ] );
}
}
}
}
wfWaitForSlaves();
- // XXX: Don't let deferred jobs array get absurdly large (bug 24375)
- DeferredUpdates::doUpdates( 'commit' );
}
function progress( $string ) {
$source = new ImportStreamSource( $handle );
$importer = new WikiImporter( $source, $this->getConfig() );
+ // Updating statistics require a lot of time so disable it
+ $importer->disableStatisticsUpdate();
+
if ( $this->hasOption( 'debug' ) ) {
$importer->setDebug( true );
}
if ( $this->hasOption( 'no-updates' ) ) {
$importer->setNoUpdates( true );
}
- $importer->setPageCallback( array( &$this, 'reportPage' ) );
+ if ( $this->hasOption( 'rootpage' ) ) {
+ $statusRootPage = $importer->setTargetRootPage( $this->getOption( 'rootpage' ) );
+ if ( !$statusRootPage->isGood() ) {
+ // Die here so that it doesn't print "Done!"
+ $this->error( $statusRootPage->getMessage()->text(), 1 );
+ return false;
+ }
+ }
+ $importer->setPageCallback( [ $this, 'reportPage' ] );
$this->importCallback = $importer->setRevisionCallback(
- array( &$this, 'handleRevision' ) );
+ [ $this, 'handleRevision' ] );
$this->uploadCallback = $importer->setUploadCallback(
- array( &$this, 'handleUpload' ) );
+ [ $this, 'handleUpload' ] );
$this->logItemCallback = $importer->setLogItemCallback(
- array( &$this, 'handleLogItem' ) );
+ [ $this, 'handleLogItem' ] );
if ( $this->uploads ) {
$importer->setImportUploads( true );
}