diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 3c59ffaf7..ff9a15dba 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -12,6 +12,7 @@ namespace Composer\Autoload; +use Composer\Config; use Composer\Installer\InstallationManager; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; @@ -24,12 +25,14 @@ use Composer\Util\Filesystem; */ class AutoloadGenerator { - public function dump(RepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir) + public function dump(Config $config, RepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir) { $filesystem = new Filesystem(); - $filesystem->ensureDirectoryExists($installationManager->getVendorPath()); + $filesystem->ensureDirectoryExists($config->get('vendor-dir')); + $vendorPath = strtr(realpath($config->get('vendor-dir')), '\\', '/'); + $targetDir = $vendorPath.'/'.$targetDir; $filesystem->ensureDirectoryExists($targetDir); - $vendorPath = strtr(realpath($installationManager->getVendorPath()), '\\', '/'); + $relVendorPath = $filesystem->findShortestPath(getcwd(), $vendorPath, true); $vendorPathCode = $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true); $vendorPathToTargetDirCode = $filesystem->findShortestPathCode($vendorPath, realpath($targetDir), true); diff --git a/src/Composer/Config.php b/src/Composer/Config.php index e9bc28199..275eaa8d7 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -105,7 +105,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, '-', '_')); - return $this->process(getenv($env) ?: $this->config[$key]); + return rtrim($this->process(getenv($env) ?: $this->config[$key]), '/\\'); case 'home': return rtrim($this->process($this->config[$key]), '/\\'); diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index d10c438f8..deab987b8 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -21,6 +21,7 @@ use Composer\DependencyResolver\Solver; use Composer\DependencyResolver\SolverProblemsException; use Composer\Downloader\DownloadManager; use Composer\Installer\InstallationManager; +use Composer\Config; use Composer\Installer\NoopInstaller; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; @@ -48,6 +49,11 @@ class Installer */ protected $io; + /** + * @var Config + */ + protected $config; + /** * @var PackageInterface */ @@ -105,6 +111,7 @@ class Installer * Constructor * * @param IOInterface $io + * @param Config $config * @param PackageInterface $package * @param DownloadManager $downloadManager * @param RepositoryManager $repositoryManager @@ -113,9 +120,10 @@ class Installer * @param EventDispatcher $eventDispatcher * @param AutoloadGenerator $autoloadGenerator */ - public function __construct(IOInterface $io, PackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher, AutoloadGenerator $autoloadGenerator) + public function __construct(IOInterface $io, Config $config, PackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher, AutoloadGenerator $autoloadGenerator) { $this->io = $io; + $this->config = $config; $this->package = $package; $this->downloadManager = $downloadManager; $this->repositoryManager = $repositoryManager; @@ -201,7 +209,7 @@ class Installer // write autoloader $this->io->write('Generating autoload files'); $localRepos = new CompositeRepository($this->repositoryManager->getLocalRepositories()); - $this->autoloadGenerator->dump($localRepos, $this->package, $this->installationManager, $this->installationManager->getVendorPath() . '/composer'); + $this->autoloadGenerator->dump($this->config, $localRepos, $this->package, $this->installationManager, 'composer'); if ($this->runScripts) { // dispatch post event @@ -561,6 +569,7 @@ class Installer return new static( $io, + $composer->getConfig(), $composer->getPackage(), $composer->getDownloadManager(), $composer->getRepositoryManager(), @@ -643,6 +652,19 @@ class Installer return $this; } + /** + * set the config instance + * + * @param Config $config + * @return Installer + */ + public function setConfig(Config $config) + { + $this->config = $config; + + return $this; + } + /** * run in verbose mode * diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index 0e7e7a947..ca8035eda 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -35,29 +35,6 @@ class InstallationManager { private $installers = array(); private $cache = array(); - private $vendorPath; - - /** - * Creates an instance of InstallationManager - * - * @param string $vendorDir Relative path to the vendor directory - * @throws \InvalidArgumentException - */ - public function __construct($vendorDir = 'vendor') - { - $fs = new Filesystem(); - - if ($fs->isAbsolutePath($vendorDir)) { - $basePath = getcwd(); - $relativePath = $fs->findShortestPath($basePath.'/file', $vendorDir); - if ($fs->isAbsolutePath($relativePath)) { - throw new \InvalidArgumentException("Vendor dir ($vendorDir) must be accessible from the directory ($basePath)."); - } - $this->vendorPath = $relativePath; - } else { - $this->vendorPath = rtrim($vendorDir, '/'); - } - } /** * Adds installer @@ -217,21 +194,6 @@ class InstallationManager return $installer->getInstallPath($package); } - /** - * Returns the vendor path - * - * @param boolean $absolute Whether or not to return an absolute path - * @return string path - */ - public function getVendorPath($absolute = false) - { - if (!$absolute) { - return $this->vendorPath; - } - - return getcwd().DIRECTORY_SEPARATOR.$this->vendorPath; - } - private function notifyInstall(PackageInterface $package) { if ($package->getRepository() instanceof NotifiableRepositoryInterface) { diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index aceda0258..f39248d33 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -21,6 +21,7 @@ use Composer\Test\TestCase; class AutoloadGeneratorTest extends TestCase { public $vendorDir; + private $config; private $workingDir; private $im; private $repository; @@ -36,6 +37,14 @@ class AutoloadGeneratorTest extends TestCase $this->vendorDir = $this->workingDir.DIRECTORY_SEPARATOR.'composer-test-autoload'; $this->ensureDirectoryExistsAndClear($this->vendorDir); + $this->config = $this->getMock('Composer\Config'); + $this->config->expects($this->any()) + ->method('get') + ->with($this->equalTo('vendor-dir')) + ->will($this->returnCallback(function () use ($that) { + return $that->vendorDir; + })); + $this->dir = getcwd(); chdir($this->workingDir); @@ -47,12 +56,6 @@ class AutoloadGeneratorTest extends TestCase ->will($this->returnCallback(function ($package) use ($that) { return $that->vendorDir.'/'.$package->getName(); })); - $this->im->expects($this->any()) - ->method('getVendorPath') - ->will($this->returnCallback(function () use ($that) { - return $that->vendorDir; - })); - $this->repository = $this->getMock('Composer\Repository\RepositoryInterface'); $this->generator = new AutoloadGenerator(); @@ -92,7 +95,7 @@ class AutoloadGeneratorTest extends TestCase $this->createClassFile($this->workingDir); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertAutoloadFiles('main', $this->vendorDir.'/composer'); $this->assertAutoloadFiles('classmap', $this->vendorDir.'/composer', 'classmap'); } @@ -117,7 +120,7 @@ class AutoloadGeneratorTest extends TestCase $this->createClassFile($this->vendorDir); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertAutoloadFiles('main3', $this->vendorDir.'/composer'); $this->assertAutoloadFiles('classmap3', $this->vendorDir.'/composer', 'classmap'); } @@ -137,7 +140,7 @@ class AutoloadGeneratorTest extends TestCase $this->vendorDir .= '/subdir'; mkdir($this->vendorDir.'/composer', 0777, true); $this->createClassFile($this->workingDir); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertAutoloadFiles('main2', $this->vendorDir.'/composer'); $this->assertAutoloadFiles('classmap2', $this->vendorDir.'/composer', 'classmap'); } @@ -154,7 +157,7 @@ class AutoloadGeneratorTest extends TestCase ->method('getPackages') ->will($this->returnValue(array())); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertFileEquals(__DIR__.'/Fixtures/autoload_target_dir.php', $this->vendorDir.'/autoload.php'); } @@ -174,7 +177,7 @@ class AutoloadGeneratorTest extends TestCase ->will($this->returnValue($packages)); mkdir($this->vendorDir.'/composer', 0777, true); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertAutoloadFiles('vendors', $this->vendorDir.'/composer'); $this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated, even if empty."); } @@ -201,7 +204,7 @@ class AutoloadGeneratorTest extends TestCase file_put_contents($this->vendorDir.'/b/b/src/b.php', 'vendorDir.'/b/b/lib/c.php', 'generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated."); $this->assertEquals( array( @@ -238,7 +241,7 @@ class AutoloadGeneratorTest extends TestCase file_put_contents($this->vendorDir.'/b/b/test.php', 'vendorDir.'/c/c/foo/test.php', 'generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated."); $this->assertEquals( array( @@ -270,7 +273,7 @@ class AutoloadGeneratorTest extends TestCase file_put_contents($this->vendorDir.'/a/a/test.php', 'vendorDir.'/b/b/test2.php', 'generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertFileEquals(__DIR__.'/Fixtures/autoload_functions.php', $this->vendorDir.'/autoload.php'); include $this->vendorDir . '/autoload.php'; @@ -294,7 +297,7 @@ class AutoloadGeneratorTest extends TestCase ->will($this->returnValue($packages)); mkdir($this->vendorDir.'/composer', 0777, true); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/composer'); + $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer'); $this->assertAutoloadFiles('override_vendors', $this->vendorDir.'/composer'); } @@ -322,7 +325,7 @@ class AutoloadGeneratorTest extends TestCase mkdir($this->vendorDir."/composer", 0777, true); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir."/composer"); + $this->generator->dump($this->config, $this->repository, $package, $this->im, "composer"); $this->assertFileEquals(__DIR__.'/Fixtures/include_paths.php', $this->vendorDir.'/composer/include_paths.php'); $this->assertEquals( @@ -351,7 +354,7 @@ class AutoloadGeneratorTest extends TestCase mkdir($this->vendorDir."/composer", 0777, true); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir."/composer"); + $this->generator->dump($this->config, $this->repository, $package, $this->im, "composer"); $oldIncludePath = get_include_path(); @@ -379,7 +382,7 @@ class AutoloadGeneratorTest extends TestCase mkdir($this->vendorDir."/composer", 0777, true); - $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir."/composer"); + $this->generator->dump($this->config, $this->repository, $package, $this->im, "composer"); $this->assertFalse(file_exists($this->vendorDir."/composer/include_paths.php")); } diff --git a/tests/Composer/Test/Installer/InstallationManagerTest.php b/tests/Composer/Test/Installer/InstallationManagerTest.php index 5b404939e..553a3e129 100644 --- a/tests/Composer/Test/Installer/InstallationManagerTest.php +++ b/tests/Composer/Test/Installer/InstallationManagerTest.php @@ -24,21 +24,6 @@ class InstallationManagerTest extends \PHPUnit_Framework_TestCase $this->repository = $this->getMock('Composer\Repository\InstalledRepositoryInterface'); } - public function testVendorDirOutsideTheWorkingDir() - { - $manager = new InstallationManager(realpath(getcwd().'/../')); - $this->assertSame('../', $manager->getVendorPath()); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testVendorDirNotAccessible() - { - $manager = new InstallationManager('/oops'); - $this->assertSame('../', $manager->getVendorPath()); - } - public function testAddGetInstaller() { $installer = $this->createInstallerMock(); @@ -63,7 +48,6 @@ class InstallationManagerTest extends \PHPUnit_Framework_TestCase { $manager = $this->getMockBuilder('Composer\Installer\InstallationManager') ->setMethods(array('install', 'update', 'uninstall')) - ->setConstructorArgs(array('vendor')) ->getMock(); $installOperation = new InstallOperation($this->createPackageMock()); @@ -226,18 +210,6 @@ class InstallationManagerTest extends \PHPUnit_Framework_TestCase $manager->uninstall($this->repository, $operation); } - public function testGetVendorPathAbsolute() - { - $manager = new InstallationManager('vendor'); - $this->assertEquals(getcwd().DIRECTORY_SEPARATOR.'vendor', $manager->getVendorPath(true)); - } - - public function testGetVendorPathRelative() - { - $manager = new InstallationManager('vendor'); - $this->assertEquals('vendor', $manager->getVendorPath()); - } - private function createInstallerMock() { return $this->getMockBuilder('Composer\Installer\InstallerInterface') diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index 0dfff7b0b..87812ad35 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -55,7 +55,7 @@ class InstallerTest extends TestCase $eventDispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher')->disableOriginalConstructor()->getMock(); $autoloadGenerator = $this->getMock('Composer\Autoload\AutoloadGenerator'); - $installer = new Installer($io, clone $rootPackage, $downloadManager, $repositoryManager, $locker, $installationManager, $eventDispatcher, $autoloadGenerator); + $installer = new Installer($io, $config, clone $rootPackage, $downloadManager, $repositoryManager, $locker, $installationManager, $eventDispatcher, $autoloadGenerator); $result = $installer->run(); $this->assertTrue($result);