protected function fire()
{
$tasks = $this->craft->tasks->getAllTasks();
if (!$tasks) {
$this->info('No pending tasks.');
return;
}
foreach ($tasks as $task) {
if ($task->status === TaskStatus::Running) {
if ($this->option('reset-running')) {
$this->resetTask($task);
} else {
continue;
}
}
if ($task->status === TaskStatus::Error) {
if ($this->option('reset-failed')) {
$this->resetTask($task);
} else {
continue;
}
}
try {
$taskRecord = TaskRecord::model()->findById($task->id);
$taskType = $task->getTaskType();
if (!$taskType) {
throw new Exception('Could not find task type for task ID ' . $task->id);
}
$task->totalSteps = $taskType->getTotalSteps();
$task->status = TaskStatus::Running;
$progressBar = new ProgressBar($this->output, $task->totalSteps);
$this->info($task->description);
for ($step = 0; $step < $task->totalSteps; $step++) {
$task->currentStep = $step + 1;
$this->craft->tasks->saveTask($task);
$result = $taskType->runStep($step);
if ($result !== true) {
$error = is_string($result) ? $result : 'Unknown error';
$progressBar->finish();
$this->line('');
throw new Exception($error);
}
$progressBar->setProgress($task->currentStep);
}
$taskRecord->deleteNode();
$progressBar->finish();
$this->line('');
} catch (Exception $e) {
$this->failTask($task);
$this->error($e->getMessage());
}
}
$this->info('All tasks finished.');
}