Yaffs site version 1.1
[yaffs-website] / vendor / drupal / console-core / src / Utils / ConfigurationManager.php
1 <?php
2
3 namespace Drupal\Console\Core\Utils;
4
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;
10
11 /**
12  * Class ConfigurationManager.
13  */
14 class ConfigurationManager
15 {
16     /**
17      * @var ConfigurationInterface
18      */
19     private $configuration = null;
20
21     /**
22      * @var string
23      */
24     private $applicationDirectory = null;
25
26     /**
27      * @var array
28      */
29     private $missingConfigurationFiles = [];
30
31     /**
32      * @var array
33      */
34     private $configurationDirectories = [];
35
36     /**
37      * @var array
38      */
39     private $sites = [];
40
41     /**
42      * @param $applicationDirectory
43      * @return $this
44      */
45     public function loadConfiguration($applicationDirectory)
46     {
47         $homeConfig = $this->getHomeDirectory() . '/.console/';
48         if (!is_dir($homeConfig)) {
49             mkdir($homeConfig, 0777);
50         }
51
52         $this->applicationDirectory = $applicationDirectory;
53         $input = new ArgvInput();
54         $root = $input->getParameterOption(['--root'], null);
55
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/';
62         if ($root) {
63             $configurationDirectories[] = $root . '/console/';
64         }
65         $configurationDirectories = array_unique($configurationDirectories);
66
67         $configurationFiles = [];
68         foreach ($configurationDirectories as $configurationDirectory) {
69             $file =  $configurationDirectory . 'config.yml';
70
71             if (stripos($configurationDirectory, '/vendor/') <= 0
72                 && stripos($configurationDirectory, '/bin/') <= 0
73                 && stripos($configurationDirectory, 'console/') > 0
74             ) {
75                 $this->configurationDirectories[] = str_replace('//', '/', $configurationDirectory);
76             }
77
78             if (!file_exists($file)) {
79                 $this->missingConfigurationFiles[] = $file;
80                 continue;
81             }
82             if (file_get_contents($file)==='') {
83                 $this->missingConfigurationFiles[] = $file;
84                 continue;
85             }
86
87             $configurationFiles[] = $file;
88         }
89
90         $this->configurationDirectories =
91             array_unique($this->configurationDirectories);
92
93         $builder = new YamlFileConfigurationBuilder($configurationFiles);
94         $this->configuration = $builder->build();
95         $this->appendCommandAliases();
96
97         if ($configurationFiles) {
98             $this->missingConfigurationFiles = [];
99         }
100
101         return $this;
102     }
103
104     public function loadConfigurationFromDirectory($directory)
105     {
106         $builder = new YamlFileConfigurationBuilder([$directory.'/console/config.yml']);
107
108         return $builder->build();
109     }
110
111     /**
112      * @return ConfigurationInterface
113      */
114     public function getConfiguration()
115     {
116         return $this->configuration;
117     }
118
119     public function readSite($siteFile)
120     {
121         if (!file_exists($siteFile)) {
122             return [];
123         }
124
125         return Yaml::parse(file_get_contents($siteFile));
126     }
127
128     /**
129      * @param $target
130      *
131      * @return array
132      */
133     public function readTarget($target)
134     {
135         if (!array_key_exists($target, $this->sites)) {
136             return [];
137         }
138
139         $targetInformation = $this->sites[$target];
140
141         if (array_key_exists('host', $targetInformation) && $targetInformation['host'] != 'local') {
142             $targetInformation['remote'] = true;
143         }
144
145         return array_merge(
146             $this->configuration->get('application.remote'),
147             $targetInformation
148         );
149     }
150
151     /**
152      * Return the user home directory.
153      *
154      * @return string
155      */
156     public function getHomeDirectory()
157     {
158         if (function_exists('posix_getuid')) {
159             return posix_getpwuid(posix_getuid())['dir'];
160         }
161
162         return realpath(rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '/\\'));
163     }
164
165     /**
166      * @return string
167      */
168     public function getApplicationDirectory()
169     {
170         return $this->applicationDirectory;
171     }
172
173     /**
174      * Return the sites config directory.
175      *
176      * @return array
177      */
178     private function getSitesDirectories()
179     {
180         $configurationDirectories = $this->getConfigurationDirectories();
181         $configurationDirectories = array_map(
182             function ($directory) {
183                 return sprintf(
184                     '%s/sites',
185                     $directory
186                 );
187             },
188             $configurationDirectories
189         );
190
191         $configurationDirectories = array_filter(
192             $configurationDirectories,
193             function ($directory) {
194                 return is_dir($directory);
195             }
196         );
197
198         return $configurationDirectories;
199     }
200
201     /**
202      * @param string $commandName
203      * @return mixed
204      */
205     public function readDrushEquivalents($commandName)
206     {
207         $equivalents = [];
208         $aliasInformation = Yaml::parse(
209             file_get_contents(
210                 $this->applicationDirectory.DRUPAL_CONSOLE_CORE.'config/drush.yml'
211             )
212         );
213
214         foreach ($aliasInformation['commands'] as $key => $commands) {
215             foreach ($commands as $drush => $console) {
216                 $equivalents[$drush] = $console;
217             }
218         }
219
220         if (!$commandName) {
221             $aliasInformation = [];
222             foreach ($equivalents as $key => $alternative) {
223                 $aliasInformation[] = [$key, $alternative];
224             }
225
226             return $aliasInformation;
227         }
228
229         if (array_key_exists($commandName, $equivalents)) {
230             return $equivalents[$commandName] ?: ' ';
231         }
232
233         return [];
234     }
235
236     /**
237      * @return string
238      */
239     public function getConsoleDirectory()
240     {
241         return sprintf('%s/.console/', $this->getHomeDirectory());
242     }
243
244     /**
245      * @return array
246      */
247     public function getMissingConfigurationFiles()
248     {
249         return $this->missingConfigurationFiles;
250     }
251
252     /**
253      * @return array
254      */
255     public function getConfigurationDirectories()
256     {
257         return $this->configurationDirectories;
258     }
259
260     /**
261      * @return string
262      */
263     public function appendCommandAliases()
264     {
265         $configurationDirectories = array_merge(
266             [$this->applicationDirectory . DRUPAL_CONSOLE_CORE . 'config/dist/'],
267             $this->configurationDirectories
268         );
269         $aliases = [];
270         foreach ($configurationDirectories as $directory) {
271             $aliasFile = $directory . 'aliases.yml';
272             if (file_exists($aliasFile)) {
273                 $aliases = array_merge(
274                     $aliases,
275                     Yaml::parse(file_get_contents($aliasFile))
276                 );
277             }
278         }
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']
283             );
284         }
285     }
286
287     public function loadExtendConfiguration()
288     {
289         $directory = $this->getHomeDirectory() . '/.console/extend/';
290         if (!is_dir($directory)) {
291             return null;
292         }
293
294         $autoloadFile = $directory . 'vendor/autoload.php';
295         if (!is_file($autoloadFile)) {
296             return null;
297         }
298         include_once $autoloadFile;
299         $extendFile= $directory . 'extend.console.config.yml';
300
301         $this->importConfigurationFile($extendFile);
302     }
303
304     public function importConfigurationFile($configFile)
305     {
306         if (is_file($configFile) && file_get_contents($configFile)!='') {
307             $builder = new YamlFileConfigurationBuilder([$configFile]);
308             $this->configuration->import($builder->build());
309         }
310     }
311
312     /**
313      * @return array
314      */
315     public function getSites()
316     {
317         if ($this->sites) {
318             return $this->sites;
319         }
320
321         $sitesDirectories = $this->getSitesDirectories();
322         $finder = new Finder();
323         $finder->in($sitesDirectories);
324         $finder->name("*.yml");
325
326         foreach ($finder as $site) {
327             $siteName = $site->getBasename('.yml');
328             $environments = $this->readSite($site->getRealPath());
329
330             if (!$environments || !is_array($environments)) {
331                 continue;
332             }
333
334             foreach ($environments as $environment => $config) {
335                 $site = $siteName . '.' . $environment;
336                 $this->sites[$site] = $config;
337             }
338         }
339
340         return $this->sites;
341     }
342 }