Page MenuHomePhabricator

D16193.id38956.diff
No OneTemporary

D16193.id38956.diff

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

Mime Type
text/plain
Expires
Sun, May 12, 7:23 PM (3 w, 8 h ago)
Storage Engine
amazon-s3
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
phabricator/secure/ev/py/tdaktrojyyhckr6n
Default Alt Text
D16193.id38956.diff (36 KB)

Event Timeline