private function renderRevisionAction(PhutilEvent $event) { $viewer = $event->getUser(); if (!$this->canUseApplication($viewer)) { return null; } $revision = $event->getValue('object'); $repository = $revision->getRepository(); if ($repository === null) { return null; } if ($repository->canPerformAutomation()) { $revision_id = $revision->getID(); $op = new DrydockLandRepositoryOperation(); $barrier = $op->getBarrierToLanding($viewer, $revision); if ($barrier) { $can_land = false; } else { $can_land = true; } $action = id(new PhabricatorActionView())->setName(pht('Land Revision'))->setIcon('fa-fighter-jet')->setHref("/differential/revision/operation/{$revision_id}/")->setWorkflow(true)->setDisabled(!$can_land); $this->addActionMenuItems($event, $action); } $strategies = id(new PhutilClassMapQuery())->setAncestorClass('DifferentialLandingStrategy')->execute(); foreach ($strategies as $strategy) { $action = $strategy->createMenuItem($viewer, $revision, $repository); if ($action == null) { continue; } if ($strategy->isActionDisabled($viewer, $revision, $repository)) { $action->setDisabled(true); } $this->addActionMenuItems($event, $action); } }
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, $diff); 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')); }