@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Replace Differential Edit controller with EditEngine-driven EditPro controller

Summary:
Ref T11114. This replaces the old edit controller with a new one based entirely on EditEngine.

This removes the CustomFieldEditEngineExtension hack for Differential, since remaining field types are fairly straightforward and work with existing EditEngine support, as far as I can tell.

Test Plan:
- Created a revision via web diffs.
- Updated a revision via web diffs.
- Edited a revision via web.
- Edited nonstandard custom fields ("Blame Revision", "JIRA Issues").
- Created a revision via CLI.
- Updated a revision via CLI.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11114

Differential Revision: https://secure.phabricator.com/D17054

+41 -274
-2
src/__phutil_library_map__.php
··· 517 517 'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php', 518 518 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependedOnByRevisionEdgeType.php', 519 519 'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php', 520 - 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', 521 520 'DifferentialRevisionEditEngine' => 'applications/differential/editor/DifferentialRevisionEditEngine.php', 522 521 'DifferentialRevisionEditProController' => 'applications/differential/controller/DifferentialRevisionEditProController.php', 523 522 'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php', ··· 5173 5172 'DifferentialRevisionControlSystem' => 'Phobject', 5174 5173 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'PhabricatorEdgeType', 5175 5174 'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType', 5176 - 'DifferentialRevisionEditController' => 'DifferentialController', 5177 5175 'DifferentialRevisionEditEngine' => 'PhabricatorEditEngine', 5178 5176 'DifferentialRevisionEditProController' => 'DifferentialController', 5179 5177 'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine',
-2
src/applications/differential/application/PhabricatorDifferentialApplication.php
··· 65 65 ), 66 66 'changeset/' => 'DifferentialChangesetViewController', 67 67 'revision/' => array( 68 - 'edit/(?:(?P<id>[1-9]\d*)/)?' 69 - => 'DifferentialRevisionEditController', 70 68 $this->getEditRoutePattern('editpro/') 71 69 => 'DifferentialRevisionEditProController', 72 70 $this->getEditRoutePattern('attach/(?P<diffID>[^/]+)/to/')
+16 -8
src/applications/differential/controller/DifferentialDiffViewController.php
··· 23 23 ->setURI('/D'.$diff->getRevisionID().'?id='.$diff->getID()); 24 24 } 25 25 26 + if ($request->isFormPost()) { 27 + $diff_id = $diff->getID(); 28 + $revision_id = $request->getInt('revisionID'); 29 + if ($revision_id) { 30 + $attach_uri = "/revision/attach/{$diff_id}/to/{$revision_id}/"; 31 + } else { 32 + $attach_uri = "/revision/attach/{$diff_id}/to/"; 33 + } 34 + $attach_uri = $this->getApplicationURI($attach_uri); 35 + 36 + return id(new AphrontRedirectResponse()) 37 + ->setURI($attach_uri); 38 + } 39 + 26 40 $diff_phid = $diff->getPHID(); 27 41 $buildables = id(new HarbormasterBuildableQuery()) 28 42 ->setViewer($viewer) ··· 78 92 $select); 79 93 80 94 $form = id(new AphrontFormView()) 81 - ->setUser($request->getUser()) 82 - ->setAction('/differential/revision/edit/') 83 - ->addHiddenInput('diffID', $diff->getID()) 84 - ->addHiddenInput('viaDiffView', 1) 85 - ->addHiddenInput( 86 - id(new DifferentialRepositoryField())->getFieldKey(), 87 - $diff->getRepositoryPHID()) 95 + ->setViewer($viewer) 88 96 ->appendRemarkupInstructions( 89 97 pht( 90 98 'Review the diff for correctness. When you are satisfied, either '. ··· 98 106 ->setValue(pht('Continue'))); 99 107 100 108 $props = id(new DifferentialDiffProperty())->loadAllWhere( 101 - 'diffID = %d', 109 + 'diffID = %d', 102 110 $diff->getID()); 103 111 $props = mpull($props, 'getData', 'getName'); 104 112
-214
src/applications/differential/controller/DifferentialRevisionEditController.php
··· 1 - <?php 2 - 3 - final class DifferentialRevisionEditController 4 - extends DifferentialController { 5 - 6 - public function handleRequest(AphrontRequest $request) { 7 - $viewer = $this->getViewer(); 8 - $id = $request->getURIData('id'); 9 - 10 - if (!$id) { 11 - $id = $request->getInt('revisionID'); 12 - } 13 - 14 - if ($id) { 15 - $revision = id(new DifferentialRevisionQuery()) 16 - ->setViewer($viewer) 17 - ->withIDs(array($id)) 18 - ->needRelationships(true) 19 - ->needReviewerStatus(true) 20 - ->needActiveDiffs(true) 21 - ->requireCapabilities( 22 - array( 23 - PhabricatorPolicyCapability::CAN_VIEW, 24 - PhabricatorPolicyCapability::CAN_EDIT, 25 - )) 26 - ->executeOne(); 27 - if (!$revision) { 28 - return new Aphront404Response(); 29 - } 30 - } else { 31 - $revision = DifferentialRevision::initializeNewRevision($viewer); 32 - $revision->attachReviewerStatus(array()); 33 - } 34 - 35 - $diff_id = $request->getInt('diffID'); 36 - if ($diff_id) { 37 - $diff = id(new DifferentialDiffQuery()) 38 - ->setViewer($viewer) 39 - ->withIDs(array($diff_id)) 40 - ->executeOne(); 41 - if (!$diff) { 42 - return new Aphront404Response(); 43 - } 44 - if ($diff->getRevisionID()) { 45 - // TODO: Redirect? 46 - throw new Exception( 47 - pht('This diff is already attached to a revision!')); 48 - } 49 - } else { 50 - $diff = null; 51 - } 52 - 53 - if (!$diff) { 54 - if (!$revision->getID()) { 55 - throw new Exception( 56 - pht('You can not create a new revision without a diff!')); 57 - } 58 - } else { 59 - // TODO: It would be nice to show the diff being attached in the UI. 60 - } 61 - 62 - $field_list = PhabricatorCustomField::getObjectFields( 63 - $revision, 64 - PhabricatorCustomField::ROLE_EDIT); 65 - $field_list 66 - ->setViewer($viewer) 67 - ->readFieldsFromStorage($revision); 68 - 69 - if ($request->getStr('viaDiffView') && $diff) { 70 - $repo_key = id(new DifferentialRepositoryField())->getFieldKey(); 71 - $repository_field = idx( 72 - $field_list->getFields(), 73 - $repo_key); 74 - if ($repository_field) { 75 - $repository_field->setValue($request->getStr($repo_key)); 76 - } 77 - $view_policy_key = id(new DifferentialViewPolicyField())->getFieldKey(); 78 - $view_policy_field = idx( 79 - $field_list->getFields(), 80 - $view_policy_key); 81 - if ($view_policy_field) { 82 - $view_policy_field->setValue($diff->getViewPolicy()); 83 - } 84 - } 85 - 86 - $validation_exception = null; 87 - if ($request->isFormPost() && !$request->getStr('viaDiffView')) { 88 - 89 - $editor = id(new DifferentialTransactionEditor()) 90 - ->setActor($viewer) 91 - ->setContentSourceFromRequest($request) 92 - ->setContinueOnNoEffect(true); 93 - 94 - $xactions = $field_list->buildFieldTransactionsFromRequest( 95 - new DifferentialTransaction(), 96 - $request); 97 - 98 - if ($diff) { 99 - $repository_phid = null; 100 - $repository_tokenizer = $request->getArr( 101 - id(new DifferentialRepositoryField())->getFieldKey()); 102 - if ($repository_tokenizer) { 103 - $repository_phid = reset($repository_tokenizer); 104 - } 105 - 106 - $xactions[] = id(new DifferentialTransaction()) 107 - ->setTransactionType(DifferentialTransaction::TYPE_UPDATE) 108 - ->setNewValue($diff->getPHID()); 109 - 110 - $editor->setRepositoryPHIDOverride($repository_phid); 111 - } 112 - 113 - $comments = $request->getStr('comments'); 114 - if (strlen($comments)) { 115 - $xactions[] = id(new DifferentialTransaction()) 116 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 117 - ->attachComment( 118 - id(new DifferentialTransactionComment()) 119 - ->setContent($comments)); 120 - } 121 - 122 - try { 123 - $editor->applyTransactions($revision, $xactions); 124 - $revision_uri = '/D'.$revision->getID(); 125 - return id(new AphrontRedirectResponse())->setURI($revision_uri); 126 - } catch (PhabricatorApplicationTransactionValidationException $ex) { 127 - $validation_exception = $ex; 128 - } 129 - } 130 - 131 - 132 - $form = new AphrontFormView(); 133 - $form->setUser($request->getUser()); 134 - if ($diff) { 135 - $form->addHiddenInput('diffID', $diff->getID()); 136 - } 137 - 138 - if ($revision->getID()) { 139 - $form->setAction('/differential/revision/edit/'.$revision->getID().'/'); 140 - } else { 141 - $form->setAction('/differential/revision/edit/'); 142 - } 143 - 144 - if ($diff && $revision->getID()) { 145 - $form 146 - ->appendChild( 147 - id(new AphrontFormTextAreaControl()) 148 - ->setLabel(pht('Comments')) 149 - ->setName('comments') 150 - ->setCaption(pht("Explain what's new in this diff.")) 151 - ->setValue($request->getStr('comments'))) 152 - ->appendChild( 153 - id(new AphrontFormSubmitControl()) 154 - ->setValue(pht('Save'))) 155 - ->appendChild( 156 - id(new AphrontFormDividerControl())); 157 - } 158 - 159 - $field_list->appendFieldsToForm($form); 160 - 161 - $submit = id(new AphrontFormSubmitControl()) 162 - ->setValue('Save'); 163 - if ($diff) { 164 - $submit->addCancelButton('/differential/diff/'.$diff->getID().'/'); 165 - } else { 166 - $submit->addCancelButton('/D'.$revision->getID()); 167 - } 168 - 169 - $form->appendChild($submit); 170 - 171 - $crumbs = $this->buildApplicationCrumbs(); 172 - if ($revision->getID()) { 173 - if ($diff) { 174 - $header_icon = 'fa-upload'; 175 - $title = pht('Update Revision'); 176 - $crumbs->addTextCrumb( 177 - 'D'.$revision->getID(), 178 - '/differential/diff/'.$diff->getID().'/'); 179 - } else { 180 - $header_icon = 'fa-pencil'; 181 - $title = pht('Edit Revision: %s', $revision->getTitle()); 182 - $crumbs->addTextCrumb( 183 - 'D'.$revision->getID(), 184 - '/D'.$revision->getID()); 185 - } 186 - } else { 187 - $header_icon = 'fa-plus-square'; 188 - $title = pht('Create New Differential Revision'); 189 - } 190 - 191 - $form_box = id(new PHUIObjectBoxView()) 192 - ->setHeaderText('Revision') 193 - ->setValidationException($validation_exception) 194 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 195 - ->setForm($form); 196 - 197 - $crumbs->addTextCrumb($title); 198 - $crumbs->setBorder(true); 199 - 200 - $header = id(new PHUIHeaderView()) 201 - ->setHeader($title) 202 - ->setHeaderIcon($header_icon); 203 - 204 - $view = id(new PHUITwoColumnView()) 205 - ->setHeader($header) 206 - ->setFooter($form_box); 207 - 208 - return $this->newPage() 209 - ->setTitle($title) 210 - ->setCrumbs($crumbs) 211 - ->appendChild($view); 212 - } 213 - 214 - }
+1 -1
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 570 570 $curtain->addAction( 571 571 id(new PhabricatorActionView()) 572 572 ->setIcon('fa-pencil') 573 - ->setHref("/differential/revision/edit/{$revision_id}/") 573 + ->setHref("/differential/revision/editpro/{$revision_id}/") 574 574 ->setName(pht('Edit Revision')) 575 575 ->setDisabled(!$can_edit) 576 576 ->setWorkflow(!$can_edit));
-4
src/applications/differential/customfield/DifferentialCoreCustomField.php
··· 118 118 return true; 119 119 } 120 120 121 - public function shouldAppearInEditView() { 122 - return true; 123 - } 124 - 125 121 public function readValueFromObject(PhabricatorCustomFieldInterface $object) { 126 122 if ($this->isCoreFieldRequired()) { 127 123 $this->setFieldError(true);
-4
src/applications/differential/customfield/DifferentialManiphestTasksField.php
··· 15 15 return false; 16 16 } 17 17 18 - public function shouldAppearInEditView() { 19 - return false; 20 - } 21 - 22 18 public function getFieldName() { 23 19 return pht('Maniphest Tasks'); 24 20 }
-4
src/applications/differential/customfield/DifferentialProjectsField.php
··· 19 19 return false; 20 20 } 21 21 22 - public function shouldAppearInEditView() { 23 - return true; 24 - } 25 - 26 22 public function shouldAppearInApplicationTransactions() { 27 23 return true; 28 24 }
-4
src/applications/differential/customfield/DifferentialRequiredSignaturesField.php
··· 19 19 return true; 20 20 } 21 21 22 - public function shouldAppearInEditView() { 23 - return false; 24 - } 25 - 26 22 protected function readValueFromRevision(DifferentialRevision $revision) { 27 23 return self::loadForRevision($revision); 28 24 }
-4
src/applications/differential/customfield/DifferentialReviewedByField.php
··· 23 23 return false; 24 24 } 25 25 26 - public function shouldAppearInEditView() { 27 - return false; 28 - } 29 - 30 26 public function canDisableField() { 31 27 return true; 32 28 }
+18 -15
src/applications/differential/editor/DifferentialRevisionEditEngine.php
··· 95 95 $diff_phid = null; 96 96 } 97 97 98 - $is_update = ($diff && $object->getID()); 98 + $is_create = $this->getIsCreate(); 99 + $is_update = ($diff && !$is_create); 99 100 100 101 $fields = array(); 101 102 102 - $fields[] = id(new PhabricatorHandlesEditField()) 103 - ->setKey('update') 104 - ->setLabel(pht('Update Diff')) 105 - ->setDescription(pht('New diff to create or update the revision with.')) 106 - ->setConduitDescription(pht('Create or update a revision with a diff.')) 107 - ->setConduitTypeDescription(pht('PHID of the diff.')) 108 - ->setTransactionType(DifferentialTransaction::TYPE_UPDATE) 109 - ->setHandleParameterType(new AphrontPHIDListHTTPParameterType()) 110 - ->setSingleValue($diff_phid) 111 - ->setIsReorderable(false) 112 - ->setIsDefaultable(false) 113 - ->setIsInvisible(true) 114 - ->setIsLockable(false); 103 + if ($diff || $is_create) { 104 + $fields[] = id(new PhabricatorHandlesEditField()) 105 + ->setKey('update') 106 + ->setLabel(pht('Update Diff')) 107 + ->setDescription(pht('New diff to create or update the revision with.')) 108 + ->setConduitDescription(pht('Create or update a revision with a diff.')) 109 + ->setConduitTypeDescription(pht('PHID of the diff.')) 110 + ->setTransactionType(DifferentialTransaction::TYPE_UPDATE) 111 + ->setHandleParameterType(new AphrontPHIDListHTTPParameterType()) 112 + ->setSingleValue($diff_phid) 113 + ->setIsReorderable(false) 114 + ->setIsDefaultable(false) 115 + ->setIsInvisible(true) 116 + ->setIsLockable(false); 117 + } 115 118 116 119 if ($is_update) { 117 120 $fields[] = id(new PhabricatorInstructionsEditField()) ··· 194 197 private function isCustomFieldEnabled(DifferentialRevision $revision, $key) { 195 198 $field_list = PhabricatorCustomField::getObjectFields( 196 199 $revision, 197 - PhabricatorCustomField::ROLE_EDIT); 200 + PhabricatorCustomField::ROLE_VIEW); 198 201 199 202 $fields = $field_list->getFields(); 200 203 return isset($fields[$key]);
+1
src/applications/differential/storage/DifferentialRevision.php
··· 70 70 ->setAuthorPHID($actor->getPHID()) 71 71 ->attachRelationships(array()) 72 72 ->attachRepository(null) 73 + ->attachReviewerStatus(array()) 73 74 ->setStatus(ArcanistDifferentialRevisionStatus::NEEDS_REVIEW); 74 75 } 75 76
+5 -6
src/infrastructure/customfield/editor/PhabricatorCustomFieldEditField.php
··· 47 47 } 48 48 49 49 protected function newEditType() { 50 + $type = id(new PhabricatorCustomFieldEditType()) 51 + ->setCustomField($this->getCustomField()); 52 + 50 53 $conduit_type = $this->newConduitParameterType(); 51 - if (!$conduit_type) { 52 - return null; 54 + if ($conduit_type) { 55 + $type->setConduitParameterType($conduit_type); 53 56 } 54 - 55 - $type = id(new PhabricatorCustomFieldEditType()) 56 - ->setCustomField($this->getCustomField()) 57 - ->setConduitParameterType($conduit_type); 58 57 59 58 return $type; 60 59 }
-6
src/infrastructure/customfield/engineextension/PhabricatorCustomFieldEditEngineExtension.php
··· 27 27 PhabricatorEditEngine $engine, 28 28 PhabricatorApplicationTransactionInterface $object) { 29 29 30 - // TODO: Remove this hack once Differential modernizes more fully. Today, 31 - // its custom fields are too custom to interact cleanly with EditEngine. 32 - if ($object instanceof DifferentialRevision) { 33 - return array(); 34 - } 35 - 36 30 $viewer = $this->getViewer(); 37 31 38 32 $field_list = PhabricatorCustomField::getObjectFields(