diff --git a/src/applications/herald/management/HeraldWebhookCallManagementWorkflow.php b/src/applications/herald/management/HeraldWebhookCallManagementWorkflow.php index 10249cca68..1b5b21482f 100644 --- a/src/applications/herald/management/HeraldWebhookCallManagementWorkflow.php +++ b/src/applications/herald/management/HeraldWebhookCallManagementWorkflow.php @@ -1,106 +1,154 @@ setName('call') ->setExamples('**call** --id __id__ [--object __object__]') ->setSynopsis(pht('Call a webhook.')) ->setArguments( array( array( 'name' => 'id', 'param' => 'id', 'help' => pht('Webhook ID to call'), ), array( 'name' => 'object', 'param' => 'object', 'help' => pht('Submit transactions for a particular object.'), ), array( 'name' => 'silent', 'help' => pht('Set the "silent" flag on the request.'), ), array( 'name' => 'secure', 'help' => pht('Set the "secure" flag on the request.'), ), + array( + 'name' => 'count', + 'param' => 'N', + 'help' => pht('Make a total of __N__ copies of the call.'), + ), + array( + 'name' => 'background', + 'help' => pht( + 'Instead of making calls in the foreground, add the tasks '. + 'to the daemon queue.'), + ), )); } public function execute(PhutilArgumentParser $args) { $viewer = $this->getViewer(); $id = $args->getArg('id'); if (!$id) { throw new PhutilArgumentUsageException( pht( 'Specify a webhook to call with "--id".')); } + $count = $args->getArg('count'); + if ($count === null) { + $count = 1; + } + + if ($count <= 0) { + throw new PhutilArgumentUsageException( + pht( + 'Specified "--count" must be larger than 0.')); + } + $hook = id(new HeraldWebhookQuery()) ->setViewer($viewer) ->withIDs(array($id)) ->executeOne(); if (!$hook) { throw new PhutilArgumentUsageException( pht( 'Unable to load specified webhook ("%s").', $id)); } $object_name = $args->getArg('object'); if ($object_name === null) { $object = $hook; } else { $objects = id(new PhabricatorObjectQuery()) ->setViewer($viewer) ->withNames(array($object_name)) ->execute(); if (!$objects) { throw new PhutilArgumentUsageException( pht( 'Unable to load specified object ("%s").', $object_name)); } $object = head($objects); } + $is_background = $args->getArg('background'); + $xaction_query = PhabricatorApplicationTransactionQuery::newQueryForObject($object); $xactions = $xaction_query ->withObjectPHIDs(array($object->getPHID())) ->setViewer($viewer) ->setLimit(10) ->execute(); $application_phid = id(new PhabricatorHeraldApplication())->getPHID(); - $request = HeraldWebhookRequest::initializeNewWebhookRequest($hook) - ->setObjectPHID($object->getPHID()) - ->setIsTestAction(true) - ->setIsSilentAction((bool)$args->getArg('silent')) - ->setIsSecureAction((bool)$args->getArg('secure')) - ->setTriggerPHIDs(array($application_phid)) - ->setTransactionPHIDs(mpull($xactions, 'getPHID')) - ->save(); - - PhabricatorWorker::setRunAllTasksInProcess(true); - $request->queueCall(); - - $request->reload(); - - echo tsprintf( - "%s\n", - pht( - 'Success, got HTTP %s from webhook.', - $request->getErrorCode())); + if ($is_background) { + echo tsprintf( + "%s\n", + pht( + 'Queueing webhook calls...')); + $progress_bar = id(new PhutilConsoleProgressBar()) + ->setTotal($count); + } else { + echo tsprintf( + "%s\n", + pht( + 'Calling webhook...')); + PhabricatorWorker::setRunAllTasksInProcess(true); + } + + for ($ii = 0; $ii < $count; $ii++) { + $request = HeraldWebhookRequest::initializeNewWebhookRequest($hook) + ->setObjectPHID($object->getPHID()) + ->setIsTestAction(true) + ->setIsSilentAction((bool)$args->getArg('silent')) + ->setIsSecureAction((bool)$args->getArg('secure')) + ->setTriggerPHIDs(array($application_phid)) + ->setTransactionPHIDs(mpull($xactions, 'getPHID')) + ->save(); + + $request->queueCall(); + + if ($is_background) { + $progress_bar->update(1); + } else { + $request->reload(); + + echo tsprintf( + "%s\n", + pht( + 'Success, got HTTP %s from webhook.', + $request->getErrorCode())); + } + } + + if ($is_background) { + $progress_bar->done(); + } return 0; } }