@@ -54,51 +54,167 @@ public function __construct(
54
54
*/
55
55
public function getPackageVersions ()
56
56
{
57
- $ systemPackage = null ;
57
+ $ currentCE = '0 ' ;
58
+ $ result = [];
59
+ $ systemPackages = [];
60
+ $ systemPackages = $ this ->getInstalledSystemPackages ($ systemPackages );
61
+ if (empty ($ systemPackages )) {
62
+ throw new \RuntimeException ('System packages not found ' );
63
+ }
64
+ foreach ($ systemPackages as $ systemPackage ) {
65
+ $ versions = [];
66
+ $ systemPackageInfo = $ this ->infoCommand ->run ($ systemPackage );
67
+ if (!$ systemPackageInfo ) {
68
+ throw new \RuntimeException ('System package not found ' );
69
+ }
58
70
59
- $ locker = $ this ->magentoComposerApplication -> createComposer ()-> getLocker ( );
71
+ $ versions = $ this ->getSystemPackageVersions ( $ systemPackageInfo , $ versions );
60
72
61
- foreach ($ locker ->getLockedRepository ()->getPackages () as $ package ) {
62
- $ packageName = $ package ->getName ();
73
+ if ($ systemPackageInfo ['name ' ] == 'magento/product-community-edition ' ) {
74
+ $ currentCE = $ systemPackageInfo [InfoCommand::CURRENT_VERSION ];
75
+ }
76
+ if (count ($ versions ) > 1 ) {
77
+ $ versions [0 ]['name ' ] .= ' (latest) ' ;
78
+ }
63
79
64
- if ($ this ->composerInfo ->isSystemPackage ($ packageName )) {
65
- $ systemPackage = $ packageName ;
66
- break ;
80
+ if (count ($ versions ) >= 1 ) {
81
+ $ versions [count ($ versions ) - 1 ]['name ' ] .= ' (current) ' ;
67
82
}
83
+
84
+ $ result [] = [
85
+ 'package ' => $ systemPackageInfo ['name ' ],
86
+ 'versions ' => $ versions
87
+ ];
68
88
}
69
89
70
- $ systemPackageInfo = $ this ->infoCommand ->run ($ systemPackage );
90
+ if (!in_array ('magento/product-enterprise-edition ' , $ systemPackages )) {
91
+ $ result = array_merge ($ this ->getAllowedEnterpriseVersions ($ currentCE ), $ result );
92
+ }
93
+
94
+ return $ result ;
95
+ }
71
96
72
- if (!$ systemPackageInfo ) {
73
- throw new \RuntimeException ('System package not found ' );
97
+ /**
98
+ * @param string $currentCE
99
+ * @return array
100
+ */
101
+ public function getAllowedEnterpriseVersions ($ currentCE )
102
+ {
103
+ $ result = [];
104
+ $ enterpriseVersions = $ this ->infoCommand ->run ('magento/product-enterprise-edition ' );
105
+ $ eeVersions = [];
106
+ $ maxVersion = '' ;
107
+ if (array_key_exists ('available_versions ' , $ enterpriseVersions )) {
108
+ $ enterpriseVersions = $ this ->sortVersions ($ enterpriseVersions );
109
+ if (isset ($ enterpriseVersions ['available_versions ' ][0 ])) {
110
+ $ maxVersion = $ enterpriseVersions ['available_versions ' ][0 ];
111
+ }
112
+ $ eeVersions = $ this ->filterEeVersions ($ currentCE , $ enterpriseVersions , $ maxVersion );
74
113
}
75
114
76
- $ versions = [];
115
+ if (!empty ($ eeVersions )) {
116
+ $ result [] = [
117
+ 'package ' => 'magento/product-enterprise-edition ' ,
118
+ 'versions ' => $ eeVersions
119
+ ];
120
+ }
121
+ return $ result ;
122
+ }
77
123
124
+ /**
125
+ * @param array $systemPackageInfo
126
+ * @param array $versions
127
+ * @return array
128
+ */
129
+ public function getSystemPackageVersions ($ systemPackageInfo , $ versions )
130
+ {
131
+ $ editionType = '' ;
132
+ if ($ systemPackageInfo ['name ' ] == 'magento/product-community-edition ' ) {
133
+ $ editionType .= 'CE ' ;
134
+ } else if ($ systemPackageInfo ['name ' ] == 'magento/product-enterprise-edition ' ) {
135
+ $ editionType .= 'EE ' ;
136
+ }
78
137
foreach ($ systemPackageInfo [InfoCommand::NEW_VERSIONS ] as $ version ) {
79
- $ versions [] = ['id ' => $ version , 'name ' => 'Version ' . $ version ];
138
+ $ versions [] = ['id ' => $ version , 'name ' => 'Version ' . $ version . ' ' . $ editionType ];
80
139
}
81
140
82
141
if ($ systemPackageInfo [InfoCommand::CURRENT_VERSION ]) {
83
142
$ versions [] = [
84
143
'id ' => $ systemPackageInfo [InfoCommand::CURRENT_VERSION ],
85
- 'name ' => 'Version ' . $ systemPackageInfo [InfoCommand::CURRENT_VERSION ]
144
+ 'name ' => 'Version ' . $ systemPackageInfo [InfoCommand::CURRENT_VERSION ] . ' ' . $ editionType
86
145
];
87
146
}
147
+ return $ versions ;
148
+ }
88
149
89
- if (count ($ versions ) > 1 ) {
90
- $ versions [0 ]['name ' ] .= ' (latest) ' ;
91
- }
150
+ /**
151
+ * @param array $systemPackages
152
+ * @return array
153
+ */
154
+ public function getInstalledSystemPackages ($ systemPackages )
155
+ {
156
+ $ systemPackages = [];
157
+ $ locker = $ this ->magentoComposerApplication ->createComposer ()->getLocker ();
92
158
93
- if (count ($ versions ) >= 1 ) {
94
- $ versions [count ($ versions ) - 1 ]['name ' ] .= ' (current) ' ;
159
+ /** @var \Composer\Package\CompletePackage $package */
160
+ foreach ($ locker ->getLockedRepository ()->getPackages () as $ package ) {
161
+ $ packageName = $ package ->getName ();
162
+ if ($ this ->composerInfo ->isSystemPackage ($ packageName )) {
163
+ if ($ packageName == 'magento/product-community-edition ' ) {
164
+ if ($ this ->composerInfo ->isPackageInComposerJson ($ packageName )) {
165
+ $ systemPackages [] = $ packageName ;
166
+ }
167
+ } else {
168
+ $ systemPackages [] = $ packageName ;
169
+ }
170
+ }
95
171
}
172
+ return $ systemPackages ;
173
+ }
96
174
97
- $ result = [
98
- 'package ' => $ systemPackageInfo ['name ' ],
99
- 'versions ' => $ versions
100
- ];
175
+ /**
176
+ * @param array $enterpriseVersions
177
+ * @return array
178
+ */
179
+ public function sortVersions ($ enterpriseVersions )
180
+ {
181
+ usort ($ enterpriseVersions ['available_versions ' ], function ($ versionOne , $ versionTwo ) {
182
+ if (version_compare ($ versionOne , $ versionTwo , '== ' )) {
183
+ return 0 ;
184
+ }
185
+ return (version_compare ($ versionOne , $ versionTwo , '< ' )) ? 1 : -1 ;
186
+ });
101
187
102
- return $ result ;
188
+ return $ enterpriseVersions ;
189
+ }
190
+
191
+ /**
192
+ * @param string $currentCE
193
+ * @param array $enterpriseVersions
194
+ * @param string $maxVersion
195
+ * @return array
196
+ */
197
+ public function filterEeVersions ($ currentCE , $ enterpriseVersions , $ maxVersion )
198
+ {
199
+ $ eeVersions = [];
200
+ foreach ($ enterpriseVersions ['available_versions ' ] as $ version ) {
201
+ $ requires = $ this ->composerInfo ->getPackageRequirements ('magento/product-enterprise-edition ' , $ version );
202
+ if (array_key_exists ('magento/product-community-edition ' , $ requires )) {
203
+ /** @var \Composer\Package\Link $ceRequire */
204
+ $ ceRequire = $ requires ['magento/product-community-edition ' ];
205
+ if (version_compare (
206
+ $ ceRequire ->getConstraint ()->getPrettyString (),
207
+ $ currentCE ,
208
+ '>= '
209
+ )) {
210
+ $ name = 'Version ' . $ version . ' EE ' ;
211
+ if ($ maxVersion == $ version ) {
212
+ $ name .= ' (latest) ' ;
213
+ }
214
+ $ eeVersions [] = ['id ' => $ version , 'name ' => $ name ];
215
+ }
216
+ }
217
+ }
218
+ return $ eeVersions ;
103
219
}
104
220
}
0 commit comments