3 namespace Drupal\Console\Core\Utils;
5 use Symfony\Component\Yaml\Yaml;
6 use Symfony\Component\Console\Input\ArgvInput;
7 use Symfony\Component\Finder\Finder;
8 use Dflydev\DotAccessConfiguration\YamlFileConfigurationBuilder;
9 use Dflydev\DotAccessConfiguration\ConfigurationInterface;
12 * Class ConfigurationManager.
14 class ConfigurationManager
17 * @var ConfigurationInterface
19 private $configuration = null;
24 private $applicationDirectory = null;
29 private $missingConfigurationFiles = [];
34 private $configurationDirectories = [];
42 * @param $applicationDirectory
45 public function loadConfiguration($applicationDirectory)
47 $homeConfig = $this->getHomeDirectory() . '/.console/';
48 if (!is_dir($homeConfig)) {
49 mkdir($homeConfig, 0777);
52 $this->applicationDirectory = $applicationDirectory;
53 $input = new ArgvInput();
54 $root = $input->getParameterOption(['--root'], null);
56 $configurationDirectories[] = $applicationDirectory;
57 $configurationDirectories[] = $applicationDirectory.DRUPAL_CONSOLE_CORE;
58 $configurationDirectories[] = $applicationDirectory.DRUPAL_CONSOLE;
59 $configurationDirectories[] = '/etc/console/';
60 $configurationDirectories[] = $this->getHomeDirectory() . '/.console/';
61 $configurationDirectories[] = $applicationDirectory .'/console/';
63 $configurationDirectories[] = $root . '/console/';
65 $configurationDirectories = array_unique($configurationDirectories);
67 $configurationFiles = [];
68 foreach ($configurationDirectories as $configurationDirectory) {
69 $file = $configurationDirectory . 'config.yml';
71 if (stripos($configurationDirectory, '/vendor/') <= 0
72 && stripos($configurationDirectory, '/bin/') <= 0
73 && stripos($configurationDirectory, 'console/') > 0
75 $this->configurationDirectories[] = str_replace('//', '/', $configurationDirectory);
78 if (!file_exists($file)) {
79 $this->missingConfigurationFiles[] = $file;
82 if (file_get_contents($file)==='') {
83 $this->missingConfigurationFiles[] = $file;
87 $configurationFiles[] = $file;
90 $this->configurationDirectories =
91 array_unique($this->configurationDirectories);
93 $builder = new YamlFileConfigurationBuilder($configurationFiles);
94 $this->configuration = $builder->build();
95 $this->appendCommandAliases();
97 if ($configurationFiles) {
98 $this->missingConfigurationFiles = [];
104 public function loadConfigurationFromDirectory($directory)
106 $builder = new YamlFileConfigurationBuilder([$directory.'/console/config.yml']);
108 return $builder->build();
112 * @return ConfigurationInterface
114 public function getConfiguration()
116 return $this->configuration;
119 public function readSite($siteFile)
121 if (!file_exists($siteFile)) {
125 return Yaml::parse(file_get_contents($siteFile));
133 public function readTarget($target)
135 if (!array_key_exists($target, $this->sites)) {
139 $targetInformation = $this->sites[$target];
141 if (array_key_exists('host', $targetInformation) && $targetInformation['host'] != 'local') {
142 $targetInformation['remote'] = true;
146 $this->configuration->get('application.remote'),
152 * Return the user home directory.
156 public function getHomeDirectory()
158 if (function_exists('posix_getuid')) {
159 return posix_getpwuid(posix_getuid())['dir'];
162 return realpath(rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '/\\'));
168 public function getApplicationDirectory()
170 return $this->applicationDirectory;
174 * Return the sites config directory.
178 private function getSitesDirectories()
180 $configurationDirectories = $this->getConfigurationDirectories();
181 $configurationDirectories = array_map(
182 function ($directory) {
188 $configurationDirectories
191 $configurationDirectories = array_filter(
192 $configurationDirectories,
193 function ($directory) {
194 return is_dir($directory);
198 return $configurationDirectories;
202 * @param string $commandName
205 public function readDrushEquivalents($commandName)
208 $aliasInformation = Yaml::parse(
210 $this->applicationDirectory.DRUPAL_CONSOLE_CORE.'config/drush.yml'
214 foreach ($aliasInformation['commands'] as $key => $commands) {
215 foreach ($commands as $drush => $console) {
216 $equivalents[$drush] = $console;
221 $aliasInformation = [];
222 foreach ($equivalents as $key => $alternative) {
223 $aliasInformation[] = [$key, $alternative];
226 return $aliasInformation;
229 if (array_key_exists($commandName, $equivalents)) {
230 return $equivalents[$commandName] ?: ' ';
239 public function getConsoleDirectory()
241 return sprintf('%s/.console/', $this->getHomeDirectory());
247 public function getMissingConfigurationFiles()
249 return $this->missingConfigurationFiles;
255 public function getConfigurationDirectories()
257 return $this->configurationDirectories;
263 public function appendCommandAliases()
265 $configurationDirectories = array_merge(
266 [$this->applicationDirectory . DRUPAL_CONSOLE_CORE . 'config/dist/'],
267 $this->configurationDirectories
270 foreach ($configurationDirectories as $directory) {
271 $aliasFile = $directory . 'aliases.yml';
272 if (file_exists($aliasFile)) {
273 $aliases = array_merge(
275 Yaml::parse(file_get_contents($aliasFile))
279 if (array_key_exists('commands', $aliases) && array_key_exists('aliases', $aliases['commands'])) {
280 $this->configuration->set(
281 'application.commands.aliases',
282 $aliases['commands']['aliases']
287 public function loadExtendConfiguration()
289 $directory = $this->getHomeDirectory() . '/.console/extend/';
290 if (!is_dir($directory)) {
294 $autoloadFile = $directory . 'vendor/autoload.php';
295 if (!is_file($autoloadFile)) {
298 include_once $autoloadFile;
299 $extendFile= $directory . 'extend.console.config.yml';
301 $this->importConfigurationFile($extendFile);
304 public function importConfigurationFile($configFile)
306 if (is_file($configFile) && file_get_contents($configFile)!='') {
307 $builder = new YamlFileConfigurationBuilder([$configFile]);
308 $this->configuration->import($builder->build());
315 public function getSites()
321 $sitesDirectories = $this->getSitesDirectories();
322 $finder = new Finder();
323 $finder->in($sitesDirectories);
324 $finder->name("*.yml");
326 foreach ($finder as $site) {
327 $siteName = $site->getBasename('.yml');
328 $environments = $this->readSite($site->getRealPath());
330 if (!$environments || !is_array($environments)) {
334 foreach ($environments as $environment => $config) {
335 $site = $siteName . '.' . $environment;
336 $this->sites[$site] = $config;