From 10f0ed2d7e4a6b41356fbc768412f35367a28876 Mon Sep 17 00:00:00 2001 From: Lars Vierbergen Date: Wed, 30 Aug 2017 14:01:23 +0200 Subject: [PATCH] Add provides and conflicts from parent lockfile to prevent installing the same package twice --- src/AuthserverInstallerPlugin.php | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/AuthserverInstallerPlugin.php b/src/AuthserverInstallerPlugin.php index afb1184..4ffb283 100644 --- a/src/AuthserverInstallerPlugin.php +++ b/src/AuthserverInstallerPlugin.php @@ -23,12 +23,52 @@ namespace vierbergenlars\Authserver\Composer; use Composer\Composer; use Composer\IO\IOInterface; +use Composer\Package\Link; +use Composer\Package\Loader\ArrayLoader; use Composer\Plugin\PluginInterface; +use Composer\Semver\Constraint\Constraint; +use Composer\Semver\Constraint\MultiConstraint; class AuthserverInstallerPlugin implements PluginInterface { public function activate(Composer $composer, IOInterface $io) { $composer->getInstallationManager()->addInstaller(new AuthserverInstaller($io, $composer)); + $this->overrideReplacesAndConflicts($composer); + } + + private function overrideReplacesAndConflicts(Composer $composer) + { + $rootPackage = $composer->getPackage(); + $extra = $rootPackage->getExtra(); + $loader = new ArrayLoader(); + $replaces = $rootPackage->getReplaces(); + $conflicts = $rootPackage->getConflicts(); + + if(isset($extra['parent-lock-file'])) { + $lockfile = json_decode(file_get_contents($extra['parent-lock-file']), true); + foreach($lockfile['packages'] as $packageJson) { + $package = $loader->load($packageJson); + $constraint = new Constraint('=', $package->getVersion()); + $replaces[$package->getName()] = new Link('__root_', $package->getName(), $constraint, 'replaces', $constraint->getPrettyString()); + foreach($package->getProvides() as $provide) + $replaces[$provide->getTarget()] = $provide; + foreach($package->getReplaces() as $replace) + $replaces[$replace->getTarget()] = $replace; + foreach($package->getConflicts() as $conflict) { + if(isset($conflicts[$conflict->getTarget()])) { + $constraint = new MultiConstraint([ + $conflicts[$conflict->getTarget()]->getConstraint(), + $conflict->getConstraint(), + ], false); + $conflict = new Link('__root__', $conflict->getTarget(), $constraint, 'conflicts', $constraint->getPrettyString()); + } + $conflicts[$conflict->getTarget()] = $conflict; + } + } + } + + $rootPackage->setReplaces($replaces); + $rootPackage->setConflicts($conflicts); } }