5
5
*/
6
6
namespace Magento \Test \Integrity ;
7
7
8
+ use Composer \Semver \VersionParser ;
8
9
use Magento \Framework \App \Bootstrap ;
9
10
use Magento \Framework \Component \ComponentRegistrar ;
10
11
use Magento \Framework \Composer \MagentoComponent ;
@@ -293,6 +294,23 @@ private function assertRequireInSync(\StdClass $json)
293
294
if (!isset (self ::$ rootJson ['require-dev ' ][$ depName ]) && !isset (self ::$ rootJson ['require ' ][$ depName ])
294
295
&& !isset (self ::$ rootJson ['replace ' ][$ depName ])) {
295
296
$ errors [] = "' $ name' depends on ' $ depName' " ;
297
+ } else {
298
+ if (isset (self ::$ rootJson ['require-dev ' ][$ depName ])
299
+ && $ this ->checkDiscrepancy ($ json , $ depName , 'require-dev ' )) {
300
+ $ errors [] = "root composer.json has dependency ' "
301
+ . $ depName . ": " . self ::$ rootJson ['require-dev ' ][$ depName ] . " BUT "
302
+ . "' $ name' composer.json has dependency ' $ depName: {$ json ->require ->$ depName }' " ;
303
+ } elseif (isset (self ::$ rootJson ['require ' ][$ depName ])
304
+ && $ this ->checkDiscrepancy ($ json , $ depName , 'require ' )) {
305
+ $ errors [] = "root composer.json has dependency ' "
306
+ . $ depName . ": " . self ::$ rootJson ['require ' ][$ depName ] . " BUT "
307
+ . "' $ name' composer.json has dependency ' $ depName: {$ json ->require ->$ depName }' " ;
308
+ } elseif (isset (self ::$ rootJson ['replace ' ][$ depName ])
309
+ && $ this ->checkDiscrepancy ($ json , $ depName , 'replace ' )) {
310
+ $ errors [] = "root composer.json has dependency ' "
311
+ . $ depName . ": " . self ::$ rootJson ['replace ' ][$ depName ] . " BUT "
312
+ . "' $ name' composer.json has dependency ' $ depName: {$ json ->require ->$ depName }' " ;
313
+ }
296
314
}
297
315
}
298
316
if (!empty ($ errors )) {
@@ -308,6 +326,20 @@ private function assertRequireInSync(\StdClass $json)
308
326
}
309
327
}
310
328
329
+ /**
330
+ * @param $componentConfig
331
+ * @param $packageName
332
+ * @param $section
333
+ * @return bool
334
+ */
335
+ private function checkDiscrepancy ($ componentConfig , $ packageName , $ section )
336
+ {
337
+ $ rootConstraint = (new VersionParser ())->parseConstraints (self ::$ rootJson [$ section ][$ packageName ]);
338
+ $ componentConstraint = (new VersionParser ())->parseConstraints ($ componentConfig ->require ->$ packageName );
339
+
340
+ return !$ rootConstraint ->matches ($ componentConstraint );
341
+ }
342
+
311
343
/**
312
344
* Convert a fully qualified module name to a composer package name according to conventions
313
345
*
0 commit comments