diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 28b00fd49..18b4a57f4 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -18,6 +18,7 @@ use Composer\IO\IOInterface; use Composer\Package\Archiver; use Composer\Repository\ComposerRepository; use Composer\Repository\RepositoryManager; +use Composer\Repository\RepositoryInterface; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Symfony\Component\Console\Formatter\OutputFormatterStyle; @@ -252,6 +253,7 @@ class Factory $generator = new AutoloadGenerator($dispatcher); $composer->setAutoloadGenerator($generator); + $globalRepository = $this->createGlobalRepository($config, $vendorDir); $pm = $this->createPluginManager($composer, $io); $composer->setPluginManager($pm); @@ -306,6 +308,24 @@ class Factory $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/composer/installed.json'))); } + /** + * @param Config $config + * @param string $vendorDir + */ + protected function createGlobalRepository(Config $config, $vendorDir) + { + if ($config->get('home') == $vendorDir) { + return null; + } + + $path = $config->get('home').'/vendor/composer/installed.json'; + if (!file_exists($path)) { + return null; + } + + return new Repository\InstalledFilesystemRepository(new JsonFile($path)); + } + /** * @param IO\IOInterface $io * @param Config $config @@ -367,9 +387,9 @@ class Factory /** * @return Plugin\PluginManager */ - protected function createPluginManager(Composer $composer, IOInterface $io) + protected function createPluginManager(Composer $composer, IOInterface $io, RepositoryInterface $globalRepository = null) { - return new Plugin\PluginManager($composer, $io); + return new Plugin\PluginManager($composer, $io, $globalRepository); } /** diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index cfbc804d6..0a4cd5583 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -14,8 +14,9 @@ namespace Composer\Plugin; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; -use Composer\Package\Package; use Composer\IO\IOInterface; +use Composer\Package\Package; +use Composer\Repository\RepositoryInterface; use Composer\Package\PackageInterface; use Composer\Package\Link; use Composer\DependencyResolver\Pool; @@ -29,6 +30,7 @@ class PluginManager { protected $composer; protected $io; + protected $globalRepository; protected $plugins = array(); @@ -39,10 +41,11 @@ class PluginManager * * @param Composer $composer */ - public function __construct(Composer $composer, IOInterface $io) + public function __construct(Composer $composer, IOInterface $io, RepositoryInterface $globalRepository = null) { $this->composer = $composer; $this->io = $io; + $this->globalRepository = $globalRepository; } /** @@ -53,11 +56,10 @@ class PluginManager $repo = $this->composer->getRepositoryManager()->getLocalRepository(); if ($repo) { - foreach ($repo->getPackages() as $package) { - if ('composer-plugin' === $package->getType() || 'composer-installer' === $package->getType()) { - $this->registerPackage($package); - } - } + $this->loadRepository($repo); + } + if ($this->globalRepository) { + $this->loadRepository($this->globalRepository); } } @@ -86,6 +88,15 @@ class PluginManager return $this->plugins; } + protected function loadRepository(RepositoryInterface $repo) + { + foreach ($repo->getPackages() as $package) { + if ('composer-plugin' === $package->getType() || 'composer-installer' === $package->getType()) { + $this->registerPackage($package); + } + } + } + /** * Recursively generates a map of package names to packages for all deps * @@ -150,6 +161,9 @@ class PluginManager $pool = new Pool('dev'); $pool->addRepository($this->composer->getRepositoryManager()->getLocalRepository()); + if ($this->globalRepository) { + $pool->addRepository($this->globalRepository); + } $autoloadPackages = array($package->getName() => $package); $autoloadPackages = $this->collectDependencies($pool, $autoloadPackages, $package);