Page MenuHomePhabricator

D12634.id30394.diff
No OneTemporary

D12634.id30394.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
@@ -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 @@
+<?php
+
+final class DifferentialRevisionRevertedByCommitEdgeType
+ extends PhabricatorEdgeType {
+
+ const EDGECONST = 58;
+
+ public function getInverseEdgeConstant() {
+ return DiffusionCommitRevertsRevisionEdgeType::EDGECONST;
+ }
+
+ public function shouldWriteInverseTransactions() {
+ return true;
+ }
+
+ public function getTransactionAddString(
+ $actor,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s): %s.',
+ $actor,
+ $add_count,
+ $add_edges);
+ }
+
+ public function getTransactionRemoveString(
+ $actor,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s): %s.',
+ $actor,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getTransactionEditString(
+ $actor,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+ $actor,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getFeedAddString(
+ $actor,
+ $object,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s) for %s: %s.',
+ $actor,
+ $add_count,
+ $object,
+ $add_edges);
+ }
+
+ public function getFeedRemoveString(
+ $actor,
+ $object,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s) for %s: %s.',
+ $actor,
+ $rem_count,
+ $object,
+ $rem_edges);
+ }
+
+ public function getFeedEditString(
+ $actor,
+ $object,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+ $actor,
+ $object,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+}
diff --git a/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php b/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php
@@ -0,0 +1,107 @@
+<?php
+
+final class DiffusionCommitRevertsRevisionEdgeType extends PhabricatorEdgeType {
+
+ const EDGECONST = 57;
+
+ public function getInverseEdgeConstant() {
+ return DifferentialRevisionRevertedByCommitEdgeType::EDGECONST;
+ }
+
+ public function shouldWriteInverseTransactions() {
+ return true;
+ }
+
+ public function shouldPreventCycles() {
+ return true;
+ }
+
+ public function getTransactionAddString(
+ $actor,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s): %s.',
+ $actor,
+ $add_count,
+ $add_edges);
+ }
+
+ public function getTransactionRemoveString(
+ $actor,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s): %s.',
+ $actor,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getTransactionEditString(
+ $actor,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+ $actor,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getFeedAddString(
+ $actor,
+ $object,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s) for %s: %s.',
+ $actor,
+ $add_count,
+ $object,
+ $add_edges);
+ }
+
+ public function getFeedRemoveString(
+ $actor,
+ $object,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s) for %s: %s.',
+ $actor,
+ $rem_count,
+ $object,
+ $rem_edges);
+ }
+
+ public function getFeedEditString(
+ $actor,
+ $object,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+ $actor,
+ $object,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+}
diff --git a/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php b/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php
@@ -0,0 +1,107 @@
+<?php
+
+final class DiffusionCommitRevertsTasksEdgeType extends PhabricatorEdgeType {
+
+ const EDGECONST = 59;
+
+ public function getInverseEdgeConstant() {
+ return ManiphestTaskRevertedByCommitEdgeType::EDGECONST;
+ }
+
+ public function shouldWriteInverseTransactions() {
+ return true;
+ }
+
+ public function shouldPreventCycles() {
+ return true;
+ }
+
+ public function getTransactionAddString(
+ $actor,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s): %s.',
+ $actor,
+ $add_count,
+ $add_edges);
+ }
+
+ public function getTransactionRemoveString(
+ $actor,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s): %s.',
+ $actor,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getTransactionEditString(
+ $actor,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+ $actor,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getFeedAddString(
+ $actor,
+ $object,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s) for %s: %s.',
+ $actor,
+ $add_count,
+ $object,
+ $add_edges);
+ }
+
+ public function getFeedRemoveString(
+ $actor,
+ $object,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s) for %s: %s.',
+ $actor,
+ $rem_count,
+ $object,
+ $rem_edges);
+ }
+
+ public function getFeedEditString(
+ $actor,
+ $object,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+ $actor,
+ $object,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+}
diff --git a/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php b/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php
@@ -0,0 +1,105 @@
+<?php
+
+final class ManiphestTaskRevertedByCommitEdgeType extends PhabricatorEdgeType {
+
+ const EDGECONST = 60;
+
+ public function shouldWriteInverseTransactions() {
+ return true;
+ }
+
+ public function getInverseEdgeConstant() {
+ return DiffusionCommitRevertsTasksEdgeType::EDGECONST;
+ }
+
+ public function getTransactionAddString(
+ $actor,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s): %s.',
+ $actor,
+ $add_count,
+ $add_edges);
+ }
+
+ public function getTransactionRemoveString(
+ $actor,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s): %s.',
+ $actor,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getTransactionEditString(
+ $actor,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited %s reverting commit(s), added %s: %s; removed %s: %s.',
+ $actor,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+ public function getFeedAddString(
+ $actor,
+ $object,
+ $add_count,
+ $add_edges) {
+
+ return pht(
+ '%s added %s reverting commit(s) to %s: %s.',
+ $actor,
+ $add_count,
+ $object,
+ $add_edges);
+ }
+
+ public function getFeedRemoveString(
+ $actor,
+ $object,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s removed %s reverting commit(s) from %s: %s.',
+ $actor,
+ $rem_count,
+ $object,
+ $rem_edges);
+ }
+
+ public function getFeedEditString(
+ $actor,
+ $object,
+ $total_count,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges) {
+
+ return pht(
+ '%s edited %s reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+ $actor,
+ $total_count,
+ $object,
+ $add_count,
+ $add_edges,
+ $rem_count,
+ $rem_edges);
+ }
+
+}
diff --git a/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php b/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
--- a/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
+++ b/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
@@ -80,7 +80,93 @@
$xactions[] = id(new PhabricatorAuditTransaction())
->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);
@@ -511,12 +520,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) {
@@ -532,10 +538,6 @@
$xactions[] = $edge_xaction;
- $content_source = PhabricatorContentSource::newForSource(
- PhabricatorContentSource::SOURCE_DAEMON,
- array());
-
$editor = id(new ManiphestTransactionEditor())
->setActor($actor)
->setActingAsPHID($acting_as)
@@ -543,7 +545,8 @@
->setContinueOnMissingFields(true)
->setUnmentionablePHIDMap(
array($commit->getPHID() => $commit->getPHID()))
- ->setContentSource($content_source);
+ ->setContentSource(PhabricatorContentSource::newForSource(
+ PhabricatorContentSource::SOURCE_DAEMON, array()));
$editor->applyTransactions($task, $xactions);
}

File Metadata

Mime Type
text/plain
Expires
Thu, May 9, 6:04 PM (2 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6275353
Default Alt Text
D12634.id30394.diff (20 KB)

Event Timeline