Merge "registration: Only allow one extension to set a specific config setting"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 24 Oct 2017 17:52:23 +0000 (17:52 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 24 Oct 2017 17:52:23 +0000 (17:52 +0000)
1  2 
includes/registration/ExtensionProcessor.php

@@@ -450,7 -450,7 +450,7 @@@ class ExtensionProcessor implements Pro
                        }
                        foreach ( $info['config'] as $key => $val ) {
                                if ( $key[0] !== '@' ) {
-                                       $this->globals["$prefix$key"] = $val;
+                                       $this->addConfigGlobal( "$prefix$key", $val );
                                }
                        }
                }
                                if ( isset( $data['path'] ) && $data['path'] ) {
                                        $value = "$dir/$value";
                                }
-                               $this->globals["$prefix$key"] = $value;
+                               $this->addConfigGlobal( "$prefix$key", $value );
                        }
                }
        }
  
+       /**
+        * Helper function to set a value to a specific global, if it isn't set already.
+        *
+        * @param string $key The config key with the prefix and anything
+        * @param mixed $value The value of the config
+        */
+       private function addConfigGlobal( $key, $value ) {
+               if ( array_key_exists( $key, $this->globals ) ) {
+                       throw new RuntimeException(
+                               "The configuration setting '$key' was already set by another extension,"
+                               . " and cannot be set again." );
+               }
+               $this->globals[$key] = $value;
+       }
        protected function extractServiceWiringFiles( $dir, array $info ) {
                if ( isset( $info['ServiceWiringFiles'] ) ) {
                        foreach ( $info['ServiceWiringFiles'] as $path ) {
        public function getExtraAutoloaderPaths( $dir, array $info ) {
                $paths = [];
                if ( isset( $info['load_composer_autoloader'] ) && $info['load_composer_autoloader'] === true ) {
 -                      $path = "$dir/vendor/autoload.php";
 -                      if ( file_exists( $path ) ) {
 -                              $paths[] = $path;
 -                      }
 +                      $paths[] = "$dir/vendor/autoload.php";
                }
                return $paths;
        }