/**
  * {@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();
 }
Exemple #3
0
 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;
 }
Exemple #4
0
 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();
 }
Exemple #6
0
 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();
 }
Exemple #7
0
 /**
  * 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;
 }
Exemple #8
0
 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'));
 }
Exemple #9
0
 /**
  * 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);
     }
 }
Exemple #10
0
 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;
 }
Exemple #11
0
 /**
  * {@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;
 }
Exemple #14
0
 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;
 }
Exemple #15
0
 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;
 }
Exemple #17
0
 /**
  * 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();
         }
     }
 }
Exemple #19
0
 /**
  * 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);
     }
 }
Exemple #20
0
 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;
 }
Exemple #21
0
 /**
  * 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);
     }
 }
Exemple #22
0
 /**
  * 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();
 }
Exemple #24
0
 /**
  * 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;
 }
Exemple #25
0
 /**
  * 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);
     }
 }
Exemple #26
0
 /**
  * @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);
 }
Exemple #27
0
 /**
  * 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;
 }
Exemple #29
0
 /**
  * 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;
 }