mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-15 19:32:40 +01:00
f60548d081
Summary: Ref T9952. Default the branch target in the dialog to be whatever branch is the default branch for the repository. This will be correct for repositories like ours (which land everything into `master`) and correct most of the time for repositories which have some other "primary" branch (maybe `development`). It won't be great if there are multiple open lines of development in a repository (for example, some changes go to `newdesignpro` and some changes go to `legacy-1.2`). I'll do work in T3462 next to improve those cases so we can pick a better default. Test Plan: - Saw dialog default to "master". - Changed repo default branch, saw it default to "notmaster" instead. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9952 Differential Revision: https://secure.phabricator.com/D14734
152 lines
4.4 KiB
PHP
152 lines
4.4 KiB
PHP
<?php
|
|
|
|
final class DifferentialRevisionOperationController
|
|
extends DifferentialController {
|
|
|
|
public function handleRequest(AphrontRequest $request) {
|
|
$viewer = $this->getViewer();
|
|
$id = $request->getURIData('id');
|
|
|
|
$revision = id(new DifferentialRevisionQuery())
|
|
->withIDs(array($id))
|
|
->setViewer($viewer)
|
|
->needActiveDiffs(true)
|
|
->executeOne();
|
|
if (!$revision) {
|
|
return new Aphront404Response();
|
|
}
|
|
|
|
$detail_uri = "/D{$id}";
|
|
|
|
$op = new DrydockLandRepositoryOperation();
|
|
$barrier = $op->getBarrierToLanding($viewer, $revision);
|
|
if ($barrier) {
|
|
return $this->newDialog()
|
|
->setTitle($barrier['title'])
|
|
->appendParagraph($barrier['body'])
|
|
->addCancelButton($detail_uri);
|
|
}
|
|
|
|
$diff = $revision->getActiveDiff();
|
|
$repository = $revision->getRepository();
|
|
|
|
$default_ref = $this->loadDefaultRef($repository);
|
|
|
|
if ($default_ref) {
|
|
$v_ref = array($default_ref->getPHID());
|
|
} else {
|
|
$v_ref = array();
|
|
}
|
|
|
|
$e_ref = true;
|
|
|
|
$errors = array();
|
|
if ($request->isFormPost()) {
|
|
|
|
$v_ref = $request->getArr('refPHIDs');
|
|
$ref_phid = head($v_ref);
|
|
if (!strlen($ref_phid)) {
|
|
$e_ref = pht('Required');
|
|
$errors[] = pht(
|
|
'You must select a branch to land this revision onto.');
|
|
} else {
|
|
$ref = $this->newRefQuery($repository)
|
|
->withPHIDs(array($ref_phid))
|
|
->executeOne();
|
|
if (!$ref) {
|
|
$e_ref = pht('Invalid');
|
|
$errors[] = pht(
|
|
'You must select a branch from this repository to land this '.
|
|
'revision onto.');
|
|
}
|
|
}
|
|
|
|
if (!$errors) {
|
|
// NOTE: The operation is locked to the current active diff, so if the
|
|
// revision is updated before the operation applies nothing sneaky
|
|
// occurs.
|
|
|
|
$target = 'branch:'.$ref->getRefName();
|
|
|
|
$operation = DrydockRepositoryOperation::initializeNewOperation($op)
|
|
->setAuthorPHID($viewer->getPHID())
|
|
->setObjectPHID($revision->getPHID())
|
|
->setRepositoryPHID($repository->getPHID())
|
|
->setRepositoryTarget($target)
|
|
->setProperty('differential.diffPHID', $diff->getPHID());
|
|
|
|
$operation->save();
|
|
$operation->scheduleUpdate();
|
|
|
|
return id(new AphrontRedirectResponse())
|
|
->setURI($detail_uri);
|
|
}
|
|
}
|
|
|
|
$ref_datasource = id(new DiffusionRefDatasource())
|
|
->setParameters(
|
|
array(
|
|
'repositoryPHIDs' => array($repository->getPHID()),
|
|
'refTypes' => $this->getTargetableRefTypes(),
|
|
));
|
|
|
|
$form = id(new AphrontFormView())
|
|
->setUser($viewer)
|
|
->appendRemarkupInstructions(
|
|
pht(
|
|
'In theory, this will do approximately what `arc land` would do. '.
|
|
'In practice, you will have a riveting adventure instead.'))
|
|
->appendControl(
|
|
id(new AphrontFormTokenizerControl())
|
|
->setLabel(pht('Onto Branch'))
|
|
->setName('refPHIDs')
|
|
->setLimit(1)
|
|
->setError($e_ref)
|
|
->setValue($v_ref)
|
|
->setDatasource($ref_datasource))
|
|
->appendRemarkupInstructions(
|
|
pht(
|
|
'(WARNING) THIS FEATURE IS EXPERIMENTAL AND DANGEROUS! USE IT AT '.
|
|
'YOUR OWN RISK!'));
|
|
|
|
return $this->newDialog()
|
|
->setWidth(AphrontDialogView::WIDTH_FORM)
|
|
->setTitle(pht('Land Revision'))
|
|
->setErrors($errors)
|
|
->appendForm($form)
|
|
->addCancelButton($detail_uri)
|
|
->addSubmitButton(pht('Mutate Repository Unpredictably'));
|
|
}
|
|
|
|
private function newRefQuery(PhabricatorRepository $repository) {
|
|
$viewer = $this->getViewer();
|
|
|
|
return id(new PhabricatorRepositoryRefCursorQuery())
|
|
->setViewer($viewer)
|
|
->withRepositoryPHIDs(array($repository->getPHID()))
|
|
->withRefTypes($this->getTargetableRefTypes());
|
|
}
|
|
|
|
private function getTargetableRefTypes() {
|
|
return array(
|
|
PhabricatorRepositoryRefCursor::TYPE_BRANCH,
|
|
);
|
|
}
|
|
|
|
private function loadDefaultRef(PhabricatorRepository $repository) {
|
|
$default_name = $this->getDefaultRefName($repository);
|
|
|
|
if (!strlen($default_name)) {
|
|
return null;
|
|
}
|
|
|
|
return $this->newRefQuery($repository)
|
|
->withRefNames(array($default_name))
|
|
->executeOne();
|
|
}
|
|
|
|
private function getDefaultRefName(PhabricatorRepository $repository) {
|
|
return $repository->getDefaultBranch();
|
|
}
|
|
|
|
}
|