Differential D25040 Diff 97 src/applications/drydock/management/DrydockManagementReleaseLeaseWorkflow.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/drydock/management/DrydockManagementReleaseLeaseWorkflow.php
Show All 9 Lines | $this | ||||
->setArguments( | ->setArguments( | ||||
array( | array( | ||||
array( | array( | ||||
'name' => 'id', | 'name' => 'id', | ||||
'param' => 'id', | 'param' => 'id', | ||||
'repeat' => true, | 'repeat' => true, | ||||
'help' => pht('Lease ID to release.'), | 'help' => pht('Lease ID to release.'), | ||||
), | ), | ||||
array( | |||||
'name' => 'all', | |||||
'help' => pht('Release all leases. Dangerous!'), | |||||
), | |||||
)); | )); | ||||
} | } | ||||
public function execute(PhutilArgumentParser $args) { | public function execute(PhutilArgumentParser $args) { | ||||
$is_all = $args->getArg('all'); | |||||
$ids = $args->getArg('id'); | $ids = $args->getArg('id'); | ||||
if (!$ids) { | |||||
if (!$ids && !$is_all) { | |||||
throw new PhutilArgumentUsageException( | throw new PhutilArgumentUsageException( | ||||
pht( | pht( | ||||
'Specify one or more lease IDs to release with "%s".', | 'Select which leases you want to release. See "--help" for '. | ||||
'--id')); | 'guidance.')); | ||||
} | } | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID(); | |||||
$leases = id(new DrydockLeaseQuery()) | $statuses = $this->getReleaseableLeaseStatuses(); | ||||
$query = id(new DrydockLeaseQuery()) | |||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withIDs($ids) | ->withStatuses(mpull($statuses, 'getKey')); | ||||
->execute(); | |||||
if ($ids) { | |||||
$query->withIDs($ids); | |||||
} | |||||
$leases = $query->execute(); | |||||
if ($ids) { | |||||
$id_map = mpull($leases, null, 'getID'); | |||||
PhabricatorWorker::setRunAllTasksInProcess(true); | |||||
foreach ($ids as $id) { | foreach ($ids as $id) { | ||||
$lease = idx($leases, $id); | $lease = idx($id_map, $id); | ||||
if (!$lease) { | if (!$lease) { | ||||
throw new PhutilArgumentUsageException( | |||||
pht('Lease "%s" does not exist.', $id)); | |||||
} | |||||
} | |||||
$leases = array_select_keys($id_map, $ids); | |||||
} | |||||
if (!$leases) { | |||||
echo tsprintf( | echo tsprintf( | ||||
"%s\n", | "%s\n", | ||||
pht('Lease "%s" does not exist.', $id)); | pht('No leases selected for release.')); | ||||
continue; | |||||
return 0; | |||||
} | } | ||||
$drydock_phid = id(new PhabricatorDrydockApplication())->getPHID(); | |||||
PhabricatorWorker::setRunAllTasksInProcess(true); | |||||
foreach ($leases as $lease) { | |||||
if (!$lease->canRelease()) { | if (!$lease->canRelease()) { | ||||
echo tsprintf( | echo tsprintf( | ||||
"%s\n", | "%s\n", | ||||
pht('Lease "%s" is not releasable.', $id)); | pht( | ||||
'Lease "%s" is not releasable.', | |||||
$lease->getDisplayName())); | |||||
continue; | continue; | ||||
} | } | ||||
$command = DrydockCommand::initializeNewCommand($viewer) | $command = DrydockCommand::initializeNewCommand($viewer) | ||||
->setTargetPHID($lease->getPHID()) | ->setTargetPHID($lease->getPHID()) | ||||
->setAuthorPHID($drydock_phid) | ->setAuthorPHID($drydock_phid) | ||||
->setCommand(DrydockCommand::COMMAND_RELEASE) | ->setCommand(DrydockCommand::COMMAND_RELEASE) | ||||
->save(); | ->save(); | ||||
$lease->scheduleUpdate(); | $lease->scheduleUpdate(); | ||||
echo tsprintf( | echo tsprintf( | ||||
"%s\n", | "%s\n", | ||||
pht('Scheduled release of lease "%s".', $id)); | pht( | ||||
'Scheduled release of lease "%s".', | |||||
$lease->getDisplayName())); | |||||
} | |||||
} | |||||
private function getReleaseableLeaseStatuses() { | |||||
$statuses = DrydockLeaseStatus::getAllStatuses(); | |||||
foreach ($statuses as $key => $status) { | |||||
$statuses[$key] = DrydockLeaseStatus::newStatusObject($status); | |||||
} | |||||
foreach ($statuses as $key => $status) { | |||||
if (!$status->canRelease()) { | |||||
unset($statuses[$key]); | |||||
} | |||||
} | } | ||||
return $statuses; | |||||
} | } | ||||
} | } |
Content licensed under Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA) unless otherwise noted; code licensed under Apache 2.0 or other open source licenses. · CC BY-SA 4.0 · Apache 2.0