From 2b08df51929c4c3135c0b2c80a5a8f4060cf9449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Tue, 6 Mar 2012 10:11:45 +0100 Subject: [PATCH 1/2] Changed repository priority in the pool --- src/Composer/DependencyResolver/Pool.php | 2 +- .../DependencyResolver/DefaultPolicyTest.php | 4 +- .../Test/DependencyResolver/PoolTest.php | 39 ++++++++++++++++++- .../Test/DependencyResolver/RequestTest.php | 26 +++++++++++++ .../Test/DependencyResolver/SolverTest.php | 20 +++++++++- 5 files changed, 86 insertions(+), 5 deletions(-) diff --git a/src/Composer/DependencyResolver/Pool.php b/src/Composer/DependencyResolver/Pool.php index b5eeb26e7..24ef5427a 100644 --- a/src/Composer/DependencyResolver/Pool.php +++ b/src/Composer/DependencyResolver/Pool.php @@ -53,7 +53,7 @@ class Pool throw new \RuntimeException("Could not determine repository priority. The repository was not registered in the pool."); } - return $priority; + return -$priority; } /** diff --git a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php index 82f913d36..4bb7c9e33 100644 --- a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php +++ b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php @@ -80,7 +80,7 @@ class DefaultPolicyTest extends TestCase $this->assertEquals($expected, $selected); } - public function testSelectLastRepo() + public function testSelectFirstRepo() { $this->repoImportant = new ArrayRepository; @@ -88,8 +88,8 @@ class DefaultPolicyTest extends TestCase $this->repoImportant->addPackage($packageAImportant = $this->getPackage('A', '1.0')); $this->pool->addRepository($this->repoInstalled); - $this->pool->addRepository($this->repo); $this->pool->addRepository($this->repoImportant); + $this->pool->addRepository($this->repo); $literals = array(new Literal($packageA, true), new Literal($packageAImportant, true)); $expected = array(new Literal($packageAImportant, true)); diff --git a/tests/Composer/Test/DependencyResolver/PoolTest.php b/tests/Composer/Test/DependencyResolver/PoolTest.php index 643be0428..c98570534 100644 --- a/tests/Composer/Test/DependencyResolver/PoolTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolTest.php @@ -54,7 +54,44 @@ class PoolTest extends TestCase $secondPriority = $pool->getPriority($secondRepository); $this->assertEquals(0, $firstPriority); - $this->assertEquals(1, $secondPriority); + $this->assertEquals(-1, $secondPriority); + } + + public function testWhatProvidesSamePackageForDifferentRepositories() + { + $pool = new Pool; + $firstRepository = new ArrayRepository; + $secondRepository = new ArrayRepository; + + $firstPackage = $this->getPackage('foo', '1'); + $secondPackage = $this->getPackage('foo', '1'); + $thirdPackage = $this->getPackage('foo', '2'); + + $firstRepository->addPackage($firstPackage); + $secondRepository->addPackage($secondPackage); + $secondRepository->addPackage($thirdPackage); + + $pool->addRepository($firstRepository); + $pool->addRepository($secondRepository); + + $this->assertEquals(array($firstPackage, $secondPackage, $thirdPackage), $pool->whatProvides('foo')); + } + + public function testWhatProvidesPackageWithConstraint() + { + $pool = new Pool; + $repository = new ArrayRepository; + + $firstPackage = $this->getPackage('foo', '1'); + $secondPackage = $this->getPackage('foo', '2'); + + $repository->addPackage($firstPackage); + $repository->addPackage($secondPackage); + + $pool->addRepository($repository); + + $this->assertEquals(array($firstPackage, $secondPackage), $pool->whatProvides('foo')); + $this->assertEquals(array($secondPackage), $pool->whatProvides('foo', $this->getVersionConstraint('==', '2'))); } public function testPackageById() diff --git a/tests/Composer/Test/DependencyResolver/RequestTest.php b/tests/Composer/Test/DependencyResolver/RequestTest.php index e5010e0e4..d11c3c427 100644 --- a/tests/Composer/Test/DependencyResolver/RequestTest.php +++ b/tests/Composer/Test/DependencyResolver/RequestTest.php @@ -47,6 +47,32 @@ class RequestTest extends TestCase $request->getJobs()); } + public function testRequestInstallSamePackageFromDifferentRepositories() + { + $pool = new Pool; + $repo1 = new ArrayRepository; + $repo2 = new ArrayRepository; + + $foo1 = $this->getPackage('foo', '1'); + $foo2 = $this->getPackage('foo', '1'); + + $repo1->addPackage($foo1); + $repo2->addPackage($foo2); + + $pool->addRepository($repo1); + $pool->addRepository($repo2); + + $request = new Request($pool); + $request->install('foo', $this->getVersionConstraint('=', '1')); + + $this->assertEquals( + array( + array('packages' => array($foo1, $foo2), 'cmd' => 'install', 'packageName' => 'foo'), + ), + $request->getJobs() + ); + } + public function testUpdateAll() { $pool = new Pool; diff --git a/tests/Composer/Test/DependencyResolver/SolverTest.php b/tests/Composer/Test/DependencyResolver/SolverTest.php index fe6782177..fc7dce7a1 100644 --- a/tests/Composer/Test/DependencyResolver/SolverTest.php +++ b/tests/Composer/Test/DependencyResolver/SolverTest.php @@ -9,7 +9,6 @@ * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ - namespace Composer\Test\DependencyResolver; use Composer\Repository\ArrayRepository; @@ -70,6 +69,25 @@ class SolverTest extends TestCase } } + public function testSolverInstallSamePackageFromDifferentRepositories() + { + $repo1 = new ArrayRepository; + $repo2 = new ArrayRepository; + + $repo1->addPackage($foo1 = $this->getPackage('foo', '1')); + $repo2->addPackage($foo2 = $this->getPackage('foo', '1')); + + $this->pool->addRepository($this->repoInstalled); + $this->pool->addRepository($repo1); + $this->pool->addRepository($repo2); + + $this->request->install('foo'); + + $this->checkSolverResult(array( + array('job' => 'install', 'package' => $foo1), + )); + } + public function testSolverInstallWithDeps() { $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); From 9021c862375770e7e5b255137ff331af2e9ff261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Haso=C5=88?= Date: Tue, 6 Mar 2012 10:14:11 +0100 Subject: [PATCH 2/2] Added packagist repository as the last repository with the lowest priority --- src/Composer/Factory.php | 39 +++++++++++------ tests/Composer/Test/FactoryTest.php | 65 +++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 tests/Composer/Test/FactoryTest.php diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index faab0add1..354b6bbdb 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -78,17 +78,7 @@ class Factory $rm = $this->createRepositoryManager($io); // load default repository unless it's explicitly disabled - $loadPackagist = true; - if (isset($packageConfig['repositories'])) { - foreach ($packageConfig['repositories'] as $repo) { - if (isset($repo['packagist']) && $repo['packagist'] === false) { - $loadPackagist = false; - } - } - } - if ($loadPackagist) { - $this->addPackagistRepository($rm); - } + $packageConfig = $this->addPackagistRepository($packageConfig); // load local repository $this->addLocalRepository($rm, $vendorDir); @@ -134,9 +124,32 @@ class Factory $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/.composer/installed.json'))); } - protected function addPackagistRepository(RepositoryManager $rm) + protected function addPackagistRepository(array $packageConfig) { - $rm->addRepository(new Repository\ComposerRepository(array('url' => 'http://packagist.org'))); + $loadPackagist = true; + $packagistConfig = array( + 'type' => 'composer', + 'url' => 'http://packagist.org' + ); + if (isset($packageConfig['repositories'])) { + foreach ($packageConfig['repositories'] as $key => $repo) { + if (isset($repo['packagist'])) { + if (true === $repo['packagist']) { + $packageConfig['repositories'][$key] = $packagistConfig; + } + + $loadPackagist = false; + } + } + } else { + $packageConfig['repositories'] = array(); + } + + if ($loadPackagist) { + $packageConfig['repositories'][] = $packagistConfig; + } + + return $packageConfig; } protected function createDownloadManager(IOInterface $io) diff --git a/tests/Composer/Test/FactoryTest.php b/tests/Composer/Test/FactoryTest.php new file mode 100644 index 000000000..2bb838fef --- /dev/null +++ b/tests/Composer/Test/FactoryTest.php @@ -0,0 +1,65 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test; + +use Composer\Factory; + +class FactoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider dataAddPackagistRepository + */ + public function testAddPackagistRepository($expected, $config) + { + $factory = new Factory(); + + $ref = new \ReflectionMethod($factory, 'addPackagistRepository'); + $ref->setAccessible(true); + + $this->assertEquals($expected, $ref->invoke($factory, $config)); + } + + public function dataAddPackagistRepository() + { + $f = function() { + $repositories = func_get_args(); + return array('repositories' => $repositories); + }; + + $data = array(); + $data[] = array( + $f(array('type' => 'composer', 'url' => 'http://packagist.org')), + $f() + ); + + $data[] = array( + $f(array('packagist' => false)), + $f(array('packagist' => false)) + ); + + $data[] = array( + $f( + array('type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'), + array('type' => 'composer', 'url' => 'http://packagist.org'), + array('type' => 'pear', 'url' => 'http://pear.composer.org') + ), + $f( + array('type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'), + array('packagist' => true), + array('type' => 'pear', 'url' => 'http://pear.composer.org') + ) + ); + + return $data; + } +}