CompositeRepository.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. /*
  3. * This file is part of Composer.
  4. *
  5. * (c) Nils Adermann <naderman@naderman.de>
  6. * Jordi Boggiano <j.boggiano@seld.be>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Composer\Repository;
  12. use Composer\Package\PackageInterface;
  13. /**
  14. * Composite repository.
  15. *
  16. * @author Beau Simensen <beau@dflydev.com>
  17. */
  18. class CompositeRepository implements RepositoryInterface
  19. {
  20. /**
  21. * List of repositories
  22. * @var array
  23. */
  24. private $repositories;
  25. /**
  26. * Constructor
  27. * @param array $repositories
  28. */
  29. public function __construct(array $repositories)
  30. {
  31. $this->repositories = array();
  32. foreach ($repositories as $repo) {
  33. $this->addRepository($repo);
  34. }
  35. }
  36. /**
  37. * Returns all the wrapped repositories
  38. *
  39. * @return array
  40. */
  41. public function getRepositories()
  42. {
  43. return $this->repositories;
  44. }
  45. /**
  46. * {@inheritdoc}
  47. */
  48. public function hasPackage(PackageInterface $package)
  49. {
  50. foreach ($this->repositories as $repository) {
  51. /* @var $repository RepositoryInterface */
  52. if ($repository->hasPackage($package)) {
  53. return true;
  54. }
  55. }
  56. return false;
  57. }
  58. /**
  59. * {@inheritdoc}
  60. */
  61. public function findPackage($name, $version)
  62. {
  63. foreach ($this->repositories as $repository) {
  64. /* @var $repository RepositoryInterface */
  65. $package = $repository->findPackage($name, $version);
  66. if (null !== $package) {
  67. return $package;
  68. }
  69. }
  70. return null;
  71. }
  72. /**
  73. * {@inheritdoc}
  74. */
  75. public function findPackages($name, $version = null)
  76. {
  77. $packages = array();
  78. foreach ($this->repositories as $repository) {
  79. /* @var $repository RepositoryInterface */
  80. $packages[] = $repository->findPackages($name, $version);
  81. }
  82. return call_user_func_array('array_merge', $packages);
  83. }
  84. /**
  85. * {@inheritdoc}
  86. */
  87. public function search($query, $mode = 0)
  88. {
  89. $matches = array();
  90. foreach ($this->repositories as $repository) {
  91. /* @var $repository RepositoryInterface */
  92. $matches[] = $repository->search($query, $mode);
  93. }
  94. return call_user_func_array('array_merge', $matches);
  95. }
  96. /**
  97. * {@inheritDoc}
  98. */
  99. public function filterPackages($callback, $class = 'Composer\Package\Package')
  100. {
  101. foreach ($this->repositories as $repository) {
  102. if (false === $repository->filterPackages($callback, $class)) {
  103. return false;
  104. }
  105. }
  106. return true;
  107. }
  108. /**
  109. * {@inheritdoc}
  110. */
  111. public function getPackages()
  112. {
  113. $packages = array();
  114. foreach ($this->repositories as $repository) {
  115. /* @var $repository RepositoryInterface */
  116. $packages[] = $repository->getPackages();
  117. }
  118. return call_user_func_array('array_merge', $packages);
  119. }
  120. /**
  121. * {@inheritdoc}
  122. */
  123. public function removePackage(PackageInterface $package)
  124. {
  125. foreach ($this->repositories as $repository) {
  126. /* @var $repository RepositoryInterface */
  127. $repository->removePackage($package);
  128. }
  129. }
  130. /**
  131. * {@inheritdoc}
  132. */
  133. public function count()
  134. {
  135. $total = 0;
  136. foreach ($this->repositories as $repository) {
  137. /* @var $repository RepositoryInterface */
  138. $total += $repository->count();
  139. }
  140. return $total;
  141. }
  142. /**
  143. * Add a repository.
  144. * @param RepositoryInterface $repository
  145. */
  146. public function addRepository(RepositoryInterface $repository)
  147. {
  148. if ($repository instanceof self) {
  149. foreach ($repository->getRepositories() as $repo) {
  150. $this->addRepository($repo);
  151. }
  152. } else {
  153. $this->repositories[] = $repository;
  154. }
  155. }
  156. }