diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index 05dcc1b4a..649c66cd9 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -89,6 +89,18 @@ class RepositoryManager $this->repositories[] = $repository; } + /** + * Adds a repository to the beginning of the chain + * + * This is useful when injecting additional repositories that should trump Packagist, e.g. from a plugin. + * + * @param RepositoryInterface $repository repository instance + */ + public function prependRepository(RepositoryInterface $repository) + { + array_unshift($this->repositories, $repository); + } + /** * Returns a new repository for a specific installation type. * diff --git a/tests/Composer/Test/Repository/RepositoryManagerTest.php b/tests/Composer/Test/Repository/RepositoryManagerTest.php index 13e51fb18..bedd07f8e 100644 --- a/tests/Composer/Test/Repository/RepositoryManagerTest.php +++ b/tests/Composer/Test/Repository/RepositoryManagerTest.php @@ -32,6 +32,22 @@ class RepositoryManagerTest extends TestCase } } + public function testPrepend() + { + $rm = new RepositoryManager( + $this->getMock('Composer\IO\IOInterface'), + $this->getMock('Composer\Config'), + $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock() + ); + + $repository1 = $this->getMock('Composer\Repository\RepositoryInterface'); + $repository2 = $this->getMock('Composer\Repository\RepositoryInterface'); + $rm->addRepository($repository1); + $rm->prependRepository($repository2); + + $this->assertEquals(array($repository2, $repository1), $rm->getRepositories()); + } + /** * @dataProvider creationCases */