Add provides and conflicts from parent lockfile to prevent installing the same package twice

master v1.2.0
Lars Vierbergen 7 years ago
parent 075b1ea0f9
commit 10f0ed2d7e
  1. 40
      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);
}
}