/** * Merge extra config into a RootPackage * * @param RootPackage $root * @param PluginState $state */ public function mergeExtra(RootPackage $root, PluginState $state) { $extra = $this->package->getExtra(); unset($extra['merge-plugin']); if (!$state->shouldMergeExtra() || empty($extra)) { return; } $rootExtra = $root->getExtra(); if ($state->replaceDuplicateLinks()) { $root->setExtra(array_merge($rootExtra, $extra)); } else { foreach ($extra as $key => $value) { if (isset($rootExtra[$key])) { $this->logger->debug("Ignoring duplicate <comment>{$key}</comment> in " . "<comment>{$this->path}</comment> extra config."); } } $root->setExtra(array_merge($extra, $rootExtra)); } }
/** * Read a JSON file and merge its contents * * @param RootPackageInterface $root * @param string $path */ protected function mergeFile(RootPackageInterface $root, $path) { if (isset($this->loadedFiles[$path])) { $this->logger->debug("Already merged <comment>{$path}</comment>"); return; } else { $this->loadedFiles[$path] = true; } $this->logger->info("Loading <comment>{$path}</comment>..."); $package = new ExtraPackage($path, $this->composer, $this->logger); $package->mergeInto($root, $this->state); if ($this->state->recurseIncludes()) { $this->mergeFiles($package->getIncludes(), false); $this->mergeFiles($package->getRequires(), true); } }
/** * Handle an event callback following an install or update command. If our * plugin was installed during the run then trigger an update command to * process any merge-patterns in the current config. * * @param Event $event */ public function onPostInstallOrUpdate(Event $event) { // @codeCoverageIgnoreStart if ($this->state->isFirstInstall()) { $this->state->setFirstInstall(false); $this->logger->debug('<comment>' . 'Running additional update to apply merge settings' . '</comment>'); $config = $this->composer->getConfig(); $preferSource = $config->get('preferred-install') == 'source'; $preferDist = $config->get('preferred-install') == 'dist'; $installer = Installer::create($event->getIO(), Factory::create($event->getIO(), null, false)); $installer->setPreferSource($preferSource); $installer->setPreferDist($preferDist); $installer->setDevMode($event->isDevMode()); $installer->setDumpAutoloader($this->state->shouldDumpAutoloader()); $installer->setOptimizeAutoloader($this->state->shouldOptimizeAutoloader()); if ($this->state->forceUpdate()) { // Force update mode so that new packages are processed rather // than just telling the user that composer.json and // composer.lock don't match. $installer->setUpdate(true); } $installer->run(); } // @codeCoverageIgnoreEnd }