[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class DifferentialRevisionEditController 4 extends DifferentialController { 5 6 private $id; 7 8 public function willProcessRequest(array $data) { 9 $this->id = idx($data, 'id'); 10 } 11 12 public function processRequest() { 13 $request = $this->getRequest(); 14 $viewer = $request->getUser(); 15 16 if (!$this->id) { 17 $this->id = $request->getInt('revisionID'); 18 } 19 20 if ($this->id) { 21 $revision = id(new DifferentialRevisionQuery()) 22 ->setViewer($viewer) 23 ->withIDs(array($this->id)) 24 ->needRelationships(true) 25 ->needReviewerStatus(true) 26 ->needActiveDiffs(true) 27 ->requireCapabilities( 28 array( 29 PhabricatorPolicyCapability::CAN_VIEW, 30 PhabricatorPolicyCapability::CAN_EDIT, 31 )) 32 ->executeOne(); 33 if (!$revision) { 34 return new Aphront404Response(); 35 } 36 } else { 37 $revision = DifferentialRevision::initializeNewRevision($viewer); 38 $revision->attachReviewerStatus(array()); 39 } 40 41 $diff_id = $request->getInt('diffID'); 42 if ($diff_id) { 43 $diff = id(new DifferentialDiffQuery()) 44 ->setViewer($viewer) 45 ->withIDs(array($diff_id)) 46 ->executeOne(); 47 if (!$diff) { 48 return new Aphront404Response(); 49 } 50 if ($diff->getRevisionID()) { 51 // TODO: Redirect? 52 throw new Exception('This diff is already attached to a revision!'); 53 } 54 } else { 55 $diff = null; 56 } 57 58 if (!$diff) { 59 if (!$revision->getID()) { 60 throw new Exception( 61 pht('You can not create a new revision without a diff!')); 62 } 63 } else { 64 // TODO: It would be nice to show the diff being attached in the UI. 65 } 66 67 $field_list = PhabricatorCustomField::getObjectFields( 68 $revision, 69 PhabricatorCustomField::ROLE_EDIT); 70 $field_list 71 ->setViewer($viewer) 72 ->readFieldsFromStorage($revision); 73 74 if ($request->getStr('viaDiffView') && $diff) { 75 $repo_key = id(new DifferentialRepositoryField())->getFieldKey(); 76 $repository_field = idx( 77 $field_list->getFields(), 78 $repo_key); 79 if ($repository_field) { 80 $repository_field->setValue($request->getStr($repo_key)); 81 } 82 $view_policy_key = id(new DifferentialViewPolicyField())->getFieldKey(); 83 $view_policy_field = idx( 84 $field_list->getFields(), 85 $view_policy_key); 86 if ($view_policy_field) { 87 $view_policy_field->setValue($diff->getViewPolicy()); 88 } 89 } 90 91 $validation_exception = null; 92 if ($request->isFormPost() && !$request->getStr('viaDiffView')) { 93 94 $editor = id(new DifferentialTransactionEditor()) 95 ->setActor($viewer) 96 ->setContentSourceFromRequest($request) 97 ->setContinueOnNoEffect(true); 98 99 $xactions = $field_list->buildFieldTransactionsFromRequest( 100 new DifferentialTransaction(), 101 $request); 102 103 if ($diff) { 104 $repository_phid = null; 105 $repository_tokenizer = $request->getArr( 106 id(new DifferentialRepositoryField())->getFieldKey()); 107 if ($repository_tokenizer) { 108 $repository_phid = reset($repository_tokenizer); 109 } 110 111 $xactions[] = id(new DifferentialTransaction()) 112 ->setTransactionType(DifferentialTransaction::TYPE_UPDATE) 113 ->setNewValue($diff->getPHID()); 114 115 $editor->setRepositoryPHIDOverride($repository_phid); 116 } 117 118 $comments = $request->getStr('comments'); 119 if (strlen($comments)) { 120 $xactions[] = id(new DifferentialTransaction()) 121 ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 122 ->attachComment( 123 id(new DifferentialTransactionComment()) 124 ->setContent($comments)); 125 } 126 127 try { 128 $editor->applyTransactions($revision, $xactions); 129 $revision_uri = '/D'.$revision->getID(); 130 return id(new AphrontRedirectResponse())->setURI($revision_uri); 131 } catch (PhabricatorApplicationTransactionValidationException $ex) { 132 $validation_exception = $ex; 133 } 134 } 135 136 137 $form = new AphrontFormView(); 138 $form->setUser($request->getUser()); 139 if ($diff) { 140 $form->addHiddenInput('diffID', $diff->getID()); 141 } 142 143 if ($revision->getID()) { 144 $form->setAction('/differential/revision/edit/'.$revision->getID().'/'); 145 } else { 146 $form->setAction('/differential/revision/edit/'); 147 } 148 149 if ($diff && $revision->getID()) { 150 $form 151 ->appendChild( 152 id(new AphrontFormTextAreaControl()) 153 ->setLabel(pht('Comments')) 154 ->setName('comments') 155 ->setCaption(pht("Explain what's new in this diff.")) 156 ->setValue($request->getStr('comments'))) 157 ->appendChild( 158 id(new AphrontFormSubmitControl()) 159 ->setValue(pht('Save'))) 160 ->appendChild( 161 id(new AphrontFormDividerControl())); 162 } 163 164 $field_list->appendFieldsToForm($form); 165 166 $submit = id(new AphrontFormSubmitControl()) 167 ->setValue('Save'); 168 if ($diff) { 169 $submit->addCancelButton('/differential/diff/'.$diff->getID().'/'); 170 } else { 171 $submit->addCancelButton('/D'.$revision->getID()); 172 } 173 174 $form->appendChild($submit); 175 176 $crumbs = $this->buildApplicationCrumbs(); 177 if ($revision->getID()) { 178 if ($diff) { 179 $title = pht('Update Differential Revision'); 180 $crumbs->addTextCrumb( 181 'D'.$revision->getID(), 182 '/differential/diff/'.$diff->getID().'/'); 183 } else { 184 $title = pht('Edit Differential Revision'); 185 $crumbs->addTextCrumb( 186 'D'.$revision->getID(), 187 '/D'.$revision->getID()); 188 } 189 } else { 190 $title = pht('Create New Differential Revision'); 191 } 192 193 $form_box = id(new PHUIObjectBoxView()) 194 ->setHeaderText($title) 195 ->setValidationException($validation_exception) 196 ->setForm($form); 197 198 $crumbs->addTextCrumb($title); 199 200 return $this->buildApplicationPage( 201 array( 202 $crumbs, 203 $form_box, 204 ), 205 array( 206 'title' => $title, 207 )); 208 } 209 210 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |