Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13179157
D16193.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
36 KB
Referenced Files
None
Subscribers
None
D16193.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -381,6 +381,7 @@
'DifferentialChangesetTwoUpRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpRenderer.php',
'DifferentialChangesetTwoUpTestRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpTestRenderer.php',
'DifferentialChangesetViewController' => 'applications/differential/controller/DifferentialChangesetViewController.php',
+ 'DifferentialChildRevisionsField' => 'applications/differential/customfield/DifferentialChildRevisionsField.php',
'DifferentialCloseConduitAPIMethod' => 'applications/differential/conduit/DifferentialCloseConduitAPIMethod.php',
'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php',
'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php',
@@ -407,8 +408,6 @@
'DifferentialCustomFieldStringIndex' => 'applications/differential/storage/DifferentialCustomFieldStringIndex.php',
'DifferentialDAO' => 'applications/differential/storage/DifferentialDAO.php',
'DifferentialDefaultViewCapability' => 'applications/differential/capability/DifferentialDefaultViewCapability.php',
- 'DifferentialDependenciesField' => 'applications/differential/customfield/DifferentialDependenciesField.php',
- 'DifferentialDependsOnField' => 'applications/differential/customfield/DifferentialDependsOnField.php',
'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php',
'DifferentialDiffAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialDiffAffectedFilesHeraldField.php',
'DifferentialDiffAuthorHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorHeraldField.php',
@@ -476,6 +475,7 @@
'DifferentialManiphestTasksField' => 'applications/differential/customfield/DifferentialManiphestTasksField.php',
'DifferentialModernHunk' => 'applications/differential/storage/DifferentialModernHunk.php',
'DifferentialNextStepField' => 'applications/differential/customfield/DifferentialNextStepField.php',
+ 'DifferentialParentRevisionsField' => 'applications/differential/customfield/DifferentialParentRevisionsField.php',
'DifferentialParseCacheGarbageCollector' => 'applications/differential/garbagecollector/DifferentialParseCacheGarbageCollector.php',
'DifferentialParseCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialParseCommitMessageConduitAPIMethod.php',
'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php',
@@ -521,9 +521,13 @@
'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php',
'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php',
'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php',
+ 'DifferentialRevisionHasChildRelationship' => 'applications/differential/relationships/DifferentialRevisionHasChildRelationship.php',
'DifferentialRevisionHasCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionHasCommitEdgeType.php',
+ 'DifferentialRevisionHasCommitRelationship' => 'applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php',
+ 'DifferentialRevisionHasParentRelationship' => 'applications/differential/relationships/DifferentialRevisionHasParentRelationship.php',
'DifferentialRevisionHasReviewerEdgeType' => 'applications/differential/edge/DifferentialRevisionHasReviewerEdgeType.php',
'DifferentialRevisionHasTaskEdgeType' => 'applications/differential/edge/DifferentialRevisionHasTaskEdgeType.php',
+ 'DifferentialRevisionHasTaskRelationship' => 'applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php',
'DifferentialRevisionHeraldField' => 'applications/differential/herald/DifferentialRevisionHeraldField.php',
'DifferentialRevisionHeraldFieldGroup' => 'applications/differential/herald/DifferentialRevisionHeraldFieldGroup.php',
'DifferentialRevisionIDField' => 'applications/differential/customfield/DifferentialRevisionIDField.php',
@@ -536,6 +540,7 @@
'DifferentialRevisionPackageHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageHeraldField.php',
'DifferentialRevisionPackageOwnerHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageOwnerHeraldField.php',
'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php',
+ 'DifferentialRevisionRelationship' => 'applications/differential/relationships/DifferentialRevisionRelationship.php',
'DifferentialRevisionRelationshipSource' => 'applications/search/relationship/DifferentialRevisionRelationshipSource.php',
'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php',
'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php',
@@ -601,7 +606,9 @@
'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php',
'DiffusionCommitFulltextEngine' => 'applications/repository/search/DiffusionCommitFulltextEngine.php',
'DiffusionCommitHasRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasRevisionEdgeType.php',
+ 'DiffusionCommitHasRevisionRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php',
'DiffusionCommitHasTaskEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasTaskEdgeType.php',
+ 'DiffusionCommitHasTaskRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php',
'DiffusionCommitHash' => 'applications/diffusion/data/DiffusionCommitHash.php',
'DiffusionCommitHeraldField' => 'applications/diffusion/herald/DiffusionCommitHeraldField.php',
'DiffusionCommitHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionCommitHeraldFieldGroup.php',
@@ -615,6 +622,7 @@
'DiffusionCommitParentsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitParentsQueryConduitAPIMethod.php',
'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php',
'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php',
+ 'DiffusionCommitRelationship' => 'applications/diffusion/relationships/DiffusionCommitRelationship.php',
'DiffusionCommitRelationshipSource' => 'applications/search/relationship/DiffusionCommitRelationshipSource.php',
'DiffusionCommitRemarkupRule' => 'applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php',
'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php',
@@ -3867,6 +3875,7 @@
'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php',
'PholioMockFulltextEngine' => 'applications/pholio/search/PholioMockFulltextEngine.php',
'PholioMockHasTaskEdgeType' => 'applications/pholio/edge/PholioMockHasTaskEdgeType.php',
+ 'PholioMockHasTaskRelationship' => 'applications/pholio/relationships/PholioMockHasTaskRelationship.php',
'PholioMockHeraldField' => 'applications/pholio/herald/PholioMockHeraldField.php',
'PholioMockHeraldFieldGroup' => 'applications/pholio/herald/PholioMockHeraldFieldGroup.php',
'PholioMockImagesView' => 'applications/pholio/view/PholioMockImagesView.php',
@@ -3875,6 +3884,7 @@
'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php',
'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php',
'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php',
+ 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php',
'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php',
'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php',
'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php',
@@ -4709,6 +4719,7 @@
'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer',
'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer',
'DifferentialChangesetViewController' => 'DifferentialController',
+ 'DifferentialChildRevisionsField' => 'DifferentialCustomField',
'DifferentialCloseConduitAPIMethod' => 'DifferentialConduitAPIMethod',
'DifferentialCommentPreviewController' => 'DifferentialController',
'DifferentialCommentSaveController' => 'DifferentialController',
@@ -4735,8 +4746,6 @@
'DifferentialCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage',
'DifferentialDAO' => 'PhabricatorLiskDAO',
'DifferentialDefaultViewCapability' => 'PhabricatorPolicyCapability',
- 'DifferentialDependenciesField' => 'DifferentialCustomField',
- 'DifferentialDependsOnField' => 'DifferentialCustomField',
'DifferentialDiff' => array(
'DifferentialDAO',
'PhabricatorPolicyInterface',
@@ -4817,6 +4826,7 @@
'DifferentialManiphestTasksField' => 'DifferentialCoreCustomField',
'DifferentialModernHunk' => 'DifferentialHunk',
'DifferentialNextStepField' => 'DifferentialCustomField',
+ 'DifferentialParentRevisionsField' => 'DifferentialCustomField',
'DifferentialParseCacheGarbageCollector' => 'PhabricatorGarbageCollector',
'DifferentialParseCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod',
'DifferentialParseRenderTestCase' => 'PhabricatorTestCase',
@@ -4878,9 +4888,13 @@
'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType',
'DifferentialRevisionEditController' => 'DifferentialController',
'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine',
+ 'DifferentialRevisionHasChildRelationship' => 'DifferentialRevisionRelationship',
'DifferentialRevisionHasCommitEdgeType' => 'PhabricatorEdgeType',
+ 'DifferentialRevisionHasCommitRelationship' => 'DifferentialRevisionRelationship',
+ 'DifferentialRevisionHasParentRelationship' => 'DifferentialRevisionRelationship',
'DifferentialRevisionHasReviewerEdgeType' => 'PhabricatorEdgeType',
'DifferentialRevisionHasTaskEdgeType' => 'PhabricatorEdgeType',
+ 'DifferentialRevisionHasTaskRelationship' => 'DifferentialRevisionRelationship',
'DifferentialRevisionHeraldField' => 'HeraldField',
'DifferentialRevisionHeraldFieldGroup' => 'HeraldFieldGroup',
'DifferentialRevisionIDField' => 'DifferentialCustomField',
@@ -4893,6 +4907,7 @@
'DifferentialRevisionPackageHeraldField' => 'DifferentialRevisionHeraldField',
'DifferentialRevisionPackageOwnerHeraldField' => 'DifferentialRevisionHeraldField',
'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'DifferentialRevisionRelationship' => 'PhabricatorObjectRelationship',
'DifferentialRevisionRelationshipSource' => 'PhabricatorObjectRelationshipSource',
'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField',
'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField',
@@ -4958,7 +4973,9 @@
'DiffusionCommitEditController' => 'DiffusionController',
'DiffusionCommitFulltextEngine' => 'PhabricatorFulltextEngine',
'DiffusionCommitHasRevisionEdgeType' => 'PhabricatorEdgeType',
+ 'DiffusionCommitHasRevisionRelationship' => 'DiffusionCommitRelationship',
'DiffusionCommitHasTaskEdgeType' => 'PhabricatorEdgeType',
+ 'DiffusionCommitHasTaskRelationship' => 'DiffusionCommitRelationship',
'DiffusionCommitHash' => 'Phobject',
'DiffusionCommitHeraldField' => 'HeraldField',
'DiffusionCommitHeraldFieldGroup' => 'HeraldFieldGroup',
@@ -4972,6 +4989,7 @@
'DiffusionCommitParentsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'DiffusionCommitRef' => 'Phobject',
+ 'DiffusionCommitRelationship' => 'PhabricatorObjectRelationship',
'DiffusionCommitRelationshipSource' => 'PhabricatorObjectRelationshipSource',
'DiffusionCommitRemarkupRule' => 'PhabricatorObjectRemarkupRule',
'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase',
@@ -8793,6 +8811,7 @@
'PholioMockEmbedView' => 'AphrontView',
'PholioMockFulltextEngine' => 'PhabricatorFulltextEngine',
'PholioMockHasTaskEdgeType' => 'PhabricatorEdgeType',
+ 'PholioMockHasTaskRelationship' => 'PholioMockRelationship',
'PholioMockHeraldField' => 'HeraldField',
'PholioMockHeraldFieldGroup' => 'HeraldFieldGroup',
'PholioMockImagesView' => 'AphrontView',
@@ -8801,6 +8820,7 @@
'PholioMockNameHeraldField' => 'PholioMockHeraldField',
'PholioMockPHIDType' => 'PhabricatorPHIDType',
'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'PholioMockRelationship' => 'PhabricatorObjectRelationship',
'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource',
'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PholioMockThumbGridView' => 'AphrontView',
diff --git a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php
--- a/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php
+++ b/src/applications/differential/config/PhabricatorDifferentialConfigOptions.php
@@ -40,8 +40,8 @@
new DifferentialViewPolicyField(),
new DifferentialEditPolicyField(),
- new DifferentialDependsOnField(),
- new DifferentialDependenciesField(),
+ new DifferentialParentRevisionsField(),
+ new DifferentialChildRevisionsField(),
new DifferentialManiphestTasksField(),
new DifferentialCommitsField(),
diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php
--- a/src/applications/differential/controller/DifferentialRevisionViewController.php
+++ b/src/applications/differential/controller/DifferentialRevisionViewController.php
@@ -516,28 +516,6 @@
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
- $this->requireResource('phabricator-object-selector-css');
- $this->requireResource('javelin-behavior-phabricator-object-selector');
-
- $curtain->addAction(
- id(new PhabricatorActionView())
- ->setIcon('fa-link')
- ->setName(pht('Edit Dependencies'))
- ->setHref("/search/attach/{$revision_phid}/DREV/dependencies/")
- ->setWorkflow(true)
- ->setDisabled(!$can_edit));
-
- $maniphest = 'PhabricatorManiphestApplication';
- if (PhabricatorApplication::isClassInstalled($maniphest)) {
- $curtain->addAction(
- id(new PhabricatorActionView())
- ->setIcon('fa-anchor')
- ->setName(pht('Edit Maniphest Tasks'))
- ->setHref("/search/attach/{$revision_phid}/TASK/")
- ->setWorkflow(true)
- ->setDisabled(!$can_edit));
- }
-
$request_uri = $this->getRequest()->getRequestURI();
$curtain->addAction(
id(new PhabricatorActionView())
@@ -545,6 +523,32 @@
->setName(pht('Download Raw Diff'))
->setHref($request_uri->alter('download', 'true')));
+ $relationship_list = PhabricatorObjectRelationshipList::newForObject(
+ $viewer,
+ $revision);
+
+ $parent_key = DifferentialRevisionHasParentRelationship::RELATIONSHIPKEY;
+ $child_key = DifferentialRevisionHasChildRelationship::RELATIONSHIPKEY;
+
+ $revision_submenu = array();
+
+ $revision_submenu[] = $relationship_list->getRelationship($parent_key)
+ ->newAction($revision);
+
+ $revision_submenu[] = $relationship_list->getRelationship($child_key)
+ ->newAction($revision);
+
+ $curtain->addAction(
+ id(new PhabricatorActionView())
+ ->setName(pht('Edit Related Revisions...'))
+ ->setIcon('fa-cog')
+ ->setSubmenu($revision_submenu));
+
+ $relationship_submenu = $relationship_list->newActionMenu();
+ if ($relationship_submenu) {
+ $curtain->addAction($relationship_submenu);
+ }
+
return $curtain;
}
diff --git a/src/applications/differential/customfield/DifferentialDependenciesField.php b/src/applications/differential/customfield/DifferentialChildRevisionsField.php
rename from src/applications/differential/customfield/DifferentialDependenciesField.php
rename to src/applications/differential/customfield/DifferentialChildRevisionsField.php
--- a/src/applications/differential/customfield/DifferentialDependenciesField.php
+++ b/src/applications/differential/customfield/DifferentialChildRevisionsField.php
@@ -1,6 +1,6 @@
<?php
-final class DifferentialDependenciesField
+final class DifferentialChildRevisionsField
extends DifferentialCustomField {
public function getFieldKey() {
@@ -8,7 +8,7 @@
}
public function getFieldName() {
- return pht('Dependencies');
+ return pht('Child Revisions');
}
public function canDisableField() {
diff --git a/src/applications/differential/customfield/DifferentialDependsOnField.php b/src/applications/differential/customfield/DifferentialParentRevisionsField.php
rename from src/applications/differential/customfield/DifferentialDependsOnField.php
rename to src/applications/differential/customfield/DifferentialParentRevisionsField.php
--- a/src/applications/differential/customfield/DifferentialDependsOnField.php
+++ b/src/applications/differential/customfield/DifferentialParentRevisionsField.php
@@ -1,6 +1,6 @@
<?php
-final class DifferentialDependsOnField
+final class DifferentialParentRevisionsField
extends DifferentialCustomField {
public function getFieldKey() {
@@ -12,7 +12,7 @@
}
public function getFieldName() {
- return pht('Depends On');
+ return pht('Parent Revisions');
}
public function canDisableField() {
diff --git a/src/applications/differential/relationships/DifferentialRevisionHasChildRelationship.php b/src/applications/differential/relationships/DifferentialRevisionHasChildRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/relationships/DifferentialRevisionHasChildRelationship.php
@@ -0,0 +1,44 @@
+<?php
+
+final class DifferentialRevisionHasChildRelationship
+ extends DifferentialRevisionRelationship {
+
+ const RELATIONSHIPKEY = 'revision.has-child';
+
+ public function getEdgeConstant() {
+ return DifferentialRevisionDependedOnByRevisionEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Child Revisions');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-chevron-circle-down';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof DifferentialRevision);
+ }
+
+ public function shouldAppearInActionMenu() {
+ return false;
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Child Revisions');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Child Revisions');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Child Revisions');
+ }
+
+ protected function newRelationshipSource() {
+ return new DifferentialRevisionRelationshipSource();
+ }
+
+}
diff --git a/src/applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php b/src/applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php
@@ -0,0 +1,40 @@
+<?php
+
+final class DifferentialRevisionHasCommitRelationship
+ extends DifferentialRevisionRelationship {
+
+ const RELATIONSHIPKEY = 'revision.has-commit';
+
+ public function getEdgeConstant() {
+ return DifferentialRevisionHasCommitEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Commits');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-code';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof PhabricatorRepositoryCommit);
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Related Commits');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Commits');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Related Commits');
+ }
+
+ protected function newRelationshipSource() {
+ return new DiffusionCommitRelationshipSource();
+ }
+
+}
diff --git a/src/applications/differential/relationships/DifferentialRevisionHasParentRelationship.php b/src/applications/differential/relationships/DifferentialRevisionHasParentRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/relationships/DifferentialRevisionHasParentRelationship.php
@@ -0,0 +1,44 @@
+<?php
+
+final class DifferentialRevisionHasParentRelationship
+ extends DifferentialRevisionRelationship {
+
+ const RELATIONSHIPKEY = 'revision.has-parent';
+
+ public function getEdgeConstant() {
+ return DifferentialRevisionDependsOnRevisionEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Parent Revisions');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-chevron-circle-up';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof DifferentialRevision);
+ }
+
+ public function shouldAppearInActionMenu() {
+ return false;
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Parent Revisions');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Parent Revisions');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Parent Revisions');
+ }
+
+ protected function newRelationshipSource() {
+ return new DifferentialRevisionRelationshipSource();
+ }
+
+}
diff --git a/src/applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php b/src/applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php
@@ -0,0 +1,40 @@
+<?php
+
+final class DifferentialRevisionHasTaskRelationship
+ extends DifferentialRevisionRelationship {
+
+ const RELATIONSHIPKEY = 'revision.has-task';
+
+ public function getEdgeConstant() {
+ return DifferentialRevisionHasTaskEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Tasks');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-anchor';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof ManiphestTask);
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Related Tasks');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Tasks');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Related Tasks');
+ }
+
+ protected function newRelationshipSource() {
+ return new ManiphestTaskRelationshipSource();
+ }
+
+}
diff --git a/src/applications/differential/relationships/DifferentialRevisionRelationship.php b/src/applications/differential/relationships/DifferentialRevisionRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/relationships/DifferentialRevisionRelationship.php
@@ -0,0 +1,19 @@
+<?php
+
+abstract class DifferentialRevisionRelationship
+ extends PhabricatorObjectRelationship {
+
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ $has_app = PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorDifferentialApplication',
+ $viewer);
+ if (!$has_app) {
+ return false;
+ }
+
+ return ($object instanceof DifferentialRevision);
+ }
+
+}
diff --git a/src/applications/diffusion/controller/DiffusionCommitController.php b/src/applications/diffusion/controller/DiffusionCommitController.php
--- a/src/applications/diffusion/controller/DiffusionCommitController.php
+++ b/src/applications/diffusion/controller/DiffusionCommitController.php
@@ -968,26 +968,21 @@
->setWorkflow(!$can_edit);
$curtain->addAction($action);
- require_celerity_resource('phabricator-object-selector-css');
- require_celerity_resource('javelin-behavior-phabricator-object-selector');
-
- $maniphest = 'PhabricatorManiphestApplication';
- if (PhabricatorApplication::isClassInstalled($maniphest)) {
- $action = id(new PhabricatorActionView())
- ->setName(pht('Edit Maniphest Tasks'))
- ->setIcon('fa-anchor')
- ->setHref('/search/attach/'.$commit->getPHID().'/TASK/edge/')
- ->setWorkflow(true)
- ->setDisabled(!$can_edit);
- $curtain->addAction($action);
- }
-
$action = id(new PhabricatorActionView())
->setName(pht('Download Raw Diff'))
->setHref($request->getRequestURI()->alter('diff', true))
->setIcon('fa-download');
$curtain->addAction($action);
+ $relationship_list = PhabricatorObjectRelationshipList::newForObject(
+ $viewer,
+ $commit);
+
+ $relationship_submenu = $relationship_list->newActionMenu();
+ if ($relationship_submenu) {
+ $curtain->addAction($relationship_submenu);
+ }
+
return $curtain;
}
diff --git a/src/applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php b/src/applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php
@@ -0,0 +1,40 @@
+<?php
+
+final class DiffusionCommitHasRevisionRelationship
+ extends DiffusionCommitRelationship {
+
+ const RELATIONSHIPKEY = 'commit.has-revision';
+
+ public function getEdgeConstant() {
+ return DiffusionCommitHasRevisionEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Revisions');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-cog';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof DifferentialRevision);
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Related Revisions');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Revisions');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Related Revisions');
+ }
+
+ protected function newRelationshipSource() {
+ return new DifferentialRevisionRelationshipSource();
+ }
+
+}
diff --git a/src/applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php b/src/applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php
@@ -0,0 +1,40 @@
+<?php
+
+final class DiffusionCommitHasTaskRelationship
+ extends DiffusionCommitRelationship {
+
+ const RELATIONSHIPKEY = 'commit.has-task';
+
+ public function getEdgeConstant() {
+ return DiffusionCommitHasTaskEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Tasks');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-anchor';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof ManiphestTask);
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Related Tasks');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Tasks');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Related Tasks');
+ }
+
+ protected function newRelationshipSource() {
+ return new ManiphestTaskRelationshipSource();
+ }
+
+}
diff --git a/src/applications/diffusion/relationships/DiffusionCommitRelationship.php b/src/applications/diffusion/relationships/DiffusionCommitRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/relationships/DiffusionCommitRelationship.php
@@ -0,0 +1,19 @@
+<?php
+
+abstract class DiffusionCommitRelationship
+ extends PhabricatorObjectRelationship {
+
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ $has_app = PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorDiffusionApplication',
+ $viewer);
+ if (!$has_app) {
+ return false;
+ }
+
+ return ($object instanceof PhabricatorRepositoryCommit);
+ }
+
+}
diff --git a/src/applications/pholio/controller/PholioMockViewController.php b/src/applications/pholio/controller/PholioMockViewController.php
--- a/src/applications/pholio/controller/PholioMockViewController.php
+++ b/src/applications/pholio/controller/PholioMockViewController.php
@@ -150,13 +150,14 @@
->setWorkflow(true));
}
- $curtain->addAction(
- id(new PhabricatorActionView())
- ->setIcon('fa-anchor')
- ->setName(pht('Edit Maniphest Tasks'))
- ->setHref("/search/attach/{$mock->getPHID()}/TASK/edge/")
- ->setDisabled(!$viewer->isLoggedIn())
- ->setWorkflow(true));
+ $relationship_list = PhabricatorObjectRelationshipList::newForObject(
+ $viewer,
+ $mock);
+
+ $relationship_submenu = $relationship_list->newActionMenu();
+ if ($relationship_submenu) {
+ $curtain->addAction($relationship_submenu);
+ }
if ($this->getManiphestTaskPHIDs()) {
$curtain->newPanel()
diff --git a/src/applications/pholio/relationships/PholioMockHasTaskRelationship.php b/src/applications/pholio/relationships/PholioMockHasTaskRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/pholio/relationships/PholioMockHasTaskRelationship.php
@@ -0,0 +1,40 @@
+<?php
+
+final class PholioMockHasTaskRelationship
+ extends PholioMockRelationship {
+
+ const RELATIONSHIPKEY = 'mock.has-task';
+
+ public function getEdgeConstant() {
+ return PholioMockHasTaskEdgeType::EDGECONST;
+ }
+
+ protected function getActionName() {
+ return pht('Edit Tasks');
+ }
+
+ protected function getActionIcon() {
+ return 'fa-anchor';
+ }
+
+ public function canRelateObjects($src, $dst) {
+ return ($dst instanceof ManiphestTask);
+ }
+
+ public function getDialogTitleText() {
+ return pht('Edit Related Tasks');
+ }
+
+ public function getDialogHeaderText() {
+ return pht('Current Tasks');
+ }
+
+ public function getDialogButtonText() {
+ return pht('Save Related Tasks');
+ }
+
+ protected function newRelationshipSource() {
+ return new ManiphestTaskRelationshipSource();
+ }
+
+}
diff --git a/src/applications/pholio/relationships/PholioMockRelationship.php b/src/applications/pholio/relationships/PholioMockRelationship.php
new file mode 100644
--- /dev/null
+++ b/src/applications/pholio/relationships/PholioMockRelationship.php
@@ -0,0 +1,19 @@
+<?php
+
+abstract class PholioMockRelationship
+ extends PhabricatorObjectRelationship {
+
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ $has_app = PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorPholioApplication',
+ $viewer);
+ if (!$has_app) {
+ return false;
+ }
+
+ return ($object instanceof PholioMock);
+ }
+
+}
diff --git a/src/applications/search/relationship/DifferentialRevisionRelationshipSource.php b/src/applications/search/relationship/DifferentialRevisionRelationshipSource.php
--- a/src/applications/search/relationship/DifferentialRevisionRelationshipSource.php
+++ b/src/applications/search/relationship/DifferentialRevisionRelationshipSource.php
@@ -3,6 +3,14 @@
final class DifferentialRevisionRelationshipSource
extends PhabricatorObjectRelationshipSource {
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ return PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorDifferentialApplication',
+ $viewer);
+ }
+
public function getResultPHIDTypes() {
return array(
DifferentialRevisionPHIDType::TYPECONST,
diff --git a/src/applications/search/relationship/DiffusionCommitRelationshipSource.php b/src/applications/search/relationship/DiffusionCommitRelationshipSource.php
--- a/src/applications/search/relationship/DiffusionCommitRelationshipSource.php
+++ b/src/applications/search/relationship/DiffusionCommitRelationshipSource.php
@@ -3,6 +3,14 @@
final class DiffusionCommitRelationshipSource
extends PhabricatorObjectRelationshipSource {
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ return PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorDiffusionApplication',
+ $viewer);
+ }
+
public function getResultPHIDTypes() {
return array(
PhabricatorRepositoryCommitPHIDType::TYPECONST,
diff --git a/src/applications/search/relationship/ManiphestTaskRelationshipSource.php b/src/applications/search/relationship/ManiphestTaskRelationshipSource.php
--- a/src/applications/search/relationship/ManiphestTaskRelationshipSource.php
+++ b/src/applications/search/relationship/ManiphestTaskRelationshipSource.php
@@ -3,6 +3,14 @@
final class ManiphestTaskRelationshipSource
extends PhabricatorObjectRelationshipSource {
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ return PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorManiphestApplication',
+ $viewer);
+ }
+
public function getResultPHIDTypes() {
return array(
ManiphestTaskPHIDType::TYPECONST,
diff --git a/src/applications/search/relationship/PhabricatorObjectRelationship.php b/src/applications/search/relationship/PhabricatorObjectRelationship.php
--- a/src/applications/search/relationship/PhabricatorObjectRelationship.php
+++ b/src/applications/search/relationship/PhabricatorObjectRelationship.php
@@ -54,7 +54,10 @@
}
final public function newSource() {
- return $this->newRelationshipSource();
+ $viewer = $this->getViewer();
+
+ return $this->newRelationshipSource()
+ ->setViewer($viewer);
}
abstract protected function newRelationshipSource();
diff --git a/src/applications/search/relationship/PhabricatorObjectRelationshipList.php b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php
--- a/src/applications/search/relationship/PhabricatorObjectRelationshipList.php
+++ b/src/applications/search/relationship/PhabricatorObjectRelationshipList.php
@@ -87,6 +87,11 @@
continue;
}
+ $source = $relationship->newSource();
+ if (!$source->isEnabledForObject($object)) {
+ continue;
+ }
+
$results[$key] = $relationship;
}
diff --git a/src/applications/search/relationship/PhabricatorObjectRelationshipSource.php b/src/applications/search/relationship/PhabricatorObjectRelationshipSource.php
--- a/src/applications/search/relationship/PhabricatorObjectRelationshipSource.php
+++ b/src/applications/search/relationship/PhabricatorObjectRelationshipSource.php
@@ -2,6 +2,18 @@
abstract class PhabricatorObjectRelationshipSource extends Phobject {
+ private $viewer;
+
+ final public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ final public function getViewer() {
+ return $this->viewer;
+ }
+
+ abstract public function isEnabledForObject($object);
abstract public function getResultPHIDTypes();
}
diff --git a/src/applications/search/relationship/PholioMockRelationshipSource.php b/src/applications/search/relationship/PholioMockRelationshipSource.php
--- a/src/applications/search/relationship/PholioMockRelationshipSource.php
+++ b/src/applications/search/relationship/PholioMockRelationshipSource.php
@@ -3,6 +3,14 @@
final class PholioMockRelationshipSource
extends PhabricatorObjectRelationshipSource {
+ public function isEnabledForObject($object) {
+ $viewer = $this->getViewer();
+
+ return PhabricatorApplication::isClassInstalledForViewer(
+ 'PhabricatorPholioApplication',
+ $viewer);
+ }
+
public function getResultPHIDTypes() {
return array(
PholioMockPHIDType::TYPECONST,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, May 9, 8:59 PM (3 w, 4 d ago)
Storage Engine
amazon-s3
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
phabricator/secure/ev/py/tdaktrojyyhckr6n
Default Alt Text
D16193.diff (36 KB)
Attached To
Mode
D16193: Convert all standard relationship-editing actions to modern Relationships code
Attached
Detach File
Event Timeline
Log In to Comment