-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
SelectCommand.php
89 lines (80 loc) · 3.25 KB
/
SelectCommand.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php declare(strict_types=1);
/* (c) Anton Medvedev <anton@medv.io>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Deployer\Command;
use Deployer\Deployer;
use Deployer\Exception\ConfigurationException;
use Deployer\Exception\Exception;
use Deployer\Host\Host;
use Deployer\Host\Localhost;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
use Symfony\Component\Console\Helper\QuestionHelper;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface as Input;
use Symfony\Component\Console\Output\OutputInterface as Output;
use Symfony\Component\Console\Question\ChoiceQuestion;
use function Deployer\localhost;
abstract class SelectCommand extends Command
{
protected $deployer;
public function __construct(string $name, Deployer $deployer)
{
$this->deployer = $deployer;
parent::__construct($name);
}
protected function configure()
{
$this->addArgument('selector', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Host selector');
}
/**
* @return Host[]
*/
protected function selectHosts(Input $input, Output $output): array
{
$output->getFormatter()->setStyle('success', new OutputFormatterStyle('green'));
if (!$output->isDecorated() && !defined('NO_ANSI')) {
define('NO_ANSI', 'true');
}
$selector = $input->getArgument('selector');
$selectExpression = is_array($selector) ? implode(',', $selector) : $selector;
if (empty($selectExpression)) {
if (count($this->deployer->hosts) === 0) {
throw new ConfigurationException("No host configured.\nSpecify at least one host: `localhost();`.");
} else if (count($this->deployer->hosts) === 1) {
$hosts = $this->deployer->hosts->all();
} else if ($input->isInteractive()) {
$hostsAliases = [];
foreach ($this->deployer->hosts as $host) {
$hostsAliases[] = $host->getAlias();
}
/** @var QuestionHelper $helper */
$helper = $this->getHelper('question');
$question = new ChoiceQuestion(
'<question>Select hosts:</question> (comma separated)',
$hostsAliases
);
$question->setMultiselect(true);
$question->setErrorMessage('There is no "%s" host.');
$answer = $helper->ask($input, $output, $question);
$answer = array_unique($answer);
$hosts = $this->deployer->hosts->select(function (Host $host) use ($answer) {
return in_array($host->getAlias(), $answer, true);
});
}
} else {
$hosts = $this->deployer->selector->select($selectExpression);
}
if (empty($hosts)) {
$message = 'No host selected.';
if (!empty($selectExpression)) {
$message .= " Please, check your selector:\n\n $selectExpression";
}
throw new Exception($message);
}
return $hosts;
}
}