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 @@ -466,6 +466,7 @@ 'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php', 'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php', 'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php', + 'DifferentialRevisionRevertedByCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php', 'DifferentialRevisionReviewersHeraldField' => 'applications/differential/herald/DifferentialRevisionReviewersHeraldField.php', 'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php', 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', @@ -540,6 +541,8 @@ 'DiffusionCommitRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryProjectsHeraldField.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', 'DiffusionCommitReviewerHeraldField' => 'applications/diffusion/herald/DiffusionCommitReviewerHeraldField.php', 'DiffusionCommitRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionAcceptedHeraldField.php', 'DiffusionCommitRevisionHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionHeraldField.php', @@ -1203,6 +1206,7 @@ 'ManiphestTaskPriorityHeraldField' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldField.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', @@ -4063,6 +4067,7 @@ 'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionRevertedByCommitEdgeType' => 'PhabricatorEdgeType', 'DifferentialRevisionReviewersHeraldField' => 'DifferentialRevisionHeraldField', 'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DifferentialRevisionStatus' => 'Phobject', @@ -4137,6 +4142,8 @@ 'DiffusionCommitRepositoryProjectsHeraldField' => 'DiffusionCommitHeraldField', 'DiffusionCommitRevertedByCommitEdgeType' => 'PhabricatorEdgeType', 'DiffusionCommitRevertsCommitEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitRevertsRevisionEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitRevertsTasksEdgeType' => 'PhabricatorEdgeType', 'DiffusionCommitReviewerHeraldField' => 'DiffusionCommitHeraldField', 'DiffusionCommitRevisionAcceptedHeraldField' => 'DiffusionCommitHeraldField', 'DiffusionCommitRevisionHeraldField' => 'DiffusionCommitHeraldField', @@ -4917,6 +4924,7 @@ 'ManiphestTaskPriorityHeraldField' => 'ManiphestTaskHeraldField', '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))); + ->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_revision_ids = array(); + + foreach ($reverted_commit_data as $commit_data) { + $revision = $commit_data->getCommitDetail('differential.revisionID'); + + if ($revision) { + $reverted_revision_ids[] = $revision; + } + } + + $revision_query = id(new DifferentialRevisionQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs($reverted_revision_ids); + $reverted_revisions = $revision_query->execute(); + + foreach ($reverted_revisions as $revision) { + $edge_type = DifferentialRevisionRevertedByCommitEdgeType::EDGECONST; + $xaction = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array( + '+' => array($commit->getPHID() => $commit->getPHID()), + )); + + $diff_editor = id(new DifferentialTransactionEditor()) + ->setActor(PhabricatorUser::getOmnipotentUser()) + ->setActingAsPHID($acting_as_phid) + ->setContentSource(PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, array())) + ->setContinueOnNoEffect(true); + + $diff_editor->applyTransactions($revision, array($xaction)); + } + } + + $maniphest_app = 'PhabricatorManiphestApplication'; + if (PhabricatorApplication::isClassInstalled($maniphest_app)) { + $reverted_task_ids = array(); + + foreach ($reverted_commit_data as $commit_data) { + $monograms = ipull( + id(new ManiphestCustomFieldStatusParser()) + ->parseCorpus($commit_data->getCommitMessage()), + 'monograms'); + $monograms = array_mergev($monograms); + + foreach ($monograms as $monogram) { + $reverted_task_ids[] = (int)trim($monogram, 'tT'); + } + } + + $task_query = id(new ManiphestTaskQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs($reverted_task_ids); + $reverted_tasks = $task_query->execute(); + + foreach ($reverted_tasks as $task) { + $edge_type = ManiphestTaskRevertedByCommitEdgeType::EDGECONST; + $xaction = id(new ManiphestTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array( + '+' => array($commit->getPHID() => $commit->getPHID()), + )); + + $maniphest_editor = id(new ManiphestTransactionEditor()) + ->setActor(PhabricatorUser::getOmnipotentUser()) + ->setActingAsPHID($acting_as_phid) + ->setContentSource(PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, array())) + ->setContinueOnNoEffect(true); + + $maniphest_editor->applyTransactions($task, array($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,22 @@ 'precommitRevisionStatus', $revision->getStatus()); } - $commit_drev = DiffusionCommitHasRevisionEdgeType::EDGECONST; - id(new PhabricatorEdgeEditor()) - ->addEdge($commit->getPHID(), $commit_drev, $revision->getPHID()) - ->save(); + + $editor = id(new DifferentialTransactionEditor()) + ->setActor($actor) + ->setActingAsPHID($acting_as_phid) + ->setContentSource(PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, array())); + + $edge_type = DifferentialRevisionHasCommitEdgeType::EDGECONST; + $xaction = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) + ->setMetadataValue('edge:type', $edge_type) + ->setNewValue(array( + '+' => array($commit->getPHID() => $commit->getPHID()), + )); + + $editor->applyTransactions($revision, array($xaction)); queryfx( $conn_w, @@ -238,15 +250,12 @@ ->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) ->setContinueOnMissingFields(true) - ->setContentSource($content_source) + ->setContentSource(PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, array())) ->setChangedPriorToCommitURI($changed_uri) ->setIsCloseByCommit(true); @@ -504,12 +513,9 @@ $edge_xaction = id(new ManiphestTransaction()) ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) ->setMetadataValue('edge:type', $edge_type) - ->setNewValue( - array( - '+' => array( - $commit->getPHID() => $commit->getPHID(), - ), - )); + ->setNewValue(array( + '+' => array($commit->getPHID() => $commit->getPHID()), + )); $status = $task_statuses[$task_id]; if ($status) { @@ -525,10 +531,6 @@ $xactions[] = $edge_xaction; - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_DAEMON, - array()); - $editor = id(new ManiphestTransactionEditor()) ->setActor($actor) ->setActingAsPHID($acting_as) @@ -536,7 +538,8 @@ ->setContinueOnMissingFields(true) ->setUnmentionablePHIDMap( array($commit->getPHID() => $commit->getPHID())) - ->setContentSource($content_source); + ->setContentSource(PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_DAEMON, array())); $editor->applyTransactions($task, $xactions); }