diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php index 2acc8452ea..f3c6be520a 100644 --- a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php +++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php @@ -1,63 +1,104 @@ setName('execute') ->setExamples('**execute** --id __id__') ->setSynopsis( pht( 'Execute a task explicitly. This command ignores leases, is '. 'dangerous, and may cause work to be performed twice.')) - ->setArguments($this->getTaskSelectionArguments()); + ->setArguments( + array_merge( + array( + array( + 'name' => 'retry', + 'help' => pht('Retry archived tasks.'), + ), + array( + 'name' => 'repeat', + 'help' => pht('Repeat archived, successful tasks.'), + ), + ), + $this->getTaskSelectionArguments())); } public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $tasks = $this->loadTasks($args); + $is_retry = $args->getArg('retry'); + $is_repeat = $args->getArg('repeat'); + foreach ($tasks as $task) { $can_execute = !$task->isArchived(); if (!$can_execute) { - $console->writeOut( + if (!$is_retry) { + $console->writeOut( + "** %s ** %s\n", + pht('ARCHIVED'), + pht( + '%s is already archived, and will not be executed. '. + 'Use "--retry" to execute archived tasks.', + $this->describeTask($task))); + continue; + } + + $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS; + if ($task->getResult() == $result_success) { + if (!$is_repeat) { + $console->writeOut( + "** %s ** %s\n", + pht('SUCCEEDED'), + pht( + '%s has already succeeded, and will not be retried. '. + 'Use "--repeat" to repeat successful tasks.', + $this->describeTask($task))); + continue; + } + } + + echo tsprintf( "** %s ** %s\n", pht('ARCHIVED'), pht( - '%s is already archived, and can not be executed.', + 'Unarchiving %s.', $this->describeTask($task))); - continue; + + $task = $task->unarchiveTask(); } // NOTE: This ignores leases, maybe it should respect them without // a parameter like --force? $task->setLeaseOwner(null); $task->setLeaseExpires(PhabricatorTime::getNow()); $task->save(); $task_data = id(new PhabricatorWorkerTaskData())->loadOneWhere( 'id = %d', $task->getDataID()); $task->setData($task_data->getData()); echo tsprintf( "%s\n", pht( 'Executing task %d (%s)...', $task->getID(), $task->getTaskClass())); $task = $task->executeTask(); $ex = $task->getExecutionException(); if ($ex) { throw $ex; } } return 0; } } diff --git a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php index 6dbebd168d..538a70add8 100644 --- a/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php +++ b/src/infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php @@ -1,57 +1,69 @@ setName('retry') ->setExamples('**retry** --id __id__') ->setSynopsis( pht( 'Retry selected tasks which previously failed permanently or '. - 'were cancelled. Only archived, unsuccessful tasks can be '. - 'retried.')) - ->setArguments($this->getTaskSelectionArguments()); + 'were cancelled. Only archived tasks can be retried.')) + ->setArguments( + array_merge( + array( + array( + 'name' => 'repeat', + 'help' => pht( + 'Repeat tasks which already completed successfully.'), + ), + ), + $this->getTaskSelectionArguments())); } public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $tasks = $this->loadTasks($args); + $is_repeat = $args->getArg('repeat'); foreach ($tasks as $task) { if (!$task->isArchived()) { $console->writeOut( "** %s ** %s\n", pht('ACTIVE'), pht( '%s is already in the active task queue.', $this->describeTask($task))); continue; } $result_success = PhabricatorWorkerArchiveTask::RESULT_SUCCESS; if ($task->getResult() == $result_success) { - $console->writeOut( - "** %s ** %s\n", - pht('SUCCEEDED'), - pht( - '%s has already succeeded, and can not be retried.', - $this->describeTask($task))); - continue; + if (!$is_repeat) { + $console->writeOut( + "** %s ** %s\n", + pht('SUCCEEDED'), + pht( + '%s has already succeeded, and will not be repeated. '. + 'Use "--repeat" to repeat successful tasks.', + $this->describeTask($task))); + continue; + } } $task->unarchiveTask(); $console->writeOut( "** %s ** %s\n", pht('QUEUED'), pht( '%s was queued for retry.', $this->describeTask($task))); } return 0; } }