From 248b4dfa9d6148d7fbf05000ab8c0443948af762 Mon Sep 17 00:00:00 2001 From: lkassianik Date: Mon, 23 Jun 2014 09:49:52 -0700 Subject: [PATCH] Projects for DifferentialRevision Summary: T2628, Adding project tags to revisions Test Plan: Edit revision, verify projects can be tagged. Add project hashtag to comments or commit templates, verify revision is tagged with project Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: epriestley, Korvin Differential Revision: https://secure.phabricator.com/D9686 --- src/__phutil_library_map__.php | 3 + .../PhabricatorDifferentialConfigOptions.php | 1 + .../customfield/DifferentialProjectsField.php | 111 ++++++++++++++++++ .../storage/DifferentialRevision.php | 3 +- 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/applications/differential/customfield/DifferentialProjectsField.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 73770d863d..f56eb0c140 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -415,6 +415,7 @@ phutil_register_library_map(array( 'DifferentialPathField' => 'applications/differential/customfield/DifferentialPathField.php', 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', 'DifferentialProjectReviewersField' => 'applications/differential/customfield/DifferentialProjectReviewersField.php', + 'DifferentialProjectsField' => 'applications/differential/customfield/DifferentialProjectsField.php', 'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php', 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', @@ -3108,6 +3109,7 @@ phutil_register_library_map(array( 'DifferentialPathField' => 'DifferentialCustomField', 'DifferentialPrimaryPaneView' => 'AphrontView', 'DifferentialProjectReviewersField' => 'DifferentialCustomField', + 'DifferentialProjectsField' => 'DifferentialCoreCustomField', 'DifferentialRemarkupRule' => 'PhabricatorRemarkupRuleObject', 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', @@ -3129,6 +3131,7 @@ phutil_register_library_map(array( 7 => 'PhabricatorCustomFieldInterface', 8 => 'PhabricatorApplicationTransactionInterface', 9 => 'PhabricatorDestructableInterface', + 10 => 'PhabricatorProjectInterface', ), 'DifferentialRevisionDetailView' => 'AphrontView', 'DifferentialRevisionEditController' => 'DifferentialController', diff --git a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php index cf8221c11d..eded1991e6 100644 --- a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php +++ b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php @@ -25,6 +25,7 @@ final class PhabricatorDifferentialConfigOptions new DifferentialSubscribersField(), new DifferentialRepositoryField(), new DifferentialLintField(), + new DifferentialProjectsField(), new DifferentialUnitField(), new DifferentialViewPolicyField(), new DifferentialEditPolicyField(), diff --git a/src/applications/differential/customfield/DifferentialProjectsField.php b/src/applications/differential/customfield/DifferentialProjectsField.php new file mode 100644 index 0000000000..7266e5ac31 --- /dev/null +++ b/src/applications/differential/customfield/DifferentialProjectsField.php @@ -0,0 +1,111 @@ +getPHID()) { + return array(); + } + + $projects = PhabricatorEdgeQuery::loadDestinationPHIDs( + $revision->getPHID(), + PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT); + $projects = array_reverse($projects); + + return $projects; + } + + public function getNewValueForApplicationTransactions() { + return array('=' => array_fuse($this->getValue())); + } + + public function readValueFromRequest(AphrontRequest $request) { + $this->setValue($request->getArr($this->getFieldKey())); + } + + public function getRequiredHandlePHIDsForEdit() { + return $this->getValue(); + } + + public function renderEditControl(array $handles) { + return id(new AphrontFormTokenizerControl()) + ->setName($this->getFieldKey()) + ->setDatasource('/typeahead/common/projects/') + ->setValue($handles) + ->setLabel($this->getFieldName()); + } + + public function getApplicationTransactionType() { + return PhabricatorTransactions::TYPE_EDGE; + } + + public function shouldAppearInCommitMessage() { + return true; + } + + public function shouldAllowEditInCommitMessage() { + return true; + } + + public function shouldOverwriteWhenCommitMessageIsEdited() { + return true; + } + + public function getCommitMessageLabels() { + return array( + 'Project', + 'Projects', + ); + } + + public function getRequiredHandlePHIDsForCommitMessage() { + return $this->getValue(); + } + + public function renderCommitMessageValue(array $handles) { + return $this->renderObjectList($handles); + } + + public function shouldAppearInConduitDictionary() { + return true; + } + + public function getApplicationTransactionMetadata() { + return array('edge:type' => PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT); + } + + public function parseValueFromCommitMessage($value) { + return $this->parseObjectList( + $value, + array( + PhabricatorProjectPHIDTypeProject::TYPECONST, + )); + } + +} diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php index d593eb8732..2446e67173 100644 --- a/src/applications/differential/storage/DifferentialRevision.php +++ b/src/applications/differential/storage/DifferentialRevision.php @@ -10,7 +10,8 @@ final class DifferentialRevision extends DifferentialDAO PhabricatorSubscribableInterface, PhabricatorCustomFieldInterface, PhabricatorApplicationTransactionInterface, - PhabricatorDestructableInterface { + PhabricatorDestructableInterface, + PhabricatorProjectInterface { protected $title = ''; protected $originalTitle;