Differential D7892 Diff 17872 src/applications/harbormaster/controller/HarbormasterBuildActionController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/harbormaster/controller/HarbormasterBuildActionController.php
- This file was added.
| <?php | |||||
| final class HarbormasterBuildActionController | |||||
| extends HarbormasterController { | |||||
| private $id; | |||||
| private $action; | |||||
| public function willProcessRequest(array $data) { | |||||
| $this->id = $data['id']; | |||||
| $this->action = $data['action']; | |||||
| } | |||||
| public function processRequest() { | |||||
| $request = $this->getRequest(); | |||||
| $viewer = $request->getUser(); | |||||
| $command = $this->action; | |||||
| $build = id(new HarbormasterBuildQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withIDs(array($this->id)) | |||||
| ->executeOne(); | |||||
| if (!$build) { | |||||
| return new Aphront404Response(); | |||||
| } | |||||
| switch ($command) { | |||||
| case HarbormasterBuildCommand::COMMAND_RESTART: | |||||
| $can_issue = $build->canRestartBuild(); | |||||
| break; | |||||
| case HarbormasterBuildCommand::COMMAND_STOP: | |||||
| $can_issue = $build->canStopBuild(); | |||||
| break; | |||||
| case HarbormasterBuildCommand::COMMAND_RESUME: | |||||
| $can_issue = $build->canResumeBuild(); | |||||
| break; | |||||
| default: | |||||
| return new Aphront400Response(); | |||||
| } | |||||
| $build_uri = $this->getApplicationURI('/build/'.$build->getID().'/'); | |||||
| if ($request->isDialogFormPost() && $can_issue) { | |||||
| // Issue the new build command. | |||||
| id(new HarbormasterBuildCommand()) | |||||
| ->setAuthorPHID($viewer->getPHID()) | |||||
| ->setTargetPHID($build->getPHID()) | |||||
| ->setCommand($command) | |||||
| ->save(); | |||||
| // Schedule a build update. We may already have stuff in queue (in which | |||||
| // case this will just no-op), but we might also be dealing with a | |||||
| // stopped build, which won't restart unless we deal with this. | |||||
| PhabricatorWorker::scheduleTask( | |||||
| 'HarbormasterBuildWorker', | |||||
| array( | |||||
| 'buildID' => $build->getID() | |||||
| )); | |||||
| return id(new AphrontRedirectResponse())->setURI($build_uri); | |||||
| } | |||||
| switch ($command) { | |||||
| case HarbormasterBuildCommand::COMMAND_RESTART: | |||||
| if ($can_issue) { | |||||
| $title = pht('Really restart build?'); | |||||
| $body = pht( | |||||
| 'Progress on this build will be discarded and the build will '. | |||||
| 'restart. Side effects of the build will occur again. Really '. | |||||
| 'restart build?'); | |||||
| $submit = pht('Restart Build'); | |||||
| } else { | |||||
| $title = pht('Unable to Restart Build'); | |||||
| if ($build->isRestarting()) { | |||||
| $body = pht( | |||||
| 'This build is already restarting. You can not reissue a '. | |||||
| 'restart command to a restarting build.'); | |||||
| } else { | |||||
| $body = pht( | |||||
| 'You can not restart this build.'); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case HarbormasterBuildCommand::COMMAND_STOP: | |||||
| if ($can_issue) { | |||||
| $title = pht('Really stop build?'); | |||||
| $body = pht( | |||||
| 'If you stop this build, work will halt once the current steps '. | |||||
| 'complete. You can resume the build later.'); | |||||
| $submit = pht('Stop Build'); | |||||
| } else { | |||||
| $title = pht('Unable to Stop Build'); | |||||
| if ($build->isComplete()) { | |||||
| $body = pht( | |||||
| 'This build is already complete. You can not stop a completed '. | |||||
| 'build.'); | |||||
| } else if ($build->isStopped()) { | |||||
| $body = pht( | |||||
| 'This build is already stopped. You can not stop a build which '. | |||||
| 'has already been stopped.'); | |||||
| } else if ($build->isStopping()) { | |||||
| $body = pht( | |||||
| 'This build is already stopping. You can not reissue a stop '. | |||||
| 'command to a stopping build.'); | |||||
| } else { | |||||
| $body = pht( | |||||
| 'This build can not be stopped.'); | |||||
| } | |||||
| } | |||||
| break; | |||||
| case HarbormasterBuildCommand::COMMAND_RESUME: | |||||
| if ($can_issue) { | |||||
| $title = pht('Really resume build?'); | |||||
| $body = pht( | |||||
| 'Work will continue on the build. Really resume?'); | |||||
| $submit = pht('Resume Build'); | |||||
| } else { | |||||
| $title = pht('Unable to Resume Build'); | |||||
| if ($build->isResuming()) { | |||||
| $body = pht( | |||||
| 'This build is already resuming. You can not reissue a resume '. | |||||
| 'command to a resuming build.'); | |||||
| } else if (!$build->isStopped()) { | |||||
| $body = pht( | |||||
| 'This build is not stopped. You can only resume a stopped '. | |||||
| 'build.'); | |||||
| } | |||||
| } | |||||
| break; | |||||
| } | |||||
| $dialog = id(new AphrontDialogView()) | |||||
| ->setUser($viewer) | |||||
| ->setTitle($title) | |||||
| ->appendChild($body) | |||||
| ->addCancelButton($build_uri); | |||||
| if ($can_issue) { | |||||
| $dialog->addSubmitButton($submit); | |||||
| } | |||||
| return id(new AphrontDialogResponse())->setDialog($dialog); | |||||
| } | |||||
| } | |||||