From 20eb9e66cf4b156a8459484e9cc2aa579fcf9052 Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Tue, 15 Oct 2019 08:25:00 +0200 Subject: [PATCH 1/3] Consider replaces when checking package dependents --- src/Composer/Repository/BaseRepository.php | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index 2b30b63cd..295b2b919 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -67,6 +67,24 @@ abstract class BaseRepository implements RepositoryInterface // Replacements are considered valid reasons for a package to be installed during forward resolution if (!$invert) { $links += $package->getReplaces(); + + foreach ($package->getReplaces() as $link) { + foreach ($needles as $needle) { + if ($link->getSource() === $needle) { + if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { + // already displayed this node's dependencies, cutting short + if (in_array($link->getTarget(), $packagesInTree)) { + $results[$link->getTarget()] = array($package, $link, false); + continue; + } + $packagesInTree[] = $link->getTarget(); + $dependents = $recurse ? $this->getDependents($link->getTarget(), null, false, true, $packagesInTree) : array(); + $results[] = array($package, $link, $dependents); + $needles[] = $link->getTarget(); + } + } + } + } } // Require-dev is only relevant for the root package @@ -81,12 +99,12 @@ abstract class BaseRepository implements RepositoryInterface if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { // already displayed this node's dependencies, cutting short if (in_array($link->getSource(), $packagesInTree)) { - $results[$link->getSource()] = array($package, $link, false); + $results[] = array($package, $link, false); continue; } $packagesInTree[] = $link->getSource(); $dependents = $recurse ? $this->getDependents($link->getSource(), null, false, true, $packagesInTree) : array(); - $results[$link->getSource()] = array($package, $link, $dependents); + $results[] = array($package, $link, $dependents); } } } From 80317eb289fd6993e57af981d7922cd99563146f Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Tue, 15 Oct 2019 10:56:43 +0200 Subject: [PATCH 2/3] Remove invalid array keys --- src/Composer/Repository/BaseRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index 295b2b919..5ee866543 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -74,7 +74,7 @@ abstract class BaseRepository implements RepositoryInterface if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { // already displayed this node's dependencies, cutting short if (in_array($link->getTarget(), $packagesInTree)) { - $results[$link->getTarget()] = array($package, $link, false); + $results[] = array($package, $link, false); continue; } $packagesInTree[] = $link->getTarget(); From 5f202efa0bcf8f51f13ab073a09b42ebfb6c8f26 Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Wed, 16 Oct 2019 13:36:28 +0200 Subject: [PATCH 3/3] Added comment why source link check is necessary --- src/Composer/Repository/BaseRepository.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Composer/Repository/BaseRepository.php b/src/Composer/Repository/BaseRepository.php index 5ee866543..d668f43cb 100644 --- a/src/Composer/Repository/BaseRepository.php +++ b/src/Composer/Repository/BaseRepository.php @@ -68,6 +68,9 @@ abstract class BaseRepository implements RepositoryInterface if (!$invert) { $links += $package->getReplaces(); + // On forward search, check if any replaced package was required and add the replaced + // packages to the list of needles. Contrary to the cross-reference link check below, + // replaced packages are the target of links. foreach ($package->getReplaces() as $link) { foreach ($needles as $needle) { if ($link->getSource() === $needle) {