*/
class ExtensionRegistry {
+ /**
+ * Version of the highest supported manifest version
+ */
+ const MANIFEST_VERSION = 1;
+
+ /**
+ * Version of the oldest supported manifest version
+ */
+ const OLDEST_MANIFEST_VERSION = 1;
+
/**
* @var BagOStuff
*/
*/
public function queue( $path ) {
global $wgExtensionInfoMTime;
- if ( $wgExtensionInfoMTime !== false ) {
- $mtime = $wgExtensionInfoMTime;
- } else {
- $mtime = filemtime( $path );
+
+ $mtime = $wgExtensionInfoMTime;
+ if ( $mtime === false ) {
+ if ( file_exists( $path ) ) {
+ $mtime = filemtime( $path );
+ } else {
+ throw new Exception( "$path does not exist!" );
+ }
+ if ( !$mtime ) {
+ $err = error_get_last();
+ throw new Exception( "Couldn't stat $path: {$err['message']}" );
+ }
}
$this->queued[$path] = $mtime;
}
$this->queued = array();
}
+ /**
+ * Get the current load queue. Not intended to be used
+ * outside of the installer.
+ *
+ * @return array
+ */
+ public function getQueue() {
+ return $this->queued;
+ }
+
+ /**
+ * Clear the current load queue. Not intended to be used
+ * outside of the installer.
+ */
+ public function clearQueue() {
+ $this->queued = array();
+ }
+
/**
* Process a queue of extensions and return their extracted data
*
* @throws Exception
*/
public function readFromQueue( array $queue ) {
- $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
$autoloadClasses = array();
$processor = new ExtensionProcessor();
foreach ( $queue as $path => $mtime ) {
if ( !is_array( $info ) ) {
throw new Exception( "$path is not a valid JSON file." );
}
+ if ( !isset( $info['manifest_version'] ) ) {
+ // For backwards-compatability, assume a version of 1
+ $info['manifest_version'] = 1;
+ }
+ $version = $info['manifest_version'];
+ if ( $version < self::OLDEST_MANIFEST_VERSION || $version > self::MANIFEST_VERSION ) {
+ throw new Exception( "$path: unsupported manifest_version: {$version}" );
+ }
$autoload = $this->processAutoLoader( dirname( $path ), $info );
// Set up the autoloader now so custom processors will work
$GLOBALS['wgAutoloadClasses'] += $autoload;
$autoloadClasses += $autoload;
- $processor->extractInfo( $path, $info );
+ $processor->extractInfo( $path, $info, $version );
}
$data = $processor->getExtractedInfo();
// Need to set this so we can += to it later
protected function exportExtractedData( array $info ) {
foreach ( $info['globals'] as $key => $val ) {
- if ( !isset( $GLOBALS[$key] ) || !$GLOBALS[$key] ) {
+ if ( !isset( $GLOBALS[$key] ) || ( is_array( $GLOBALS[$key] ) && !$GLOBALS[$key] ) ) {
$GLOBALS[$key] = $val;
} elseif ( $key === 'wgHooks' || $key === 'wgExtensionCredits' ) {
// Special case $wgHooks and $wgExtensionCredits, which require a recursive merge.