* Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Console\Helper\WrapperInterface; /** * Repositories manager. * * @author Jordi Boggiano * @author Konstantin Kudryashov * @author François Pluchino */ class RepositoryManager { private $localRepository; private $repositories = array(); private $repositoryClasses = array(); private $wrapper; public function __construct(WrapperInterface $wrapper) { $this->wrapper = $wrapper; } /** * Searches for a package by it's name and version in managed repositories. * * @param string $name package name * @param string $version package version * * @return PackageInterface|null */ public function findPackage($name, $version) { foreach ($this->repositories as $repository) { if ($package = $repository->findPackage($name, $version)) { return $package; } } } /** * Adds repository * * @param RepositoryInterface $repository repository instance */ public function addRepository(RepositoryInterface $repository) { $this->repositories[] = $repository; } /** * Returns a new repository for a specific installation type. * * @param string $type repository type * @param string $config repository configuration * @return RepositoryInterface * @throws InvalidArgumentException if repository for provided type is not registeterd */ public function createRepository($type, $config) { if (!isset($this->repositoryClasses[$type])) { throw new \InvalidArgumentException('Repository type is not registered: '.$type); } $class = $this->repositoryClasses[$type]; return new $class($config, $this->wrapper); } /** * Stores repository class for a specific installation type. * * @param string $type installation type * @param string $class class name of the repo implementation */ public function setRepositoryClass($type, $class) { $this->repositoryClasses[$type] = $class; } /** * Returns all repositories, except local one. * * @return array */ public function getRepositories() { return $this->repositories; } /** * Sets local repository for the project. * * @param RepositoryInterface $repository repository instance */ public function setLocalRepository(RepositoryInterface $repository) { $this->localRepository = $repository; } /** * Returns local repository for the project. * * @return RepositoryInterface */ public function getLocalRepository() { return $this->localRepository; } }