diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index 1b0ad4770..492a94edd 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -25,15 +25,10 @@ class Cache private $root; private $enabled = true; - public function __construct(IOInterface $io, $cacheKey = null) + public function __construct(IOInterface $io, $cacheDir) { $this->io = $io; - - if (defined('PHP_WINDOWS_VERSION_MAJOR')) { - $this->root = getenv('APPDATA') . rtrim('/Composer/cache/' . $cacheKey, '/') . '/'; - } else { - $this->root = getenv('HOME') . rtrim('/.composer/cache/' . $cacheKey, '/') . '/'; - } + $this->root = rtrim($cacheDir, '/\\') . '/'; if (!is_dir($this->root)) { if (!@mkdir($this->root, 0777, true)) { diff --git a/src/Composer/Config.php b/src/Composer/Config.php index a052f60e4..9cb08d73f 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -58,6 +58,9 @@ class Config $env = 'COMPOSER_' . strtoupper(strtr($key, '-', '_')); return $this->process(getenv($env) ?: $this->config[$key]); + case 'home': + return rtrim($this->process($this->config[$key]), '/\\'); + default: return $this->process($this->config[$key]); } diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 295fabab1..4f3b799c8 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -32,19 +32,22 @@ class Factory // load main Composer configuration if (!$home = getenv('COMPOSER_HOME')) { if (defined('PHP_WINDOWS_VERSION_MAJOR')) { - $home = getenv('APPDATA') . '/Composer/'; + $home = getenv('APPDATA') . '/Composer'; } else { - $home = getenv('HOME') . '/.composer/'; + $home = getenv('HOME') . '/.composer'; } } $config = new Config(); - $file = new JsonFile($home.'config.json'); + $file = new JsonFile($home.'/config.json'); if ($file->exists()) { $config->merge($file->read()); } + // add home dir to the config + $config->merge(array('config' => array('home' => $home))); + return $config; } @@ -91,7 +94,7 @@ class Factory ProcessExecutor::setTimeout((int) $config->get('process-timeout')); // initialize repository manager - $rm = $this->createRepositoryManager($io); + $rm = $this->createRepositoryManager($io, $config); // load default repository unless it's explicitly disabled $localConfig = $this->addPackagistRepository($localConfig); @@ -130,9 +133,9 @@ class Factory return $composer; } - protected function createRepositoryManager(IOInterface $io) + protected function createRepositoryManager(IOInterface $io, Config $config) { - $rm = new RepositoryManager($io); + $rm = new RepositoryManager($io, $config); $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository'); $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository'); diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 450dfdf33..9778f294b 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -16,6 +16,7 @@ use Composer\Package\Loader\ArrayLoader; use Composer\Package\LinkConstraint\VersionConstraint; use Composer\Json\JsonFile; use Composer\Cache; +use Composer\Config; use Composer\IO\IOInterface; use Composer\Util\RemoteFilesystem; @@ -29,20 +30,20 @@ class ComposerRepository extends ArrayRepository protected $packages; protected $cache; - public function __construct(array $config, IOInterface $io) + public function __construct(array $repoConfig, IOInterface $io, Config $config) { - if (!preg_match('{^\w+://}', $config['url'])) { + if (!preg_match('{^\w+://}', $repoConfig['url'])) { // assume http as the default protocol - $config['url'] = 'http://'.$config['url']; + $repoConfig['url'] = 'http://'.$repoConfig['url']; } - $config['url'] = rtrim($config['url'], '/'); - if (function_exists('filter_var') && !filter_var($config['url'], FILTER_VALIDATE_URL)) { - throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$config['url']); + $repoConfig['url'] = rtrim($repoConfig['url'], '/'); + if (function_exists('filter_var') && !filter_var($repoConfig['url'], FILTER_VALIDATE_URL)) { + throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$repoConfig['url']); } - $this->url = $config['url']; + $this->url = $repoConfig['url']; $this->io = $io; - $this->cache = new Cache($io, preg_replace('{[^a-z0-9.]}', '-', $this->url)); + $this->cache = new Cache($io, $config->get('home').'/cache/'.preg_replace('{[^a-z0-9.]}', '-', $this->url)); } protected function initialize() diff --git a/src/Composer/Repository/PearRepository.php b/src/Composer/Repository/PearRepository.php index a73d2c8b4..9c4bf7ba7 100644 --- a/src/Composer/Repository/PearRepository.php +++ b/src/Composer/Repository/PearRepository.php @@ -16,6 +16,7 @@ use Composer\IO\IOInterface; use Composer\Package\Loader\ArrayLoader; use Composer\Util\RemoteFilesystem; use Composer\Json\JsonFile; +use Composer\Config; use Composer\Downloader\TransportException; /** @@ -31,18 +32,18 @@ class PearRepository extends ArrayRepository private $io; private $rfs; - public function __construct(array $config, IOInterface $io, RemoteFilesystem $rfs = null) + public function __construct(array $repoConfig, IOInterface $io, Config $config, RemoteFilesystem $rfs = null) { - if (!preg_match('{^https?://}', $config['url'])) { - $config['url'] = 'http://'.$config['url']; + if (!preg_match('{^https?://}', $repoConfig['url'])) { + $repoConfig['url'] = 'http://'.$repoConfig['url']; } - if (function_exists('filter_var') && !filter_var($config['url'], FILTER_VALIDATE_URL)) { - throw new \UnexpectedValueException('Invalid url given for PEAR repository: '.$config['url']); + if (function_exists('filter_var') && !filter_var($repoConfig['url'], FILTER_VALIDATE_URL)) { + throw new \UnexpectedValueException('Invalid url given for PEAR repository: '.$repoConfig['url']); } - $this->url = rtrim($config['url'], '/'); - $this->channel = !empty($config['channel']) ? $config['channel'] : null; + $this->url = rtrim($repoConfig['url'], '/'); + $this->channel = !empty($repoConfig['channel']) ? $repoConfig['channel'] : null; $this->io = $io; $this->rfs = $rfs ?: new RemoteFilesystem($this->io); } diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index 4935ef68c..8dd684082 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -13,6 +13,7 @@ namespace Composer\Repository; use Composer\IO\IOInterface; +use Composer\Config; /** * Repositories manager. @@ -27,10 +28,12 @@ class RepositoryManager private $repositories = array(); private $repositoryClasses = array(); private $io; + private $config; - public function __construct(IOInterface $io) + public function __construct(IOInterface $io, Config $config) { $this->io = $io; + $this->config = $config; } /** @@ -94,7 +97,7 @@ class RepositoryManager } $class = $this->repositoryClasses[$type]; - return new $class($config, $this->io); + return new $class($config, $this->io, $this->config); } /** diff --git a/src/Composer/Repository/VcsRepository.php b/src/Composer/Repository/VcsRepository.php index 80a1390e5..00499b5bb 100644 --- a/src/Composer/Repository/VcsRepository.php +++ b/src/Composer/Repository/VcsRepository.php @@ -19,6 +19,7 @@ use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Package\Loader\ArrayLoader; use Composer\IO\IOInterface; +use Composer\Config; /** * @author Jordi Boggiano @@ -32,7 +33,7 @@ class VcsRepository extends ArrayRepository protected $versionParser; protected $type; - public function __construct(array $config, IOInterface $io, array $drivers = null) + public function __construct(array $repoConfig, IOInterface $io, Config $config = null, array $drivers = null) { $this->drivers = $drivers ?: array( 'github' => 'Composer\Repository\Vcs\GitHubDriver', @@ -43,9 +44,9 @@ class VcsRepository extends ArrayRepository 'hg' => 'Composer\Repository\Vcs\HgDriver', ); - $this->url = $config['url']; + $this->url = $repoConfig['url']; $this->io = $io; - $this->type = isset($config['type']) ? $config['type'] : 'vcs'; + $this->type = isset($repoConfig['type']) ? $repoConfig['type'] : 'vcs'; $this->verbose = $io->isVerbose(); }