Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/differential/controller/DifferentialRevisionOperationController.php b/src/applications/differential/controller/DifferentialRevisionOperationController.php
index a5d5b5f98f..b10bab341d 100644
--- a/src/applications/differential/controller/DifferentialRevisionOperationController.php
+++ b/src/applications/differential/controller/DifferentialRevisionOperationController.php
@@ -1,67 +1,118 @@
<?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();
+
+ $ref_types = array(
+ PhabricatorRepositoryRefCursor::TYPE_BRANCH,
+ );
+
+ $e_ref = true;
+
+ $errors = array();
if ($request->isFormPost()) {
- // NOTE: The operation is locked to the current active diff, so if the
- // revision is updated before the operation applies nothing sneaky
- // occurs.
- $diff = $revision->getActiveDiff();
- $repository = $revision->getRepository();
+ $ref_phid = head($request->getArr('refPHIDs'));
+ if (!strlen($ref_phid)) {
+ $e_ref = pht('Required');
+ $errors[] = pht(
+ 'You must select a branch to land this revision onto.');
+ } else {
+ $ref = id(new PhabricatorRepositoryRefCursorQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($ref_phid))
+ ->withRepositoryPHIDs(array($repository->getPHID()))
+ ->withRefTypes($ref_types)
+ ->executeOne();
+ if (!$ref) {
+ $e_ref = pht('Invalid');
+ $errors[] = pht(
+ 'You must select a branch from this repository to land this '.
+ 'revision onto.');
+ }
+ }
- $operation = DrydockRepositoryOperation::initializeNewOperation($op)
- ->setAuthorPHID($viewer->getPHID())
- ->setObjectPHID($revision->getPHID())
- ->setRepositoryPHID($repository->getPHID())
- ->setRepositoryTarget('branch:master')
- ->setProperty('differential.diffPHID', $diff->getPHID());
+ 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.
- $operation->save();
- $operation->scheduleUpdate();
+ $target = 'branch:'.$ref->getRefName();
- return id(new AphrontRedirectResponse())
- ->setURI($detail_uri);
+ $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);
+ }
}
- return $this->newDialog()
- ->setTitle(pht('Land Revision'))
- ->appendParagraph(
+ $ref_datasource = id(new DiffusionRefDatasource())
+ ->setParameters(
+ array(
+ 'repositoryPHIDs' => array($repository->getPHID()),
+ 'refTypes' => $ref_types,
+ ));
+
+ $form = id(new AphrontFormView())
+ ->setUser($viewer)
+ ->appendRemarkupInstructions(
pht(
'In theory, this will do approximately what `arc land` would do. '.
- 'In practice, that is almost certainly not what it will actually '.
- 'do.'))
- ->appendParagraph(
+ 'In practice, you will have a riveting adventure instead.'))
+ ->appendControl(
+ id(new AphrontFormTokenizerControl())
+ ->setLabel(pht('Onto Branch'))
+ ->setName('refPHIDs')
+ ->setLimit(1)
+ ->setError($e_ref)
+ ->setDatasource($ref_datasource))
+ ->appendRemarkupInstructions(
pht(
- 'THIS FEATURE IS EXPERIMENTAL AND DANGEROUS! USE IT AT YOUR '.
- 'OWN RISK!'))
+ '(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'));
}
}
diff --git a/src/applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php b/src/applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php
index 174051e5b6..30fbc4b6ae 100644
--- a/src/applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php
+++ b/src/applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php
@@ -1,42 +1,46 @@
<?php
final class PhabricatorRepositoryRefCursorPHIDType
extends PhabricatorPHIDType {
const TYPECONST = 'RREF';
public function getTypeName() {
return pht('Repository Ref');
}
+ public function getTypeIcon() {
+ return 'fa-code-fork';
+ }
+
public function newObject() {
return new PhabricatorRepositoryRefCursor();
}
public function getPHIDTypeApplicationClass() {
return 'PhabricatorDiffusionApplication';
}
protected function buildQueryForObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new PhabricatorRepositoryRefCursorQuery())
->withPHIDs($phids);
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$ref = $objects[$phid];
$name = $ref->getRefName();
$handle->setName($name);
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Tue, Dec 2, 6:13 AM (1 d, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
431686
Default Alt Text
(6 KB)

Event Timeline