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 @@ -433,6 +433,7 @@ 'DifferentialRevisionMailReceiver' => 'applications/differential/mail/DifferentialRevisionMailReceiver.php', 'DifferentialRevisionPHIDType' => 'applications/differential/phid/DifferentialRevisionPHIDType.php', 'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php', + 'DifferentialRevisionRevertedByCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php', 'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php', 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php', @@ -487,6 +488,8 @@ 'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php', 'DiffusionCommitRevertedByCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertedByCommitEdgeType.php', 'DiffusionCommitRevertsCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsCommitEdgeType.php', + 'DiffusionCommitRevertsRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php', + 'DiffusionCommitRevertsTasksEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php', 'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php', 'DiffusionConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionConduitAPIMethod.php', 'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php', @@ -1060,6 +1063,7 @@ 'ManiphestTaskPriorityDatasource' => 'applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php', 'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.php', 'ManiphestTaskResultListView' => 'applications/maniphest/view/ManiphestTaskResultListView.php', + 'ManiphestTaskRevertedByCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php', 'ManiphestTaskSearchEngine' => 'applications/maniphest/query/ManiphestTaskSearchEngine.php', 'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php', 'ManiphestTaskStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php', @@ -3661,6 +3665,7 @@ 'DifferentialRevisionMailReceiver' => 'PhabricatorObjectMailReceiver', 'DifferentialRevisionPHIDType' => 'PhabricatorPHIDType', 'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DifferentialRevisionRevertedByCommitEdgeType' => 'PhabricatorEdgeType', 'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 'DifferentialRevisionViewController' => 'DifferentialController', @@ -3711,6 +3716,8 @@ 'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase', 'DiffusionCommitRevertedByCommitEdgeType' => 'PhabricatorEdgeType', 'DiffusionCommitRevertsCommitEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitRevertsRevisionEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitRevertsTasksEdgeType' => 'PhabricatorEdgeType', 'DiffusionCommitTagsController' => 'DiffusionController', 'DiffusionConduitAPIMethod' => 'ConduitAPIMethod', 'DiffusionController' => 'PhabricatorController', @@ -4359,6 +4366,7 @@ 'ManiphestTaskPriorityDatasource' => 'PhabricatorTypeaheadDatasource', 'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'ManiphestTaskResultListView' => 'ManiphestView', + 'ManiphestTaskRevertedByCommitEdgeType' => 'PhabricatorEdgeType', 'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine', 'ManiphestTaskStatus' => 'ManiphestConstants', 'ManiphestTaskStatusDatasource' => 'PhabricatorTypeaheadDatasource', diff --git a/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php b/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php new file mode 100644 --- /dev/null +++ b/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php @@ -0,0 +1,103 @@ +setTransactionType(PhabricatorTransactions::TYPE_EDGE) ->setMetadataValue('edge:type', $reverts_edge) ->setNewValue(array('+' => array_fuse($reverted_commit_phids))); + + $reverted_commit_data = + id(new PhabricatorRepositoryCommitData())->loadAllWhere( + 'commitID IN (%Ld)', + mpull($reverted_commits, 'getID', 'getID')); + + $differential_app = 'PhabricatorDifferentialApplication'; + if (PhabricatorApplication::isClassInstalled($differential_app)) { + $reverted_revisions = array(); + foreach ($reverted_commit_data as $commit_data) { + $revision = $commit_data->getCommitDetail('differential.revisionID'); + + if ($revision) { + $reverted_revisions[] = $revision; + } + } + + $revisions = array(); + + if ($reverted_revisions) { + $revision_query = id(new DifferentialRevisionQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs(array($reverted_revisions)); + $revisions = $revision_query->execute(); + } + + foreach ($revisions as $revision) { + $diff_editor = id(new DifferentialTransactionEditor()) + ->setActor(PhabricatorUser::getOmnipotentUser()) + ->setActingAsPHID($acting_as_phid) + ->setContentSource($content_source); + + $edge = DifferentialRevisionRevertedByCommitEdgeType::EDGECONST; + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setIgnoreOnNoEffect(true) + ->setMetadataValue('edge:type', $edge) + ->setNewValue(array('=' => $commit->getPHID())); + + $diff_editor->applyTransactions($revision, $xactions); + } + } + + $maniphest_app = 'PhabricatorManiphestApplication'; + if (PhabricatorApplication::isClassInstalled($maniphest_app)) { + $reverted_tasks = array(); + + foreach ($reverted_commit_data as $commit_data) { + $matches = id(new ManiphestCustomFieldStatusParser()) + ->parseCorpus($commit_data->getCommitMessage()); + + foreach ($matches as $match) { + foreach ($match['monograms'] as $task_monogram) { + $reverted_tasks[] = (int)trim($task_monogram, 'tT'); + } + } + } + + $tasks = id(new ManiphestTaskQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs($reverted_tasks) + ->execute(); + + foreach ($tasks as $task) { + $edge_type = ManiphestTaskRevertedByCommitEdgeType::EDGECONST; + $edge_xaction = id(new ManiphestTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + // ->setMetadataValue('commitPHID', $commit->getPHID()) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array( + '=' => array($commit->getPHID() => $commit->getPHID()), + )); + + $content_source = PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, + array()); + + $maniphest_editor = id(new ManiphestTransactionEditor()) + ->setActor(PhabricatorUser::getOmnipotentUser()) + ->setActingAsPHID($acting_as_phid) + ->setContinueOnNoEffect(true) + ->setContinueOnMissingFields(true) + ->setUnmentionablePHIDMap(array($commit->getPHID())) + ->setContentSource($content_source); + + $maniphest_editor->applyTransactions($task, array($edge_xaction)); + } + } + + // TODO: Maybe re-open Maniphest Task. + } try { diff --git a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php --- a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php +++ b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php @@ -169,10 +169,25 @@ 'precommitRevisionStatus', $revision->getStatus()); } - $commit_drev = DiffusionCommitHasRevisionEdgeType::EDGECONST; - id(new PhabricatorEdgeEditor()) - ->addEdge($commit->getPHID(), $commit_drev, $revision->getPHID()) - ->save(); + + $content_source = PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, + array()); + $xactions = array(); + + $editor = id(new DifferentialTransactionEditor()) + ->setActor($actor) + ->setActingAsPHID($acting_as_phid) + ->setContentSource($content_source); + + $edge_type = DifferentialRevisionHasCommitEdgeType::EDGECONST; + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setIgnoreOnNoEffect(true) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array('=' => $commit->getPHID())); + + $editor->applyTransactions($revision, $xactions); queryfx( $conn_w, @@ -238,10 +253,6 @@ ->setMetadataValue('isCommitUpdate', true); $xactions[] = $commit_close_xaction; - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_DAEMON, - array()); - $editor = id(new DifferentialTransactionEditor()) ->setActor($actor) ->setActingAsPHID($acting_as_phid)