diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index bbb27159b1..eec896cbfe 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -598,6 +598,7 @@ class acp_extensions $this->config->set('exts_composer_enable_on_install', $enable_on_install); $this->config->set('exts_composer_purge_on_remove', $purge_on_remove); $this->config->set('exts_composer_repositories', serialize($repositories)); + if (!$this->config['exts_composer_packagist'] && $enable_packagist) { $s_hidden_fields = build_hidden_fields(array( diff --git a/phpBB/phpbb/composer/extension_manager.php b/phpBB/phpbb/composer/extension_manager.php index d877d28676..8b2388e693 100644 --- a/phpBB/phpbb/composer/extension_manager.php +++ b/phpBB/phpbb/composer/extension_manager.php @@ -17,8 +17,8 @@ use Composer\IO\IOInterface; use phpbb\cache\driver\driver_interface; use phpbb\composer\exception\managed_with_clean_error_exception; use phpbb\composer\exception\managed_with_enable_error_exception; -use phpbb\composer\exception\managed_with_error_exception; use phpbb\composer\exception\runtime_exception; +use phpbb\config\config; use phpbb\extension\manager as ext_manager; use phpbb\filesystem\exception\filesystem_exception; use phpbb\filesystem\filesystem; @@ -43,6 +43,16 @@ class extension_manager extends manager */ private $enabled_extensions; + /** + * @var bool Enables extensions when installing them? + */ + private $enable_on_install = false; + + /** + * @var bool Purges extensions data when removing them? + */ + private $purge_on_remove = false; + /** * @param installer $installer Installer object * @param driver_interface $cache Cache object @@ -50,12 +60,19 @@ class extension_manager extends manager * @param filesystem $filesystem Filesystem object * @param string $package_type Composer type of managed packages * @param string $exception_prefix Exception prefix to use + * @param config $config Config object */ - public function __construct(installer $installer, driver_interface $cache, ext_manager $extension_manager, filesystem $filesystem, $package_type, $exception_prefix) + public function __construct(installer $installer, driver_interface $cache, ext_manager $extension_manager, filesystem $filesystem, $package_type, $exception_prefix, config $config = null) { $this->extension_manager = $extension_manager; $this->filesystem = $filesystem; + if ($config) + { + $this->enable_on_install = (bool) $config['exts_composer_enable_on_install']; + $this->purge_on_remove = (bool) $config['exts_composer_purge_on_remove']; + } + parent::__construct($installer, $cache, $package_type, $exception_prefix); } @@ -71,6 +88,32 @@ class extension_manager extends manager } } + /** + * {@inheritdoc} + */ + public function post_install(array $packages, IOInterface $io = null) + { + if ($this->enable_on_install) + { + $io->writeError('ENABLING_EXTENSIONS', true, 1); + foreach ($packages as $package) + { + try + { + $this->extension_manager->enable($package); + } + catch (\phpbb\exception\runtime_exception $e) + { + $io->writeError([$e->getMessage(), $e->get_parameters()], true, 4); + } + catch (\Exception $e) + { + $io->writeError($e->getMessage(), true, 4); + } + } + } + } + /** * {@inheritdoc} */ @@ -143,14 +186,25 @@ class extension_manager extends manager */ public function pre_remove(array $packages, IOInterface $io = null) { - $io->writeError('DISABLING_EXTENSIONS', true, 1); + if ($this->purge_on_remove) + { + $io->writeError('DISABLING_EXTENSIONS', true, 1); + } + foreach ($packages as $package) { try { if ($this->extension_manager->is_enabled($package)) { - $this->extension_manager->disable($package); + if ($this->purge_on_remove) + { + $this->extension_manager->purge($package); + } + else + { + $this->extension_manager->disable($package); + } } } catch (\phpbb\exception\runtime_exception $e) @@ -227,4 +281,26 @@ class extension_manager extends manager } } } + + /** + * Enable the extensions when installing + * + * Warning: Only the explicitly required extensions will be enabled + * + * @param bool $enable + */ + public function set_enable_on_install($enable) + { + $this->enable_on_install = $enable; + } + + /** + * Purge the extension when disabling it + * + * @param bool $purge + */ + public function set_purge_on_remove($purge) + { + $this->purge_on_remove = $purge; + } } diff --git a/phpBB/phpbb/composer/installer.php b/phpBB/phpbb/composer/installer.php index 1640c334f0..4488aadb82 100644 --- a/phpBB/phpbb/composer/installer.php +++ b/phpBB/phpbb/composer/installer.php @@ -222,9 +222,11 @@ class installer foreach ($installed_packages as $package) { - if (array_key_exists($package->getName(), $required_links) && in_array($package->getType(), $types, true)) + if (in_array($package->getType(), $types, true)) { - $installed[$package->getName()] = $required_links[$package->getName()]->getPrettyConstraint(); + $version = array_key_exists($package->getName(), $required_links) ? + $required_links[$package->getName()]->getPrettyConstraint() : '*'; + $installed[$package->getName()] = $version; } } diff --git a/phpBB/phpbb/console/command/extension/install.php b/phpBB/phpbb/console/command/extension/install.php index aa9d5a6867..6365da4a0c 100644 --- a/phpBB/phpbb/console/command/extension/install.php +++ b/phpBB/phpbb/console/command/extension/install.php @@ -13,19 +13,20 @@ namespace phpbb\console\command\extension; +use phpbb\composer\extension_manager; use phpbb\composer\io\console_io; -use phpbb\composer\manager_interface; use phpbb\language\language; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; class install extends \phpbb\console\command\command { /** - * @var manager_interface Composer extensions manager + * @var extension_manager Composer extensions manager */ protected $manager; @@ -34,11 +35,13 @@ class install extends \phpbb\console\command\command */ protected $language; - public function __construct(\phpbb\user $user, manager_interface $manager, language $language) + public function __construct(\phpbb\user $user, extension_manager $manager, language $language) { $this->manager = $manager; $this->language = $language; + $language->add_lang('acp/extensions'); + parent::__construct($user); } @@ -51,11 +54,16 @@ class install extends \phpbb\console\command\command { $this ->setName('extension:install') - ->setDescription($this->user->lang('CLI_DESCRIPTION_EXTENSION_INSTALL')) + ->setDescription($this->language->lang('CLI_DESCRIPTION_EXTENSION_INSTALL')) + ->addOption( + 'enable', + 'e', + InputOption::VALUE_NONE, + $this->language->lang('CLI_DESCRIPTION_EXTENSION_INSTALL_OPTION_ENABLE')) ->addArgument( 'extensions', InputArgument::IS_ARRAY | InputArgument::REQUIRED, - $this->user->lang('CLI_DESCRIPTION_EXTENSION_INSTALL')) + $this->language->lang('CLI_DESCRIPTION_EXTENSION_INSTALL_ARGUMENT')) ; } @@ -74,9 +82,14 @@ class install extends \phpbb\console\command\command $composer_io = new console_io($input, $output, $this->getHelperSet(), $this->language); $extensions = $input->getArgument('extensions'); + if ($input->getOption('enable')) + { + $this->manager->set_enable_on_install(true); + } + $this->manager->install($extensions, $composer_io); - $io->success('All extensions installed'); + $io->success($this->language->lang('EXTENSIONS_INSTALLED')); return 0; } diff --git a/phpBB/phpbb/console/command/extension/list_available.php b/phpBB/phpbb/console/command/extension/list_available.php index c844201fd3..2da8a98845 100644 --- a/phpBB/phpbb/console/command/extension/list_available.php +++ b/phpBB/phpbb/console/command/extension/list_available.php @@ -35,6 +35,8 @@ class list_available extends \phpbb\console\command\command { $this->manager = $manager; + $user->add_lang('acp/extensions'); + parent::__construct($user); } diff --git a/phpBB/phpbb/console/command/extension/remove.php b/phpBB/phpbb/console/command/extension/remove.php index d1f59dec5c..181401e825 100644 --- a/phpBB/phpbb/console/command/extension/remove.php +++ b/phpBB/phpbb/console/command/extension/remove.php @@ -13,19 +13,20 @@ namespace phpbb\console\command\extension; +use phpbb\composer\extension_manager; use phpbb\composer\io\console_io; -use phpbb\composer\manager_interface; use phpbb\language\language; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; class remove extends \phpbb\console\command\command { /** - * @var manager_interface Composer extensions manager + * @var extension_manager Composer extensions manager */ protected $manager; @@ -34,11 +35,13 @@ class remove extends \phpbb\console\command\command */ protected $language; - public function __construct(\phpbb\user $user, manager_interface $manager, language $language) + public function __construct(\phpbb\user $user, extension_manager $manager, language $language) { $this->manager = $manager; $this->language = $language; + $language->add_lang('acp/extensions'); + parent::__construct($user); } @@ -51,11 +54,16 @@ class remove extends \phpbb\console\command\command { $this ->setName('extension:remove') - ->setDescription($this->user->lang('CLI_DESCRIPTION_EXTENSION_REMOVE')) + ->setDescription($this->language->lang('CLI_DESCRIPTION_EXTENSION_REMOVE')) + ->addOption( + 'purge', + 'p', + InputOption::VALUE_NONE, + $this->language->lang('CLI_DESCRIPTION_EXTENSION_REMOVE_OPTION_URGE')) ->addArgument( 'extensions', InputArgument::IS_ARRAY | InputArgument::REQUIRED, - $this->user->lang('CLI_DESCRIPTION_EXTENSION_REMOVE')) + $this->language->lang('CLI_DESCRIPTION_EXTENSION_REMOVE')) ; } @@ -74,9 +82,14 @@ class remove extends \phpbb\console\command\command $composer_io = new console_io($input, $output, $this->getHelperSet(), $this->language); $extensions = $input->getArgument('extensions'); + if ($input->getOption('purge')) + { + $this->manager->set_purge_on_remove(true); + } + $this->manager->remove($extensions, $composer_io); - $io->success('All extensions removed'); + $io->success($this->language->lang('EXTENSIONS_REMOVED')); return 0; }