CompositeRepository.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 = $repositories;
  32. }
  33. /**
  34. * Returns all the wrapped repositories
  35. *
  36. * @return array
  37. */
  38. public function getRepositories()
  39. {
  40. return $this->repositories;
  41. }
  42. /**
  43. * {@inheritdoc}
  44. */
  45. public function hasPackage(PackageInterface $package)
  46. {
  47. foreach ($this->repositories as $repository) {
  48. /* @var $repository RepositoryInterface */
  49. if ($repository->hasPackage($package)) {
  50. return true;
  51. }
  52. }
  53. return false;
  54. }
  55. /**
  56. * {@inheritdoc}
  57. */
  58. public function findPackage($name, $version)
  59. {
  60. foreach ($this->repositories as $repository) {
  61. /* @var $repository RepositoryInterface */
  62. $package = $repository->findPackage($name, $version);
  63. if (null !== $package) {
  64. return $package;
  65. }
  66. }
  67. return null;
  68. }
  69. /**
  70. * {@inheritdoc}
  71. */
  72. public function findPackages($name, $version = null)
  73. {
  74. $packages = array();
  75. foreach ($this->repositories as $repository) {
  76. /* @var $repository RepositoryInterface */
  77. $packages[] = $repository->findPackages($name, $version);
  78. }
  79. return call_user_func_array('array_merge', $packages);
  80. }
  81. /**
  82. * {@inheritDoc}
  83. */
  84. public function filterPackages($callback, $class = 'Composer\Package\Package')
  85. {
  86. foreach ($this->repositories as $repository) {
  87. if (false === $repository->filterPackages($callback, $class)) {
  88. return false;
  89. }
  90. }
  91. return true;
  92. }
  93. /**
  94. * {@inheritdoc}
  95. */
  96. public function getPackages()
  97. {
  98. $packages = array();
  99. foreach ($this->repositories as $repository) {
  100. /* @var $repository RepositoryInterface */
  101. $packages[] = $repository->getPackages();
  102. }
  103. return call_user_func_array('array_merge', $packages);
  104. }
  105. /**
  106. * {@inheritdoc}
  107. */
  108. public function removePackage(PackageInterface $package)
  109. {
  110. foreach ($this->repositories as $repository) {
  111. /* @var $repository RepositoryInterface */
  112. $repository->removePackage($package);
  113. }
  114. }
  115. /**
  116. * {@inheritdoc}
  117. */
  118. public function count()
  119. {
  120. $total = 0;
  121. foreach ($this->repositories as $repository) {
  122. /* @var $repository RepositoryInterface */
  123. $total += $repository->count();
  124. }
  125. return $total;
  126. }
  127. /**
  128. * Add a repository.
  129. * @param RepositoryInterface $repository
  130. */
  131. public function addRepository(RepositoryInterface $repository)
  132. {
  133. $this->repositories[] = $repository;
  134. }
  135. }