Ver código fonte

Merge pull request #3448 from cs278/config-env-test

Fix config tests when environment variables are set
Nils Adermann 10 anos atrás
pai
commit
b21f2be651
2 arquivos alterados com 30 adições e 7 exclusões
  1. 26 3
      src/Composer/Config.php
  2. 4 4
      tests/Composer/Test/ConfigTest.php

+ 26 - 3
src/Composer/Config.php

@@ -58,12 +58,17 @@ class Config
     private $repositories;
     private $configSource;
     private $authConfigSource;
+    private $useEnvironment;
 
-    public function __construct()
+    /**
+     * @param boolean $useEnvironment Use COMPOSER_ environment variables to replace config settings
+     */
+    public function __construct($useEnvironment = true)
     {
         // load defaults
         $this->config = static::$defaultConfig;
         $this->repositories = static::$defaultRepositories;
+        $this->useEnvironment = (bool) $useEnvironment;
     }
 
     public function setConfigSource(ConfigSourceInterface $source)
@@ -159,7 +164,7 @@ class Config
                 // convert foo-bar to COMPOSER_FOO_BAR and check if it exists since it overrides the local config
                 $env = 'COMPOSER_' . strtoupper(strtr($key, '-', '_'));
 
-                $val = rtrim($this->process(getenv($env) ?: $this->config[$key]), '/\\');
+                $val = rtrim($this->process($this->getComposerEnv($env) ?: $this->config[$key]), '/\\');
                 $val = preg_replace('#^(\$HOME|~)(/|$)#', rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '/\\') . '/', $val);
 
                 return $val;
@@ -201,7 +206,7 @@ class Config
                 return rtrim($this->process($this->config[$key]), '/\\');
 
             case 'discard-changes':
-                if ($env = getenv('COMPOSER_DISCARD_CHANGES')) {
+                if ($env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES')) {
                     if (!in_array($env, array('stash', 'true', 'false', '1', '0'), true)) {
                         throw new \RuntimeException(
                             "Invalid value for COMPOSER_DISCARD_CHANGES: {$env}. Expected 1, 0, true, false or stash"
@@ -288,4 +293,22 @@ class Config
             return $config->get($match[1]);
         }, $value);
     }
+
+    /**
+     * Reads the value of a Composer environment variable
+     *
+     * This should be used to read COMPOSER_ environment variables
+     * that overload config values.
+     *
+     * @param  string $var
+     * @return string|boolean
+     */
+    private function getComposerEnv($var)
+    {
+        if ($this->useEnvironment) {
+            return getenv($var);
+        }
+
+        return false;
+    }
 }

+ 4 - 4
tests/Composer/Test/ConfigTest.php

@@ -21,7 +21,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     public function testAddPackagistRepository($expected, $localConfig, $systemConfig = null)
     {
-        $config = new Config();
+        $config = new Config(false);
         if ($systemConfig) {
             $config->merge(array('repositories' => $systemConfig));
         }
@@ -102,7 +102,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
 
     public function testMergeGithubOauth()
     {
-        $config = new Config();
+        $config = new Config(false);
         $config->merge(array('config' => array('github-oauth' => array('foo' => 'bar'))));
         $config->merge(array('config' => array('github-oauth' => array('bar' => 'baz'))));
 
@@ -111,7 +111,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
 
     public function testVarReplacement()
     {
-        $config = new Config();
+        $config = new Config(false);
         $config->merge(array('config' => array('a' => 'b', 'c' => '{$a}')));
         $config->merge(array('config' => array('bin-dir' => '$HOME', 'cache-dir' => '~/foo/')));
 
@@ -123,7 +123,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
 
     public function testOverrideGithubProtocols()
     {
-        $config = new Config();
+        $config = new Config(false);
         $config->merge(array('config' => array('github-protocols' => array('https', 'git'))));
         $config->merge(array('config' => array('github-protocols' => array('https'))));