@@ -28,6 +28,9 @@ class RuleSetGenerator
28
28
protected $ installedMap ;
29
29
protected $ whitelistedMap ;
30
30
protected $ addedMap ;
31
+ protected $ conflictAddedMap ;
32
+ protected $ addedPackages ;
33
+ protected $ addedPackagesByNames ;
31
34
32
35
public function __construct (PolicyInterface $ policy , Pool $ pool )
33
36
{
@@ -185,13 +188,19 @@ protected function addRulesForPackage(PackageInterface $package, $ignorePlatform
185
188
$ workQueue ->enqueue ($ package );
186
189
187
190
while (!$ workQueue ->isEmpty ()) {
191
+ /** @var PackageInterface $package */
188
192
$ package = $ workQueue ->dequeue ();
189
193
if (isset ($ this ->addedMap [$ package ->id ])) {
190
194
continue ;
191
195
}
192
196
193
197
$ this ->addedMap [$ package ->id ] = true ;
194
198
199
+ $ this ->addedPackages [] = $ package ;
200
+ foreach ($ package ->getNames () as $ name ) {
201
+ $ this ->addedPackagesByNames [$ name ][] = $ package ;
202
+ }
203
+
195
204
foreach ($ package ->getRequires () as $ link ) {
196
205
if ($ ignorePlatformReqs && preg_match (PlatformRepository::PLATFORM_PACKAGE_REGEX , $ link ->getTarget ())) {
197
206
continue ;
@@ -206,21 +215,54 @@ protected function addRulesForPackage(PackageInterface $package, $ignorePlatform
206
215
}
207
216
}
208
217
218
+ $ packageName = $ package ->getName ();
219
+ $ obsoleteProviders = $ this ->pool ->whatProvides ($ packageName , null );
220
+
221
+ foreach ($ obsoleteProviders as $ provider ) {
222
+ if ($ provider === $ package ) {
223
+ continue ;
224
+ }
225
+
226
+ if (($ package instanceof AliasPackage) && $ package ->getAliasOf () === $ provider ) {
227
+ $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRequireRule ($ package , array ($ provider ), Rule::RULE_PACKAGE_ALIAS , $ package ));
228
+ } elseif (!$ this ->obsoleteImpossibleForAlias ($ package , $ provider )) {
229
+ $ reason = ($ packageName == $ provider ->getName ()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES ;
230
+ $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRule2Literals ($ package , $ provider , $ reason , $ package ));
231
+ }
232
+ }
233
+ }
234
+ }
235
+
236
+ protected function addConflictRules ()
237
+ {
238
+ /** @var PackageInterface $package */
239
+ foreach ($ this ->addedPackages as $ package ) {
209
240
foreach ($ package ->getConflicts () as $ link ) {
210
- $ possibleConflicts = $ this ->pool ->whatProvides ($ link ->getTarget (), $ link ->getConstraint ());
241
+ if (!isset ($ this ->addedPackagesByNames [$ link ->getTarget ()])) {
242
+ continue ;
243
+ }
244
+
245
+ /** @var PackageInterface $possibleConflict */
246
+ foreach ($ this ->addedPackagesByNames [$ link ->getTarget ()] as $ possibleConflict ) {
247
+ $ conflictMatch = $ this ->pool ->match ($ possibleConflict , $ link ->getTarget (), $ link ->getConstraint (), true );
248
+
249
+ if ($ conflictMatch === Pool::MATCH || $ conflictMatch === Pool::MATCH_REPLACE ) {
250
+ $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRule2Literals ($ package , $ possibleConflict , Rule::RULE_PACKAGE_CONFLICT , $ link ));
251
+ }
211
252
212
- foreach ($ possibleConflicts as $ conflict ) {
213
- $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRule2Literals ($ package , $ conflict , Rule::RULE_PACKAGE_CONFLICT , $ link ));
214
253
}
215
254
}
216
255
217
256
// check obsoletes and implicit obsoletes of a package
218
257
$ isInstalled = isset ($ this ->installedMap [$ package ->id ]);
219
258
220
259
foreach ($ package ->getReplaces () as $ link ) {
221
- $ obsoleteProviders = $ this ->pool ->whatProvides ($ link ->getTarget (), $ link ->getConstraint ());
260
+ if (!isset ($ this ->addedPackagesByNames [$ link ->getTarget ()])) {
261
+ continue ;
262
+ }
222
263
223
- foreach ($ obsoleteProviders as $ provider ) {
264
+ /** @var PackageInterface $possibleConflict */
265
+ foreach ($ this ->addedPackagesByNames [$ link ->getTarget ()] as $ provider ) {
224
266
if ($ provider === $ package ) {
225
267
continue ;
226
268
}
@@ -231,22 +273,6 @@ protected function addRulesForPackage(PackageInterface $package, $ignorePlatform
231
273
}
232
274
}
233
275
}
234
-
235
- $ packageName = $ package ->getName ();
236
- $ obsoleteProviders = $ this ->pool ->whatProvides ($ packageName , null );
237
-
238
- foreach ($ obsoleteProviders as $ provider ) {
239
- if ($ provider === $ package ) {
240
- continue ;
241
- }
242
-
243
- if (($ package instanceof AliasPackage) && $ package ->getAliasOf () === $ provider ) {
244
- $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRequireRule ($ package , array ($ provider ), Rule::RULE_PACKAGE_ALIAS , $ package ));
245
- } elseif (!$ this ->obsoleteImpossibleForAlias ($ package , $ provider )) {
246
- $ reason = ($ packageName == $ provider ->getName ()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES ;
247
- $ this ->addRule (RuleSet::TYPE_PACKAGE , $ this ->createRule2Literals ($ package , $ provider , $ reason , $ package ));
248
- }
249
- }
250
276
}
251
277
}
252
278
@@ -327,12 +353,20 @@ public function getRulesFor($jobs, $installedMap, $ignorePlatformReqs = false)
327
353
$ this ->pool ->setWhitelist ($ this ->whitelistedMap );
328
354
329
355
$ this ->addedMap = array ();
356
+ $ this ->conflictAddedMap = array ();
357
+ $ this ->addedPackages = array ();
358
+ $ this ->addedPackagesByNames = array ();
330
359
foreach ($ this ->installedMap as $ package ) {
331
360
$ this ->addRulesForPackage ($ package , $ ignorePlatformReqs );
332
361
}
333
362
334
363
$ this ->addRulesForJobs ($ ignorePlatformReqs );
335
364
365
+ $ this ->addConflictRules ();
366
+
367
+ // Remove references to packages
368
+ $ this ->addedPackages = $ this ->addedPackagesByNames = null ;
369
+
336
370
return $ this ->rules ;
337
371
}
338
372
}
0 commit comments