Differential D7892 Diff 17874 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); | |||||
} | |||||
} |