QuickDeploy.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Deploy\Strategy;
  7. use Magento\Deploy\Package\PackagePool;
  8. use Magento\Deploy\Package\Package;
  9. use Magento\Deploy\Process\Queue;
  10. /**
  11. * Quick deployment strategy implementation
  12. */
  13. class QuickDeploy implements StrategyInterface
  14. {
  15. /**
  16. * @var PackagePool
  17. */
  18. private $packagePool;
  19. /**
  20. * @var Queue
  21. */
  22. private $queue;
  23. /**
  24. * @var array
  25. */
  26. private $baseLocalePackages = [];
  27. /**
  28. * QuickDeploy constructor
  29. *
  30. * @param PackagePool $packagePool
  31. * @param Queue $queue
  32. */
  33. public function __construct(
  34. PackagePool $packagePool,
  35. Queue $queue
  36. ) {
  37. $this->packagePool = $packagePool;
  38. $this->queue = $queue;
  39. }
  40. /**
  41. * @inheritdoc
  42. */
  43. public function deploy(array $options)
  44. {
  45. $groupedPackages = $deployPackages = [];
  46. $packages = $this->packagePool->getPackagesForDeployment($options);
  47. foreach ($packages as $package) {
  48. /** @var Package $package */
  49. if ($package->isVirtual()) {
  50. // skip packages which can not be referenced directly
  51. continue;
  52. }
  53. $level = $this->getInheritanceLevel($package);
  54. $groupedPackages[$level][$package->getPath()] = $package;
  55. }
  56. ksort($groupedPackages);
  57. foreach ($groupedPackages as $level => $levelPackages) {
  58. $this->preparePackages($level, $levelPackages);
  59. }
  60. foreach ($groupedPackages as $levelPackages) {
  61. foreach ($levelPackages as $package) {
  62. $this->queue->add($package);
  63. $deployPackages[] = $package;
  64. }
  65. }
  66. $this->queue->process();
  67. return $deployPackages;
  68. }
  69. /**
  70. * @param int $level
  71. * @param Package[] $levelPackages
  72. * @return void
  73. */
  74. private function preparePackages($level, array $levelPackages)
  75. {
  76. foreach ($levelPackages as $package) {
  77. $package->aggregate();
  78. if ($level > 1) {
  79. $parentPackage = null;
  80. $packageId = $package->getArea() . '/' . $package->getTheme();
  81. // use base package if it is not the same as current
  82. if (isset($this->baseLocalePackages[$packageId])
  83. && $package !== $this->baseLocalePackages[$packageId]
  84. ) {
  85. $parentPackage = $this->baseLocalePackages[$packageId];
  86. } else {
  87. $parentPackages = $package->getParentPackages();
  88. foreach (array_reverse($parentPackages) as $ancestorPackage) {
  89. if (!$ancestorPackage->isVirtual()) {
  90. $parentPackage = $ancestorPackage;
  91. break;
  92. }
  93. if ($parentPackage === null) {
  94. $parentPackage = $ancestorPackage;
  95. }
  96. }
  97. }
  98. if ($parentPackage) {
  99. $package->setParent($parentPackage);
  100. }
  101. }
  102. }
  103. }
  104. /**
  105. * Calculate proper inheritance level for the given package
  106. *
  107. * @param Package $package
  108. * @return int
  109. */
  110. private function getInheritanceLevel(Package $package)
  111. {
  112. $level = $package->getInheritanceLevel();
  113. $packageId = $package->getArea() . '/' . $package->getTheme();
  114. if (!isset($this->baseLocalePackages[$packageId])) {
  115. $this->baseLocalePackages[$packageId] = $package;
  116. } else {
  117. ++$level;
  118. }
  119. return $level;
  120. }
  121. }