Skip to content
Snippets Groups Projects

Issue #3328136: InstallerController::activateModule() assumes project id and extension ID will match

Open Issue #3328136: InstallerController::activateModule() assumes project id and extension ID will match
Files
4
@@ -5,12 +5,14 @@ namespace Drupal\project_browser\Controller;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Extension\ModuleInstallerInterface;
use Drupal\Core\TempStore\SharedTempStoreFactory;
use Drupal\Core\Url;
use Drupal\package_manager\Exception\StageException;
use Drupal\project_browser\ComposerInstaller\Installer;
use Drupal\project_browser\EnabledSourceHandler;
use Drupal\project_browser\InfoFilesFinder;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
@@ -97,6 +99,20 @@ class InstallerController extends ControllerBase {
*/
protected $logger;
/**
* The module extension list.
*
* @var \Drupal\Core\Extension\ModuleExtensionList
*/
protected $moduleList;
/**
* The info files finder service.
*
* @var \Drupal\project_browser\InfoFilesFinder
*/
protected $infoFilesFinder;
/**
* Constructs an InstallerController object.
*
@@ -112,8 +128,21 @@ class InstallerController extends ControllerBase {
* The time service.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
* @param \Drupal\Core\Extension\ModuleExtensionList $module_list
* The module list service.
* @param \Drupal\project_browser\InfoFilesFinder $info_files_finder
* The info files finder service.
*/
public function __construct(Installer $installer, SharedTempStoreFactory $shared_temp_store_factory, ModuleInstallerInterface $module_installer, EnabledSourceHandler $enabled_source, TimeInterface $time, LoggerInterface $logger) {
public function __construct(
Installer $installer,
SharedTempStoreFactory $shared_temp_store_factory,
ModuleInstallerInterface $module_installer,
EnabledSourceHandler $enabled_source,
TimeInterface $time,
LoggerInterface $logger,
ModuleExtensionList $module_list,
InfoFilesFinder $info_files_finder
) {
$this->installer = $installer;
$this->projectBrowserTempStore = $shared_temp_store_factory->get('project_browser');
$this->sharedTempStore = $shared_temp_store_factory;
@@ -121,6 +150,8 @@ class InstallerController extends ControllerBase {
$this->enabledSourceHandler = $enabled_source;
$this->time = $time;
$this->logger = $logger;
$this->moduleList = $module_list;
$this->infoFilesFinder = $info_files_finder;
}
/**
@@ -134,6 +165,8 @@ class InstallerController extends ControllerBase {
$container->get('project_browser.enabled_source'),
$container->get('datetime.time'),
$container->get('logger.channel.project_browser'),
$container->get('extension.list.module'),
$container->get('project_browser.info_files_finder'),
);
}
@@ -541,6 +574,34 @@ class InstallerController extends ControllerBase {
* Status message.
*/
public function activateModule(string $project_id): JsonResponse {
// If the project is not in the module list, check the package directly.
if (!array_key_exists($project_id, $this->moduleList->getList())) {
$found = FALSE;
$composer = $this->installer->getActiveComposer();
$package = $composer->getPackageForProject($project_id);
$package_path = $composer->getInstalledPackagesData()[$package] ?? NULL;
// Check for a top-level project in the package install path.
if (isset($package_path['install_path'])) {
$package_install_path = $package_path['install_path'];
$all_info_files = $this->infoFilesFinder->findInfoFiles($package_install_path, 0);
// If there is single .info.yml file in base directory of the package.
if (count($all_info_files) === 1) {
$project_id = $this->infoFilesFinder->getProjectId($all_info_files);
$found = TRUE;
}
}
if (!$found) {
// Possible causes:
// - Project machine name does not match file name and there is no
// project at the root folder of the project.
// - Repo only contain (sub)modules.
// Follow up issue: TODO
$e = new \Exception('Unable to find a suitable project to install.');
return $this->errorResponse($e, 'project install');
}
}
$this->projectBrowserTempStore->set('installing', $project_id);
try {
$this->moduleInstaller->install([$project_id]);
Loading