Skip to content
Snippets Groups Projects
Commit 8a337112 authored by Adam G-H's avatar Adam G-H
Browse files

Issue #3227420 by phenaproxima, tedbow: Allow paths to required executables to be configurable

parent d488c9c3
No related branches found
No related tags found
1 merge request!127Issue #3227420: Allow paths to required executables to be configurable
file_syncer: php
executables:
composer: ~
rsync: ~
......@@ -5,3 +5,9 @@ package_manager.settings:
file_syncer:
type: string
label: 'Which file syncer to use, or NULL to auto-detect'
executables:
type: sequence
label: 'Absolute paths to required executables, or NULL to rely on PATH'
sequence:
type: string
label: 'Absolute path to executable, or NULL'
......@@ -18,9 +18,10 @@ services:
arguments:
- '@package_manager.symfony_file_system'
package_manager.executable_finder:
class: PhpTuf\ComposerStager\Infrastructure\Process\ExecutableFinder
class: Drupal\package_manager\ExecutableFinder
arguments:
- '@package_manager.symfony_executable_finder'
- '@config.factory'
# Executable runners.
package_manager.rsync_runner:
......
<?php
namespace Drupal\package_manager;
use Drupal\Core\Config\ConfigFactoryInterface;
use PhpTuf\ComposerStager\Infrastructure\Process\ExecutableFinderInterface;
use PhpTuf\ComposerStager\Infrastructure\Process\ExecutableFinder as StagerExecutableFinder;
use Symfony\Component\Process\ExecutableFinder as SymfonyExecutableFinder;
/**
* An executable finder which looks for executable paths in configuration.
*/
class ExecutableFinder implements ExecutableFinderInterface {
/**
* The decorated executable finder.
*
* @var \PhpTuf\ComposerStager\Infrastructure\Process\ExecutableFinder
*/
private $decorated;
/**
* The config factory service.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
private $configFactory;
/**
* Constructs an ExecutableFinder object.
*
* @param \Symfony\Component\Process\ExecutableFinder $symfony_executable_finder
* The Symfony executable finder.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory service.
*/
public function __construct(SymfonyExecutableFinder $symfony_executable_finder, ConfigFactoryInterface $config_factory) {
$this->decorated = new StagerExecutableFinder($symfony_executable_finder);
$this->configFactory = $config_factory;
}
/**
* {@inheritdoc}
*/
public function find(string $name): string {
$executables = $this->configFactory->get('package_manager.settings')
->get('executables');
return $executables[$name] ?? $this->decorated->find($name);
}
}
<?php
namespace Drupal\Tests\package_manager\Kernel;
use Symfony\Component\Process\ExecutableFinder as SymfonyExecutableFinder;
/**
* @covers \Drupal\package_manager\ExecutableFinder
*
* @group package_manager
*/
class ExecutableFinderTest extends PackageManagerKernelTestBase {
/**
* Tests that the executable finder looks for paths in configuration.
*/
public function testCheckConfigurationForExecutablePath(): void {
$symfony_executable_finder = new class () extends SymfonyExecutableFinder {
/**
* {@inheritdoc}
*/
public function find($name, $default = NULL, array $extraDirs = []) {
return '/dev/null';
}
};
$this->container->set('package_manager.symfony_executable_finder', $symfony_executable_finder);
$this->config('package_manager.settings')
->set('executables.composer', '/path/to/composer')
->save();
$executable_finder = $this->container->get('package_manager.executable_finder');
$this->assertSame('/path/to/composer', $executable_finder->find('composer'));
$this->assertSame('/dev/null', $executable_finder->find('rsync'));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment