diff --git a/src/applications/diffusion/xaction/DiffusionCommitAuditorsTransaction.php b/src/applications/diffusion/xaction/DiffusionCommitAuditorsTransaction.php --- a/src/applications/diffusion/xaction/DiffusionCommitAuditorsTransaction.php +++ b/src/applications/diffusion/xaction/DiffusionCommitAuditorsTransaction.php @@ -58,6 +58,31 @@ return ($old !== $new); } + public function mergeTransactions( + $object, + PhabricatorApplicationTransaction $u, + PhabricatorApplicationTransaction $v) { + + $u_new = $u->getNewValue(); + $v_new = $v->getNewValue(); + + $result = $v_new; + foreach (array('-', '+') as $key) { + $u_value = idx($u_new, $key, array()); + $v_value = idx($v_new, $key, array()); + + $merged = $u_value + $v_value; + + if ($merged) { + $result[$key] = $merged; + } + } + + $u->setNewValue($result); + + return $u; + } + public function applyExternalEffects($object, $value) { $src_phid = $object->getPHID(); diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -1462,6 +1462,12 @@ $type = $u->getTransactionType(); + $xtype = $this->getModularTransactionType($type); + if ($xtype) { + $object = $this->object; + return $xtype->mergeTransactions($object, $u, $v); + } + switch ($type) { case PhabricatorTransactions::TYPE_SUBSCRIBERS: return $this->mergePHIDOrEdgeTransactions($u, $v); diff --git a/src/applications/transactions/storage/PhabricatorModularTransactionType.php b/src/applications/transactions/storage/PhabricatorModularTransactionType.php --- a/src/applications/transactions/storage/PhabricatorModularTransactionType.php +++ b/src/applications/transactions/storage/PhabricatorModularTransactionType.php @@ -87,6 +87,13 @@ return array(); } + public function mergeTransactions( + $object, + PhabricatorApplicationTransaction $u, + PhabricatorApplicationTransaction $v) { + return null; + } + final public function setStorage( PhabricatorApplicationTransaction $xaction) { $this->storage = $xaction;