MergeBox.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace Fgm\ComposerCheck;
  3. /**
  4. * Class MergeBox merges requirements with locked versions and platform.
  5. */
  6. class MergeBox {
  7. /**
  8. * The composer.lock loader.
  9. *
  10. * @var \Fgm\ComposerCheck\LockLoader
  11. */
  12. protected $lock;
  13. /**
  14. * The merged packages.
  15. *
  16. * @var array
  17. */
  18. protected $packages;
  19. /**
  20. * The composer.json loader.
  21. *
  22. * @var \Fgm\ComposerCheck\RequirementsLoader
  23. */
  24. protected $requirements;
  25. /**
  26. * MergeBox constructor.
  27. *
  28. * @param \Fgm\ComposerCheck\RequirementsLoader $requirementsLoader
  29. * The composer.json loader.
  30. * @param \Fgm\ComposerCheck\LockLoader $lockLoader
  31. * The composer.lock loader.
  32. * @param bool $all
  33. * Include all packages or only those required ?
  34. */
  35. public function __construct(RequirementsLoader $requirementsLoader, LockLoader $lockLoader, bool $all) {
  36. $this->requirements = $requirementsLoader;
  37. $this->lock = $lockLoader;
  38. $this->all = $all;
  39. }
  40. /**
  41. * Perform reconciliation of requirements and locked packages/platform.
  42. */
  43. public function merge() {
  44. $packages = ['dev' => [], 'run' => []];
  45. foreach ($this->requirements->getRun() as $package => $requirement) {
  46. if ($this->all || !empty($requirement)) {
  47. $package = strtolower($package);
  48. $packages['run'][$package]['requirement'] = $requirement;
  49. }
  50. }
  51. foreach ($this->requirements->getDev() as $package => $requirement) {
  52. if ($this->all || !empty($requirement)) {
  53. $package = strtolower($package);
  54. $packages['dev'][$package]['requirement'] = $requirement;
  55. }
  56. }
  57. foreach ($this->lock->getRun() as $packageInfo) {
  58. $package = strtolower($packageInfo['name']);
  59. if ($this->all || !empty($packages['run'][$package])) {
  60. $version = $packageInfo['version'];
  61. $packages['run'][$package]['version'] = $version;
  62. }
  63. }
  64. foreach ($this->lock->getDev() as $packageInfo) {
  65. $package = strtolower($packageInfo['name']);
  66. if ($this->all || !empty($packages['dev'][$package])) {
  67. $version = $packageInfo['version'];
  68. $packages['dev'][$package]['version'] = $version;
  69. }
  70. }
  71. ksort($packages['dev']);
  72. ksort($packages['run']);
  73. $this->packages = $packages;
  74. }
  75. /**
  76. * Return the merge results.
  77. *
  78. * @return array
  79. * An array of requirements and matching locked versions.
  80. */
  81. public function getRows() {
  82. return $this->packages;
  83. }
  84. }