diff --git a/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php b/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php --- a/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php +++ b/src/applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php @@ -32,6 +32,12 @@ 'name' => 'force', 'help' => pht('Run operations without asking for confirmation.'), ), + array( + 'name' => 'all-repositories', + 'help' => pht( + 'Apply the promotion or demotion to all repositories hosted '. + 'on the device.'), + ), array( 'name' => 'repositories', 'wildcard' => true, @@ -42,12 +48,6 @@ public function execute(PhutilArgumentParser $args) { $viewer = $this->getViewer(); - $repositories = $this->loadRepositories($args, 'repositories'); - if (!$repositories) { - throw new PhutilArgumentUsageException( - pht('Specify one or more repositories to thaw.')); - } - $promote = $args->getArg('promote'); $demote = $args->getArg('demote'); @@ -72,6 +72,60 @@ pht('No device "%s" exists.', $device_name)); } + $repository_names = $args->getArg('repositories'); + $all_repositories = $args->getArg('all-repositories'); + if ($repository_names && $all_repositories) { + throw new PhutilArgumentUsageException( + pht( + 'Specify a list of repositories or "--all-repositories", '. + 'but not both.')); + } else if (!$repository_names && !$all_repositories) { + throw new PhutilArgumentUsageException( + pht( + 'Select repositories to affect by providing a list of repositories '. + 'or using the "--all-repositories" flag.')); + } + + if ($repository_names) { + $repositories = $this->loadRepositories($args, 'repositories'); + if (!$repositories) { + throw new PhutilArgumentUsageException( + pht('Specify one or more repositories to thaw.')); + } + } else { + $repositories = array(); + + $services = id(new AlmanacServiceQuery()) + ->setViewer($viewer) + ->withDevicePHIDs(array($device->getPHID())) + ->execute(); + if ($services) { + $repositories = id(new PhabricatorRepositoryQuery()) + ->setViewer($viewer) + ->withAlmanacServicePHIDs(mpull($services, 'getPHID')) + ->execute(); + } + + if (!$repositories) { + throw new PhutilArgumentUsageException( + pht('There are no repositories on the selected device.')); + } + } + + $display_list = new PhutilConsoleList(); + foreach ($repositories as $repository) { + $display_list->addItem( + pht( + '%s %s', + $repository->getMonogram(), + $repository->getName())); + } + + echo tsprintf( + "%s\n\n%B\n", + pht('These repositories will be thawed:'), + $display_list->drawConsoleString()); + if ($promote) { $risk_message = pht( 'Promoting a device can cause the loss of any repository data which '.