Path: blob/master/src/applications/differential/controller/DifferentialDiffCreateController.php
12256 views
<?php12final class DifferentialDiffCreateController extends DifferentialController {34public function handleRequest(AphrontRequest $request) {5$viewer = $this->getViewer();67// If we're on the "Update Diff" workflow, load the revision we're going8// to update.9$revision = null;10$revision_id = $request->getURIData('revisionID');11if ($revision_id) {12$revision = id(new DifferentialRevisionQuery())13->setViewer($viewer)14->withIDs(array($revision_id))15->requireCapabilities(16array(17PhabricatorPolicyCapability::CAN_VIEW,18PhabricatorPolicyCapability::CAN_EDIT,19))20->executeOne();21if (!$revision) {22return new Aphront404Response();23}24}2526$diff = null;27// This object is just for policy stuff28$diff_object = DifferentialDiff::initializeNewDiff($viewer);2930if ($revision) {31$repository_phid = $revision->getRepositoryPHID();32} else {33$repository_phid = null;34}3536$errors = array();37$e_diff = null;38$e_file = null;39$validation_exception = null;40if ($request->isFormPost()) {4142$repository_tokenizer = $request->getArr(43id(new DifferentialRepositoryField())->getFieldKey());44if ($repository_tokenizer) {45$repository_phid = reset($repository_tokenizer);46}4748if ($request->getFileExists('diff-file')) {49$diff = PhabricatorFile::readUploadedFileData($_FILES['diff-file']);50} else {51$diff = $request->getStr('diff');52}5354if (!strlen($diff)) {55$errors[] = pht(56'You can not create an empty diff. Paste a diff or upload a '.57'file containing a diff.');58$e_diff = pht('Required');59$e_file = pht('Required');60}6162if (!$errors) {63try {64$call = new ConduitCall(65'differential.createrawdiff',66array(67'diff' => $diff,68'repositoryPHID' => $repository_phid,69'viewPolicy' => $request->getStr('viewPolicy'),70));71$call->setUser($viewer);72$result = $call->execute();7374$diff_id = $result['id'];7576$uri = $this->getApplicationURI("diff/{$diff_id}/");77$uri = new PhutilURI($uri);78if ($revision) {79$uri->replaceQueryParam('revisionID', $revision->getID());80}8182return id(new AphrontRedirectResponse())->setURI($uri);83} catch (PhabricatorApplicationTransactionValidationException $ex) {84$validation_exception = $ex;85}86}87}8889$form = new AphrontFormView();90$arcanist_href = PhabricatorEnv::getDoclink('Arcanist User Guide');91$arcanist_link = phutil_tag(92'a',93array(94'href' => $arcanist_href,95'target' => '_blank',96),97pht('Learn More'));9899$cancel_uri = $this->getApplicationURI();100101$policies = id(new PhabricatorPolicyQuery())102->setViewer($viewer)103->setObject($diff_object)104->execute();105106$info_view = null;107if (!$request->isFormPost()) {108$info_view = id(new PHUIInfoView())109->setSeverity(PHUIInfoView::SEVERITY_NOTICE)110->setErrors(111array(112array(113pht(114'The best way to create a diff is to use the %s '.115'command-line tool.',116PlatformSymbols::getPlatformClientName()),117' ',118$arcanist_link,119),120pht(121'You can also paste a diff above, or upload a file '.122'containing a diff (for example, from %s, %s or %s).',123phutil_tag('tt', array(), 'svn diff'),124phutil_tag('tt', array(), 'git diff'),125phutil_tag('tt', array(), 'hg diff --git')),126));127}128129if ($revision) {130$title = pht('Update Diff');131$header = pht('Update Diff');132$button = pht('Continue');133$header_icon = 'fa-upload';134} else {135$title = pht('Create Diff');136$header = pht('Create New Diff');137$button = pht('Create Diff');138$header_icon = 'fa-plus-square';139}140141$form142->setEncType('multipart/form-data')143->setUser($viewer);144145if ($revision) {146$form->appendChild(147id(new AphrontFormMarkupControl())148->setLabel(pht('Updating Revision'))149->setValue($viewer->renderHandle($revision->getPHID())));150}151152if ($repository_phid) {153$repository_value = array($repository_phid);154} else {155$repository_value = array();156}157158$form159->appendChild(160id(new AphrontFormTextAreaControl())161->setLabel(pht('Raw Diff'))162->setName('diff')163->setValue($diff)164->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_TALL)165->setError($e_diff))166->appendChild(167id(new AphrontFormFileControl())168->setLabel(pht('Raw Diff From File'))169->setName('diff-file')170->setError($e_file))171->appendControl(172id(new AphrontFormTokenizerControl())173->setName(id(new DifferentialRepositoryField())->getFieldKey())174->setLabel(pht('Repository'))175->setDatasource(new DiffusionRepositoryDatasource())176->setValue($repository_value)177->setLimit(1))178->appendChild(179id(new AphrontFormPolicyControl())180->setUser($viewer)181->setName('viewPolicy')182->setPolicyObject($diff_object)183->setPolicies($policies)184->setCapability(PhabricatorPolicyCapability::CAN_VIEW))185->appendChild(186id(new AphrontFormSubmitControl())187->addCancelButton($cancel_uri)188->setValue($button));189190$form_box = id(new PHUIObjectBoxView())191->setHeaderText($title)192->setValidationException($validation_exception)193->setForm($form)194->setBackground(PHUIObjectBoxView::WHITE_CONFIG)195->setFormErrors($errors);196197$crumbs = $this->buildApplicationCrumbs();198if ($revision) {199$crumbs->addTextCrumb(200$revision->getMonogram(),201'/'.$revision->getMonogram());202}203$crumbs->addTextCrumb($title);204$crumbs->setBorder(true);205206$view = id(new PHUITwoColumnView())207->setFooter(array(208$form_box,209$info_view,210));211212return $this->newPage()213->setTitle($title)214->setCrumbs($crumbs)215->appendChild($view);216}217218}219220221