HTMLTextAreaField: Honor 'rows' setting in OOUI format
[lhc/web/wiklou.git] / includes / registration / ExtensionRegistry.php
index 40ae2eb..d48a1bd 100644 (file)
  */
 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
         */
@@ -70,10 +80,18 @@ class ExtensionRegistry {
         */
        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;
        }
@@ -83,8 +101,6 @@ class ExtensionRegistry {
                        return;
                }
 
-               $this->queued = array_unique( $this->queued );
-
                // See if this queue is in APC
                $key = wfMemcKey( 'registration', md5( json_encode( $this->queued ) ) );
                $data = $this->cache->get( $key );
@@ -97,7 +113,7 @@ class ExtensionRegistry {
                        // did that, but it should be cached
                        $data['globals']['wgAutoloadClasses'] += $data['autoload'];
                        unset( $data['autoload'] );
-                       $this->cache->set( $key, $data );
+                       $this->cache->set( $key, $data, 60 * 60 * 24 );
                }
                $this->queued = array();
        }
@@ -110,7 +126,6 @@ class ExtensionRegistry {
         * @throws Exception
         */
        public function readFromQueue( array $queue ) {
-               $data = array( 'globals' => array( 'wgAutoloadClasses' => array() ) );
                $autoloadClasses = array();
                $processor = new ExtensionProcessor();
                foreach ( $queue as $path => $mtime ) {
@@ -122,11 +137,19 @@ class ExtensionRegistry {
                        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
@@ -140,7 +163,7 @@ class ExtensionRegistry {
 
        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.