/** * {@inheritdoc} */ public function handle(\Input $input) { if ($input->post('FORM_SUBMIT') == 'tl_composer_migrate_undo') { /** @var RootPackage $rootPackage */ $rootPackage = $this->composer->getPackage(); $requires = $rootPackage->getRequires(); foreach (array_keys($requires) as $package) { if ($package != 'contao-community-alliance/composer') { unset($requires[$package]); } } $rootPackage->setRequires($requires); $lockPathname = preg_replace('#\\.json$#', '.lock', $this->configPathname); /** @var DownloadManager $downloadManager */ $downloadManager = $this->composer->getDownloadManager(); $downloadManager->setOutputProgress(false); $installer = Installer::create($this->io, $this->composer); if (file_exists(TL_ROOT . '/' . $lockPathname)) { $installer->setUpdate(true); } if ($installer->run()) { $_SESSION['COMPOSER_OUTPUT'] .= $this->io->getOutput(); } else { $_SESSION['COMPOSER_OUTPUT'] .= $this->io->getOutput(); $this->redirect('contao/main.php?do=composer&migrate=undo'); } // load config $json = new JsonFile(TL_ROOT . '/' . $this->configPathname); $config = $json->read(); // remove migration status unset($config['extra']['contao']['migrated']); // write config $json->write($config); // disable composer client and enable repository client $inactiveModules = deserialize($GLOBALS['TL_CONFIG']['inactiveModules']); $inactiveModules[] = '!composer'; foreach (array('rep_base', 'rep_client', 'repository') as $module) { $pos = array_search($module, $inactiveModules); if ($pos !== false) { unset($inactiveModules[$pos]); } } if (version_compare(VERSION, '3', '>=')) { $skipFile = new \File('system/modules/!composer/.skip'); $skipFile->write('Remove this file to enable the module'); $skipFile->close(); } if (file_exists(TL_ROOT . '/system/modules/repository/.skip')) { $skipFile = new \File('system/modules/repository/.skip'); $skipFile->delete(); } $this->Config->update("\$GLOBALS['TL_CONFIG']['inactiveModules']", serialize($inactiveModules)); $this->redirect('contao/main.php?do=repository_manager'); } $template = new \BackendTemplate('be_composer_client_migrate_undo'); $template->composer = $this->composer; $template->output = $_SESSION['COMPOSER_OUTPUT']; unset($_SESSION['COMPOSER_OUTPUT']); return $template->parse(); }
/** * Executes composer for the extension. */ public function execute(InputInterface $input, OutputInterface $output) { $name = $this->argument('extension'); $update = $this->option('update'); if (!is_dir($path = $this->pagekit['path.extensions'] . "/{$name}") && file_exists("{$path}/extension.json")) { $this->error("Extension not exists '{$path}'"); exit; } $package = json_decode(file_get_contents("{$path}/extension.json"), true); if (!isset($package['composer']) || empty($package['composer'])) { $this->error("Composer not defined in '{$path}/extension.json'"); exit; } $this->loadComposer($path); $io = new ConsoleIO($input, $output, $this->getHelperSet()); $composer = Factory::create($io, $package['composer']); $lockFile = new JsonFile("{$path}/extension.lock"); $locker = new Locker($io, $lockFile, $composer->getRepositoryManager(), $composer->getInstallationManager(), md5(json_encode($package['composer']))); $composer->setLocker($locker); $installed = new JsonFile($this->pagekit['path'] . '/vendor/composer/installed.json'); $internal = new CompositeRepository([]); $internal->addRepository(new InstalledFilesystemRepository($installed)); $installer = Installer::create($io, $composer); $installer->setAdditionalInstalledRepository($internal); $installer->setUpdate($update); return $installer->run(); }
protected function execute(InputInterface $input, OutputInterface $output) { $factory = new Factory(); $file = $factory->getComposerFile(); if (!file_exists($file)) { $output->writeln('<error>' . $file . ' not found.</error>'); return 1; } if (!is_readable($file)) { $output->writeln('<error>' . $file . ' is not readable.</error>'); return 1; } $dialog = $this->getHelperSet()->get('dialog'); $json = new JsonFile($file); $composer = $json->read(); $requirements = $this->determineRequirements($input, $output, $input->getArgument('packages')); $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $baseRequirements = array_key_exists($requireKey, $composer) ? $composer[$requireKey] : array(); $requirements = $this->formatRequirements($requirements); if (!$this->updateFileCleanly($json, $baseRequirements, $requirements, $requireKey)) { foreach ($requirements as $package => $version) { $baseRequirements[$package] = $version; } $composer[$requireKey] = $baseRequirements; $json->write($composer); } $output->writeln('<info>' . $file . ' has been updated</info>'); // Update packages $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); $install->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setDevMode($input->getOption('dev'))->setUpdate(true)->setUpdateWhitelist($requirements); return $install->run() ? 0 : 1; }
protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $io = $this->getIO(); $install = Installer::create($io, $composer); $preferSource = false; $preferDist = false; switch ($composer->getConfig()->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: // noop break; } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist')) { $preferSource = $input->getOption('prefer-source'); $preferDist = $input->getOption('prefer-dist'); } $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode($input->getOption('dev'))->setRunScripts(!$input->getOption('no-scripts'))->setOptimizeAutoloader($input->getOption('optimize-autoloader')); if ($input->getOption('no-custom-installers')) { $install->disableCustomInstallers(); } return $install->run() ? 0 : 1; }
protected function execute(InputInterface $input, OutputInterface $output) { if ($input->getOption('no-custom-installers')) { $output->writeln('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $io = $this->getIO(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $preferSource = false; $preferDist = false; switch ($composer->getConfig()->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: break; } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist')) { $preferSource = $input->getOption('prefer-source'); $preferDist = $input->getOption('prefer-dist'); } $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setRunScripts(!$input->getOption('no-scripts'))->setOptimizeAutoloader($input->getOption('optimize-autoloader')); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); }
protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); if ($args = $input->getArgument('packages')) { $io->writeError('<error>Invalid argument ' . implode(' ', $args) . '. Use "composer require ' . implode(' ', $args) . '" instead to add packages to your composer.json.</error>'); return 1; } if ($input->getOption('no-custom-installers')) { $io->writeError('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } if ($input->getOption('dev')) { $io->writeError('<warning>You are using the deprecated option "dev". Dev packages are installed by default now.</warning>'); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $config = $composer->getConfig(); list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setDumpAutoloader(!$input->getOption('no-autoloader'))->setRunScripts(!$input->getOption('no-scripts'))->setSkipSuggest($input->getOption('no-suggest'))->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); }
/** * Remove packages from the root install. * * @param $packages array Indexed array of package names to remove * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute(array $packages) { if (empty($packages)) { throw new PackageManagerException('No package specified for removal'); } $io = $this->app['extend.manager']->getIO(); $options = $this->app['extend.manager']->getOptions(); $jsonFile = new JsonFile($options['composerjson']); $composerDefinition = $jsonFile->read(); $composerBackup = file_get_contents($jsonFile->getPath()); $json = new JsonConfigSource($jsonFile); $type = $options['dev'] ? 'require-dev' : 'require'; // Remove packages from JSON foreach ($packages as $package) { if (isset($composerDefinition[$type][$package])) { $json->removeLink($type, $package); } } // Reload Composer config $composer = $this->app['extend.manager']->getFactory()->resetComposer(); $install = Installer::create($io, $composer); try { $install->setVerbose($options['verbose'])->setDevMode(!$options['updatenodev'])->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies($options['updatewithdependencies'])->setIgnorePlatformRequirements($options['ignoreplatformreqs']); $status = $install->run(); if ($status !== 0) { // Write out old JSON file file_put_contents($jsonFile->getPath(), $composerBackup); } } catch (\Exception $e) { $msg = __CLASS__ . '::' . __FUNCTION__ . ' recieved an error from Composer: ' . $e->getMessage() . ' in ' . $e->getFile() . '::' . $e->getLine(); $this->app['logger.system']->critical($msg, array('event' => 'exception', 'exception' => $e)); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } return $status; }
protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $io = $this->getApplication()->getIO(); $install = Installer::create($io, $composer); return $install->run((bool) $input->getOption('prefer-source'), (bool) $input->getOption('dry-run'), (bool) $input->getOption('verbose'), (bool) $input->getOption('no-install-recommends'), (bool) $input->getOption('install-suggests')); }
/** * Update packages. * * @param $packages array Indexed array of package names to update * @param $options array [Optional] changed option set * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute(array $packages = [], array $options = []) { /** @var $composer \Composer\Composer */ $composer = $this->getComposer(); $io = $this->getIO(); $packageManagerOptions = $this->app['extend.action.options']; // Handle passed in options if (!empty($options)) { $options = Arr::mergeRecursiveDistinct($packageManagerOptions, $options); } else { $options = $packageManagerOptions; } $install = Installer::create($io, $composer); $config = $composer->getConfig(); $optimize = $config->get('optimize-autoloader'); // Set preferred install method $prefer = $this->getPreferedTarget($config->get('preferred-install')); try { $install->setDryRun($options['dryrun'])->setVerbose($options['verbose'])->setPreferSource($prefer['source'])->setPreferDist($prefer['dist'])->setDevMode(!$options['nodev'])->setDumpAutoloader(!$options['noautoloader'])->setRunScripts(!$options['noscripts'])->setOptimizeAutoloader($optimize)->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies($options['withdependencies'])->setIgnorePlatformRequirements($options['ignoreplatformreqs'])->setPreferStable($options['preferstable'])->setPreferLowest($options['preferlowest'])->disablePlugins(); return $install->run(); } catch (\Exception $e) { $msg = __CLASS__ . '::' . __FUNCTION__ . ' recieved an error from Composer: ' . $e->getMessage() . ' in ' . $e->getFile() . '::' . $e->getLine(); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setDevMode($input->getOption('dev'))->setRunScripts(!$input->getOption('no-scripts')); return $install->run() ? 0 : 1; }
/** * {@inheritdoc} */ public function execute(InputInterface $input, OutputInterface $output) { $io = new ConsoleIO($input, $output, $this->getHelperSet()); $factory = new ComposerFactory($io); $composer = $factory->createComposer(); $installer = Installer::create($io, $composer); $installer->run(); }
protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); if ($input->getOption('no-custom-installers')) { $io->writeError('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } if ($input->getOption('dev')) { $io->writeError('<warning>You are using the deprecated option "dev". Dev packages are installed by default now.</warning>'); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $packages = $input->getArgument('packages'); if ($input->getOption('interactive')) { $packages = $this->getPackagesInteractively($io, $input, $output, $composer, $packages); } if ($input->getOption('root-reqs')) { $require = array_keys($composer->getPackage()->getRequires()); if (!$input->getOption('no-dev')) { $requireDev = array_keys($composer->getPackage()->getDevRequires()); $require = array_merge($require, $requireDev); } if (!empty($packages)) { $packages = array_intersect($packages, $require); } else { $packages = $require; } } $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'update', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $preferSource = false; $preferDist = false; $config = $composer->getConfig(); switch ($config->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: // noop break; } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist')) { $preferSource = $input->getOption('prefer-source'); $preferDist = $input->getOption('prefer-dist'); } $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setDumpAutoloader(!$input->getOption('no-autoloader'))->setRunScripts(!$input->getOption('no-scripts'))->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setUpdate(true)->setUpdateWhitelist($input->getOption('lock') ? array('lock') : $packages)->setWhitelistDependencies($input->getOption('with-dependencies'))->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs'))->setPreferStable($input->getOption('prefer-stable'))->setPreferLowest($input->getOption('prefer-lowest')); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); }
protected function execute(InputInterface $input, OutputInterface $output) { $packages = $input->getArgument('packages'); $file = Factory::getComposerFile(); $jsonFile = new JsonFile($file); $composer = $jsonFile->read(); $composerBackup = file_get_contents($jsonFile->getPath()); $json = new JsonConfigSource($jsonFile); $type = $input->getOption('dev') ? 'require-dev' : 'require'; $altType = !$input->getOption('dev') ? 'require-dev' : 'require'; $io = $this->getIO(); if ($input->getOption('update-with-dependencies')) { $io->writeError('<warning>You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies.</warning>'); } foreach ($packages as $package) { if (isset($composer[$type][$package])) { $json->removeLink($type, $package); } elseif (isset($composer[$altType][$package])) { $io->writeError('<warning>' . $package . ' could not be found in ' . $type . ' but it is present in ' . $altType . '</warning>'); if ($io->isInteractive()) { if ($io->askConfirmation('Do you want to remove it from ' . $altType . ' [<comment>yes</comment>]? ', true)) { $json->removeLink($altType, $package); } } } else { $io->writeError('<warning>' . $package . ' is not required in your composer.json and has not been removed</warning>'); } } if ($input->getOption('no-update')) { return 0; } // Update packages $this->resetComposer(); $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'remove', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); $install->setVerbose($input->getOption('verbose'))->setDevMode($updateDevMode)->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies(!$input->getOption('no-update-with-dependencies'))->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')); $exception = null; try { $status = $install->run(); } catch (\Exception $exception) { $status = 1; } if ($status !== 0) { $io->writeError("\n" . '<error>Removal failed, reverting ' . $file . ' to its original content.</error>'); file_put_contents($jsonFile->getPath(), $composerBackup); } if ($exception) { throw $exception; } return $status; }
protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setDevMode($input->getOption('dev'))->setRunScripts(!$input->getOption('no-scripts'))->setUpdate(true)->setUpdateWhitelist($input->getArgument('packages')); if ($input->getOption('no-custom-installers')) { $install->disableCustomInstallers(); } return $install->run() ? 0 : 1; }
protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setPreferDist($input->getOption('prefer-dist'))->setDevMode($input->getOption('dev'))->setRunScripts(!$input->getOption('no-scripts'))->setOptimizeAutoloader($input->getOption('optimize-autoloader')); if ($input->getOption('no-custom-installers')) { $install->disableCustomInstallers(); } return $install->run() ? 0 : 1; }
protected function execute(InputInterface $input, OutputInterface $output) { $file = Factory::getComposerFile(); if (!file_exists($file) && !file_put_contents($file, "{\n}\n")) { $output->writeln('<error>' . $file . ' could not be created.</error>'); return 1; } if (!is_readable($file)) { $output->writeln('<error>' . $file . ' is not readable.</error>'); return 1; } if (!is_writable($file)) { $output->writeln('<error>' . $file . ' is not writable.</error>'); return 1; } $json = new JsonFile($file); $composer = $json->read(); $composerBackup = file_get_contents($json->getPath()); $requirements = $this->determineRequirements($input, $output, $input->getArgument('packages')); $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $baseRequirements = array_key_exists($requireKey, $composer) ? $composer[$requireKey] : array(); $requirements = $this->formatRequirements($requirements); // validate requirements format $versionParser = new VersionParser(); foreach ($requirements as $constraint) { $versionParser->parseConstraints($constraint); } if (!$this->updateFileCleanly($json, $baseRequirements, $requirements, $requireKey)) { foreach ($requirements as $package => $version) { $baseRequirements[$package] = $version; } $composer[$requireKey] = $baseRequirements; $json->write($composer); } $output->writeln('<info>' . $file . ' has been updated</info>'); if ($input->getOption('no-update')) { return 0; } // Update packages $composer = $this->getComposer(); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $io = $this->getIO(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'require', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $install->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setPreferDist($input->getOption('prefer-dist'))->setDevMode(true)->setUpdate(true)->setUpdateWhitelist(array_keys($requirements)); $status = $install->run(); if ($status !== 0) { $output->writeln("\n" . '<error>Installation failed, reverting ' . $file . ' to its original content.</error>'); file_put_contents($json->getPath(), $composerBackup); } return $status; }
/** * Require (install) a package. * * @param array $package Package names and version to require * - Format: ['name' => '', 'version' => ''] * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute(array $package) { $this->getComposer(); $io = $this->getIO(); /** @var \Bolt\Filesystem\Handler\JsonFile $jsonFile */ $jsonFile = $this->getOptions()->composerJson(); $newlyCreated = !$jsonFile->exists(); if ($newlyCreated) { $this->app['extend.manager.json']->update(); } // Format the package array $package = $this->formatRequirements($package); // Validate requirements format $versionParser = new VersionParser(); foreach ($package as $constraint) { $versionParser->parseConstraints($constraint); } // Get a back up of the file contents $composerBackup = $jsonFile->parse(); // Update our JSON file now with a specific version. // This is what Composer will read, and use, internally during the process. // After that is complete, we'll re-save with a constraint $this->updateComposerJson($jsonFile, $package, false); // JSON file has been created/updated, if we're not installing, exit if ($this->getOptions()->noUpdate()) { return 0; } // Reload Composer config $composer = $this->resetComposer(); /** @var $install \Composer\Installer */ $install = Installer::create($io, $composer)->setVerbose($this->getOptions()->verbose())->setPreferSource($this->getOptions()->preferSource())->setPreferDist($this->getOptions()->preferDist())->setDevMode(!$this->getOptions()->updateNoDev())->setOptimizeAutoloader($this->getOptions()->optimizeAutoloader())->setClassMapAuthoritative($this->getOptions()->classmapAuthoritative())->setUpdate($this->getOptions()->update())->setUpdateWhitelist(array_keys($package))->setWhitelistDependencies($this->getOptions()->updateWithDependencies())->setIgnorePlatformRequirements($this->getOptions()->ignorePlatformReqs())->setRunScripts(!$this->getOptions()->noScripts()); try { $status = $install->run(); if ($status !== 0) { if ($newlyCreated) { // Installation failed, deleting JSON $jsonFile->delete(); } else { // Installation failed, reverting JSON to its original content $jsonFile->dump($composerBackup); } } // Update our JSON file now with a constraint $this->updateComposerJson($jsonFile, $package, true); return $status; } catch (\Exception $e) { // Installation failed, reverting JSON to its original content $jsonFile->dump($composerBackup); $msg = sprintf('%s recieved an error from Composer: %s in %s::%s', __METHOD__, $e->getMessage(), $e->getFile(), $e->getLine()); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
public function perform($configs) { if (is_file(".ethna")) { return; } $config = array_merge(array("project" => "example", "renderer" => "smarty"), $configs); $config = $this->processParams($config, $config); $targets = array("app/action/Index.php", "app/view/Index.php", "app/Example_ActionClass.php", "app/Example_ActionForm.php", "app/Example_Controller.php", "app/Example_Error.php", "app/Example_ViewClass.php", "etc/example-ini.php", "skel/skel.action.php", "skel/skel.action_cli.php", "skel/skel.app_object.php", "skel/skel.entry_cli.php", "skel/skel.entry_www.php", "skel/skel.template.tpl", "skel/skel.view.php", "www/index.php"); $project_class = self::camerize($config['project']); if ($config['renderer'] == 'twig') { if (file_exists("app/Example_Controller.php")) { $data = file_get_contents("app/Example_Controller.php"); $data = preg_replace("/Ethna_Renderer_Smarty/", "Ethna_Renderer_Twig", $data); file_put_contents("app/Example_Controller.php", $data); } } foreach ($targets as $target) { if (file_exists($target)) { $data = file_get_contents($target); $data = preg_replace("/Example/", $project_class, $data); $data = preg_replace("/EXAMPLE/", strtoupper($project_class), $data); file_put_contents($target, $data); $name = basename($target); if (preg_match("/Example/", $name)) { $name = preg_replace("/Example/", $project_class, $name); $dir = dirname($target); rename($target, $dir . DIRECTORY_SEPARATOR . $name); } else { if (preg_match("/example-ini.php/", $name)) { $dir = dirname($target); $name = preg_replace("/example/", $config['project'], $name); rename($target, $dir . DIRECTORY_SEPARATOR . $name); } } } } file_put_contents(".ethna", sprintf("[project]\ncontroller_file = '%s'\ncontroller_class = '%s'", "app/{$project_class}_Controller.php", "{$project_class}_Controller")); if ($config['renderer'] == 'twig') { $file = Factory::getComposerFile(); $prior_json = $composer_json = json_decode(file_get_contents($file), true); if (!isset($composer_json['require']['twig/twig'])) { $composer_json['require']['twig/twig'] = '1.*'; file_put_contents($file, json_encode($composer_json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); $composer = $this->composer = Factory::create($this->io, null, true); $composer->getDownloadManager()->setOutputProgress(true); $install = Installer::create($this->io, $composer); $install->setVerbose(true)->setPreferSource(true)->setPreferDist(false)->setDevMode(true)->setUpdate(true)->setUpdateWhitelist(array_keys($prior_json['require'])); // とりあえず $status = $install->run(); } } }
/** * Install packages. * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute() { /** @var $composer \Composer\Composer */ $composer = $this->getComposer(); $io = $this->getIO(); $config = $composer->getConfig(); $optimize = $this->getOptions()->optimizeAutoloader() || $config->get('optimize-autoloader'); $authoritative = $this->getOptions()->classmapAuthoritative() || $config->get('classmap-authoritative'); $install = Installer::create($io, $composer)->setDryRun($this->getOptions()->dryRun())->setVerbose($this->getOptions()->verbose())->setPreferSource($this->getOptions()->preferSource())->setPreferDist($this->getOptions()->preferDist())->setDevMode(!$this->getOptions()->noDev())->setDumpAutoloader(!$this->getOptions()->noAutoloader())->setRunScripts(!$this->getOptions()->noScripts())->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setIgnorePlatformRequirements($this->getOptions()->ignorePlatformReqs()); try { return $install->run(); } catch (\Exception $e) { $msg = sprintf('%s recieved an error from Composer: %s in %s::%s', __METHOD__, $e->getMessage(), $e->getFile(), $e->getLine()); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
protected function execute(InputInterface $input, OutputInterface $output) { $packages = $input->getArgument('packages'); $file = Factory::getComposerFile(); $jsonFile = new JsonFile($file); $composer = $jsonFile->read(); $composerBackup = file_get_contents($jsonFile->getPath()); $json = new JsonConfigSource($jsonFile); $type = $input->getOption('dev') ? 'require-dev' : 'require'; $altType = !$input->getOption('dev') ? 'require-dev' : 'require'; foreach ($packages as $package) { if (isset($composer[$type][$package])) { $json->removeLink($type, $package); } elseif (isset($composer[$altType][$package])) { $this->getIO()->writeError('<warning>' . $package . ' could not be found in ' . $type . ' but it is present in ' . $altType . '</warning>'); $dialog = $this->getHelperSet()->get('dialog'); if ($this->getIO()->isInteractive()) { if ($dialog->askConfirmation($output, $dialog->getQuestion('Do you want to remove it from ' . $altType, 'yes', '?'), true)) { $json->removeLink($altType, $package); } } } else { $this->getIO()->writeError('<warning>' . $package . ' is not required in your composer.json and has not been removed</warning>'); } } if ($input->getOption('no-update')) { return 0; } // Update packages $composer = $this->getComposer(); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $io = $this->getIO(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'remove', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $updateDevMode = !$input->getOption('update-no-dev'); $install->setVerbose($input->getOption('verbose'))->setDevMode($updateDevMode)->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies($input->getOption('update-with-dependencies'))->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')); $status = $install->run(); if ($status !== 0) { $this->getIO()->writeError("\n" . '<error>Removal failed, reverting ' . $file . ' to its original content.</error>'); file_put_contents($jsonFile->getPath(), $composerBackup); } return $status; }
/** * Install packages. * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute() { /** @var $composer \Composer\Composer */ $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); $config = $composer->getConfig(); $optimize = $config->get('optimize-autoloader'); // Set preferred install method $prefer = $this->getPreferedTarget($config->get('preferred-install')); try { $install->setDryRun($this->getOption('dryrun'))->setVerbose($this->getOption('verbose'))->setPreferSource($prefer['source'])->setPreferDist($prefer['dist'])->setDevMode(!$this->getOption('nodev'))->setDumpAutoloader(!$this->getOption('noautoloader'))->setRunScripts(!$this->getOption('noscripts'))->setOptimizeAutoloader($optimize)->setIgnorePlatformRequirements($this->getOption('ignoreplatformreqs'))->setUpdate(true); return $install->run(); } catch (\Exception $e) { $msg = __CLASS__ . '::' . __FUNCTION__ . ' recieved an error from Composer: ' . $e->getMessage() . ' in ' . $e->getFile() . '::' . $e->getLine(); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
/** * Update packages. * * @param $packages array Indexed array of package names to update * @param $options array [Optional] changed option set * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute(array $packages = [], array $options = []) { // Handle passed in options foreach ($options as $key => $value) { $this->getOptions()->set($key, $value); } /** @var \Composer\Composer $composer */ $composer = $this->getComposer(); $io = $this->getIO(); $install = Installer::create($io, $composer); try { $install->setDryRun($this->getOptions()->dryRun())->setVerbose($this->getOptions()->verbose())->setPreferSource($this->getOptions()->preferSource())->setPreferDist($this->getOptions()->preferDist())->setDevMode(!$this->getOptions()->noDev())->setDumpAutoloader(!$this->getOptions()->noAutoloader())->setRunScripts(!$this->getOptions()->noScripts())->setOptimizeAutoloader($this->getOptions()->optimizeAutoloader())->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies($this->getOptions()->withDependencies())->setIgnorePlatformRequirements($this->getOptions()->ignorePlatformReqs())->setPreferStable($this->getOptions()->preferStable())->setPreferLowest($this->getOptions()->preferLowest())->setRunScripts(!$this->getOptions()->noScripts()); return $install->run(); } catch (\Exception $e) { $msg = sprintf('%s recieved an error from Composer: %s in %s::%s', __METHOD__, $e->getMessage(), $e->getFile(), $e->getLine()); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
protected function execute(InputInterface $input, OutputInterface $output) { if ($args = $input->getArgument('packages')) { $output->writeln('<error>Invalid argument ' . implode(' ', $args) . '. Use "composer require ' . implode(' ', $args) . '" instead to add packages to your composer.json.</error>'); return 1; } if ($input->getOption('no-custom-installers')) { $output->writeln('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $io = $this->getIO(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $preferSource = false; $preferDist = false; $config = $composer->getConfig(); switch ($config->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: // noop break; } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist')) { $preferSource = $input->getOption('prefer-source'); $preferDist = $input->getOption('prefer-dist'); } $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $install->setDryRun($input->getOption('dry-run'))->setVerbose($input->getOption('verbose'))->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$input->getOption('no-dev'))->setRunScripts(!$input->getOption('no-scripts'))->setOptimizeAutoloader($optimize)->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')); if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); }
/** * Remove packages from the root install. * * @param $packages array Indexed array of package names to remove * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute(array $packages) { if (empty($packages)) { throw new PackageManagerException('No package specified for removal'); } /** @var \Bolt\Filesystem\Handler\JsonFile $jsonFile */ $jsonFile = $this->getOptions()->composerJson(); $composerJson = $composerBackup = $jsonFile->parse(); $type = $this->getOptions()->dev() ? 'require-dev' : 'require'; // Remove packages from JSON foreach ($packages as $package) { unset($composerJson[$type][$package]); } if (empty($composerJson[$type])) { unset($composerJson[$type]); } $jsonFile->dump($composerJson); $io = $this->getIO(); // Reload Composer config $composer = $this->resetComposer(); // Create the installer $install = Installer::create($io, $composer)->setVerbose($this->getOptions()->verbose())->setDevMode(!$this->getOptions()->updateNoDev())->setUpdate(true)->setUpdateWhitelist($packages)->setWhitelistDependencies($this->getOptions()->updateWithDependencies())->setIgnorePlatformRequirements($this->getOptions()->ignorePlatformReqs())->setRunScripts(!$this->getOptions()->noScripts()); try { $status = $install->run(); } catch (\Exception $e) { $msg = sprintf('%s recieved an error from Composer: %s in %s::%s', __METHOD__, $e->getMessage(), $e->getFile(), $e->getLine()); $this->app['logger.system']->critical($msg, ['event' => 'exception', 'exception' => $e]); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } if ($status !== 0) { // Write out old JSON file $jsonFile->dump($composerBackup); } else { $jsonFile->dump($composerJson); } return $status; }
/** * Install packages. * * @throws \Bolt\Exception\PackageManagerException * * @return int 0 on success or a positive error code on failure */ public function execute() { /** @var $composer \Composer\Composer */ $composer = $this->app['extend.manager']->getComposer(); $io = $this->app['extend.manager']->getIO(); $options = $this->app['extend.manager']->getOptions(); $install = Installer::create($io, $composer); $config = $composer->getConfig(); $optimize = $config->get('optimize-autoloader'); $preferSource = false; $preferDist = true; switch ($config->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: // noop break; } if ($config->get('prefer-source') || $config->get('prefer-dist')) { $preferSource = $config->get('prefer-source'); $preferDist = $config->get('prefer-dist'); } try { $install->setDryRun($options['dryrun'])->setVerbose($options['verbose'])->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode(!$options['nodev'])->setDumpAutoloader(!$options['noautoloader'])->setRunScripts(!$options['noscripts'])->setOptimizeAutoloader($optimize)->setIgnorePlatformRequirements($options['ignoreplatformreqs'])->setUpdate(true); return $install->run(); } catch (\Exception $e) { $msg = __CLASS__ . '::' . __FUNCTION__ . ' recieved an error from Composer: ' . $e->getMessage() . ' in ' . $e->getFile() . '::' . $e->getLine(); $this->app['logger.system']->critical($msg, array('event' => 'exception', 'exception' => $e)); throw new PackageManagerException($e->getMessage(), $e->getCode(), $e); } }
/** * @return Installer */ public function getInstaller() { if (defined('PHP_WINDOWS_VERSION_BUILD')) { $this->getComposer()->getDownloadManager()->setOutputProgress(false); } return Installer::create($this->getIO(), $this->getComposer())->setDevMode(false)->setPreferDist(true)->setUpdate(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->info('<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 }
protected function execute(InputInterface $input, OutputInterface $output) { $file = Factory::getComposerFile(); $io = $this->getIO(); $newlyCreated = !file_exists($file); if (!file_exists($file) && !file_put_contents($file, "{\n}\n")) { $io->writeError('<error>' . $file . ' could not be created.</error>'); return 1; } if (!is_readable($file)) { $io->writeError('<error>' . $file . ' is not readable.</error>'); return 1; } if (!is_writable($file)) { $io->writeError('<error>' . $file . ' is not writable.</error>'); return 1; } if (filesize($file) === 0) { file_put_contents($file, "{\n}\n"); } $json = new JsonFile($file); $composerDefinition = $json->read(); $composerBackup = file_get_contents($json->getPath()); $composer = $this->getComposer(true, $input->getOption('no-plugins')); $repos = $composer->getRepositoryManager()->getRepositories(); $platformOverrides = $composer->getConfig()->get('platform') ?: array(); // initialize $this->repos as it is used by the parent InitCommand $this->repos = new CompositeRepository(array_merge(array(new PlatformRepository(array(), $platformOverrides)), $repos)); $phpVersion = $this->repos->findPackage('php', '*')->getVersion(); $requirements = $this->determineRequirements($input, $output, $input->getArgument('packages'), $phpVersion); $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $removeKey = $input->getOption('dev') ? 'require' : 'require-dev'; $baseRequirements = array_key_exists($requireKey, $composerDefinition) ? $composerDefinition[$requireKey] : array(); $requirements = $this->formatRequirements($requirements); // validate requirements format $versionParser = new VersionParser(); foreach ($requirements as $constraint) { $versionParser->parseConstraints($constraint); } $sortPackages = $input->getOption('sort-packages') || $composer->getConfig()->get('sort-packages'); if (!$this->updateFileCleanly($json, $baseRequirements, $requirements, $requireKey, $removeKey, $sortPackages)) { foreach ($requirements as $package => $version) { $baseRequirements[$package] = $version; if (isset($composerDefinition[$removeKey][$package])) { unset($composerDefinition[$removeKey][$package]); } } $composerDefinition[$requireKey] = $baseRequirements; $json->write($composerDefinition); } $io->writeError('<info>' . $file . ' has been ' . ($newlyCreated ? 'created' : 'updated') . '</info>'); if ($input->getOption('no-update')) { return 0; } $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); // Update packages $this->resetComposer(); $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'require', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $install->setVerbose($input->getOption('verbose'))->setPreferSource($input->getOption('prefer-source'))->setPreferDist($input->getOption('prefer-dist'))->setDevMode($updateDevMode)->setOptimizeAutoloader($optimize)->setClassMapAuthoritative($authoritative)->setUpdate(true)->setUpdateWhitelist(array_keys($requirements))->setWhitelistDependencies($input->getOption('update-with-dependencies'))->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs'))->setPreferStable($input->getOption('prefer-stable'))->setPreferLowest($input->getOption('prefer-lowest')); $exception = null; try { $status = $install->run(); } catch (\Exception $exception) { $status = 1; } if ($status !== 0) { if ($newlyCreated) { $io->writeError("\n" . '<error>Installation failed, deleting ' . $file . '.</error>'); unlink($json->getPath()); } else { $io->writeError("\n" . '<error>Installation failed, reverting ' . $file . ' to its original content.</error>'); file_put_contents($json->getPath(), $composerBackup); } } if ($exception) { throw $exception; } return $status; }
/** * Uninstall a WP-CLI package. * * ## OPTIONS * * <name> * : Name of the package to uninstall. * * ## EXAMPLES * * $ wp package uninstall wp-cli/server-command * Removing require statement from /home/person/.wp-cli/packages/composer.json * Deleting package directory /home/person/.wp-cli/packages/vendor/wp-cli/server-command * Regenerating Composer autoload. * Success: Uninstalled package. */ public function uninstall($args) { list($package_name) = $args; try { $composer = $this->get_composer(); } catch (Exception $e) { WP_CLI::error($e->getMessage()); } if (false === ($package = $this->get_installed_package_by_name($package_name))) { WP_CLI::error("Package not installed."); } $composer_json_obj = $this->get_composer_json(); // Remove the 'require' from composer.json $json_path = $composer_json_obj->getPath(); WP_CLI::log(sprintf('Removing require statement from %s', $json_path)); $composer_backup = file_get_contents($composer_json_obj->getPath()); $manipulator = new JsonManipulator($composer_backup); $manipulator->removeSubNode('require', $package_name); file_put_contents($composer_json_obj->getPath(), $manipulator->getContents()); try { $composer = $this->get_composer(); } catch (Exception $e) { WP_CLI::error($e->getMessage()); } // Set up the installer $install = Installer::create(new NullIO(), $composer); $install->setUpdate(true); // Installer class will only override composer.lock with this flag $install->setPreferSource(true); // Use VCS when VCS for easier contributions. WP_CLI::log('Removing package directories and regenerating autoloader...'); $res = false; try { $res = $install->run(); } catch (Exception $e) { WP_CLI::warning($e->getMessage()); } if (0 === $res) { WP_CLI::success("Uninstalled package."); } else { file_put_contents($composer_json_obj->getPath(), $composer_backup); WP_CLI::error("Package removal failed (Composer return code {$res})."); } }
public function installProject(IOInterface $io, Config $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false, $noInstall = false, $ignorePlatformReqs = false, InputInterface $input) { $oldCwd = getcwd(); // we need to manually load the configuration to pass the auth credentials to the io interface! $io->loadConfiguration($config); if ($packageName !== null) { $installedFromVcs = $this->installRootPackage($io, $config, $packageName, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repositoryUrl, $disablePlugins, $noScripts, $keepVcs, $noProgress); } else { $installedFromVcs = false; } $composer = Factory::create($io, null, $disablePlugins); $composer->getDownloadManager()->setOutputProgress(!$noProgress); $fs = new Filesystem(); if ($noScripts === false) { // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_ROOT_PACKAGE_INSTALL, $installDevPackages); } $rootPackageConfig = $composer->getConfig(); $this->updatePreferredOptions($rootPackageConfig, $input, $preferSource, $preferDist); // install dependencies of the created project if ($noInstall === false) { $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource)->setPreferDist($preferDist)->setDevMode($installDevPackages)->setRunScripts(!$noScripts)->setIgnorePlatformRequirements($ignorePlatformReqs); if ($disablePlugins) { $installer->disablePlugins(); } $status = $installer->run(); if (0 !== $status) { return $status; } } $hasVcs = $installedFromVcs; if (!$keepVcs && $installedFromVcs && (!$io->isInteractive() || $io->askConfirmation('<info>Do you want to remove the existing VCS (.git, .svn..) history?</info> [<comment>Y,n</comment>]? ', true))) { $finder = new Finder(); $finder->depth(0)->directories()->in(getcwd())->ignoreVCS(false)->ignoreDotFiles(false); foreach (array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg') as $vcsName) { $finder->name($vcsName); } try { $dirs = iterator_to_array($finder); unset($finder); foreach ($dirs as $dir) { if (!$fs->removeDirectory($dir)) { throw new \RuntimeException('Could not remove ' . $dir); } } } catch (\Exception $e) { $io->writeError('<error>An error occurred while removing the VCS metadata: ' . $e->getMessage() . '</error>'); } $hasVcs = false; } // rewriting self.version dependencies with explicit version numbers if the package's vcs metadata is gone if (!$hasVcs) { $package = $composer->getPackage(); $configSource = new JsonConfigSource(new JsonFile('composer.json')); foreach (BasePackage::$supportedLinkTypes as $type => $meta) { foreach ($package->{'get' . $meta['method']}() as $link) { if ($link->getPrettyConstraint() === 'self.version') { $configSource->addLink($type, $link->getTarget(), $package->getPrettyVersion()); } } } } if ($noScripts === false) { // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, $installDevPackages); } chdir($oldCwd); $vendorComposerDir = $composer->getConfig()->get('vendor-dir') . '/composer'; if (is_dir($vendorComposerDir) && $fs->isDirEmpty($vendorComposerDir)) { @rmdir($vendorComposerDir); $vendorDir = $composer->getConfig()->get('vendor-dir'); if (is_dir($vendorDir) && $fs->isDirEmpty($vendorDir)) { @rmdir($vendorDir); } } return 0; }