public function run($tasks, $servers, $environments, $input, $output)
{
$output = new OutputWatcher($output);
$informer = new Informer($output);
$localhost = new Local();
$localEnv = new Environment();
foreach ($tasks as $task) {
$success = true;
$informer->startTask($task->getName());
if ($task->isOnce()) {
$task->run(new Context($localhost, $localEnv, $input, $output));
} else {
foreach ($servers as $serverName => $server) {
if ($task->isOnServer($serverName)) {
$env = isset($environments[$serverName]) ? $environments[$serverName] : ($environments[$serverName] = new Environment());
try {
$task->run(new Context($server, $env, $input, $output));
} catch (NonFatalException $exception) {
$success = false;
$informer->taskException($serverName, 'Deployer\\Exception\\NonFatalException', $exception->getMessage());
}
$informer->endOnServer($serverName);
}
}
}
if ($success) {
$informer->endTask();
} else {
$informer->taskError();
}
}
}