Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SystemPackage.php
Go to the documentation of this file.
1 <?php
7 namespace Magento\Setup\Model;
8 
13 
18 {
22  private $infoCommand;
23 
27  private $magentoComposerApplication;
28 
32  private $composerInfo;
33 
34  const EDITION_COMMUNITY = 'magento/product-community-edition';
35 
36  const EDITION_ENTERPRISE = 'magento/product-enterprise-edition';
37 
44  public function __construct(
45  MagentoComposerApplicationFactory $composerAppFactory,
46  ComposerInformation $composerInfo
47  ) {
48  $this->infoCommand = $composerAppFactory->createInfoCommand();
49  $this->magentoComposerApplication = $composerAppFactory->create();
50  $this->composerInfo = $composerInfo;
51  }
52 
59  public function getPackageVersions()
60  {
61  $currentCE = '0';
62 
63  $result = [];
64  $systemPackages = $this->getInstalledSystemPackages();
65  foreach ($systemPackages as $systemPackage) {
66  $systemPackageInfo = $this->infoCommand->run($systemPackage);
67  if (!$systemPackageInfo) {
68  throw new \RuntimeException("We cannot retrieve information on $systemPackage.");
69  }
70 
71  $versions = $this->getSystemPackageVersions($systemPackageInfo);
72 
73  if ($systemPackageInfo['name'] == static::EDITION_COMMUNITY) {
74  $currentCE = $systemPackageInfo[InfoCommand::CURRENT_VERSION];
75  }
76 
77  if (count($versions) > 1) {
78  $versions[0]['name'] .= ' (latest)';
79  }
80 
81  $result[] = [
82  'package' => $systemPackageInfo['name'],
83  'versions' => $versions,
84  ];
85  }
86 
87  if (!in_array(static::EDITION_ENTERPRISE, $systemPackages)) {
88  $result = array_merge($this->getAllowedEnterpriseVersions($currentCE), $result);
89  }
90 
91  $result = $this->formatPackages($result);
92 
93  return $result;
94  }
95 
102  public function getAllowedEnterpriseVersions($currentCE)
103  {
104  $result = [];
105  $enterpriseVersions = $this->infoCommand->run(static::EDITION_ENTERPRISE);
106  $eeVersions = [];
107  $maxVersion = '';
108  if (is_array($enterpriseVersions) && array_key_exists(InfoCommand::AVAILABLE_VERSIONS, $enterpriseVersions)) {
109  $enterpriseVersions = $this->sortVersions($enterpriseVersions);
110  if (isset($enterpriseVersions[InfoCommand::AVAILABLE_VERSIONS][0])) {
111  $maxVersion = $enterpriseVersions[InfoCommand::AVAILABLE_VERSIONS][0];
112  }
113  $eeVersions = $this->filterEeVersions($currentCE, $enterpriseVersions, $maxVersion);
114  }
115 
116  if (!empty($eeVersions)) {
117  $result[] = [
118  'package' => static::EDITION_ENTERPRISE,
119  'versions' => $eeVersions,
120  ];
121  }
122  return $result;
123  }
124 
131  public function getSystemPackageVersions($systemPackageInfo)
132  {
133  $editionType = '';
134  $versions = [];
135 
136  if ($systemPackageInfo['name'] == static::EDITION_COMMUNITY) {
137  $editionType .= 'CE';
138  } elseif ($systemPackageInfo['name'] == static::EDITION_ENTERPRISE) {
139  $editionType .= 'EE';
140  }
141 
142  foreach ($systemPackageInfo[InfoCommand::NEW_VERSIONS] as $version) {
143  $versions[] = ['id' => $version, 'name' => 'Version ' . $version . ' ' . $editionType, 'current' => false];
144  }
145 
146  if ($systemPackageInfo[InfoCommand::CURRENT_VERSION]) {
147  $versions[] = [
148  'id' => $systemPackageInfo[InfoCommand::CURRENT_VERSION],
149  'name' => 'Version ' . $systemPackageInfo[InfoCommand::CURRENT_VERSION] . ' ' . $editionType,
150  'current' => true,
151  ];
152  }
153  return $versions;
154  }
155 
161  public function getInstalledSystemPackages()
162  {
163  $locker = $this->magentoComposerApplication->createComposer()->getLocker();
164 
166  foreach ($locker->getLockedRepository()->getPackages() as $package) {
167  $packageName = $package->getName();
168  if ($this->composerInfo->isSystemPackage($packageName)) {
169  if ($packageName == static::EDITION_COMMUNITY) {
170  if ($this->composerInfo->isPackageInComposerJson($packageName)) {
171  $systemPackages[] = $packageName;
172  }
173  } else {
174  $systemPackages[] = $packageName;
175  }
176  }
177  }
178  if (empty($systemPackages)) {
179  throw new \RuntimeException(
180  'We\'re sorry, no components are available because you cloned the Magento 2 GitHub repository. ' .
181  'You must manually update components as discussed in the ' .
182  '<a href="http://devdocs.magento.com/guides/v2.0/install-gde/install/cli/dev_options.html">' .
183  'Installation Guide</a>.'
184  );
185  }
186  return $systemPackages;
187  }
188 
193  public function sortVersions($enterpriseVersions)
194  {
195  usort($enterpriseVersions[InfoCommand::AVAILABLE_VERSIONS], function ($versionOne, $versionTwo) {
196  if (version_compare($versionOne, $versionTwo, '==')) {
197  return 0;
198  }
199  return (version_compare($versionOne, $versionTwo, '<')) ? 1 : -1;
200  });
201 
202  return $enterpriseVersions;
203  }
204 
211  private function formatPackages($packages)
212  {
213  $versions = [];
214 
215  foreach ($packages as $package) {
216  foreach ($package['versions'] as $version) {
217  $version['package'] = $package['package'];
218 
219  if (preg_match('/^[0-9].[0-9].[0-9]$/', $version['id']) || $version['current']) {
220  $version['stable'] = true;
221  } else {
222  $version['name'] = $version['name'] . ' (unstable version)';
223  $version['stable'] = false;
224  }
225 
226  $versions[] = $version;
227  }
228  }
229 
230  usort($versions, function ($versionOne, $versionTwo) {
231  if (version_compare($versionOne['id'], $versionTwo['id'], '==')) {
232  if ($versionOne['package'] === static::EDITION_COMMUNITY) {
233  return 1;
234  }
235  return 0;
236  }
237  return (version_compare($versionOne['id'], $versionTwo['id'], '<')) ? 1 : -1;
238  });
239 
240  return $versions;
241  }
242 
249  public function filterEeVersions($currentCE, $enterpriseVersions, $maxVersion)
250  {
251  $eeVersions = [];
252  foreach ($enterpriseVersions[InfoCommand::AVAILABLE_VERSIONS] as $version) {
253  $requires = $this->composerInfo->getPackageRequirements(static::EDITION_ENTERPRISE, $version);
254  if (array_key_exists(static::EDITION_COMMUNITY, $requires)) {
256  $ceRequire = $requires[static::EDITION_COMMUNITY];
257  if (version_compare(
258  $ceRequire->getConstraint()->getPrettyString(),
259  $currentCE,
260  '>='
261  )) {
262  $name = 'Version ' . $version . ' EE';
263  if ($maxVersion == $version) {
264  $name .= ' (latest)';
265  }
266  $eeVersions[] = ['id' => $version, 'name' => $name, 'current' => false];
267  }
268  }
269  }
270  return $eeVersions;
271  }
272 }
sortVersions($enterpriseVersions)
__construct(MagentoComposerApplicationFactory $composerAppFactory, ComposerInformation $composerInfo)
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
getSystemPackageVersions($systemPackageInfo)
if(!isset($_GET['name'])) $name
Definition: log.php:14