mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-30 01:10:58 +01:00
Improve detection of no-op edge edits in ApplicationTransactions
Summary: Ref T4379. When you add a redundant edge, we currently compare the values strictly, using `===`. However, the old and new versions of the edge have slightly different member data, because one has been synthetically constructed and one has been read from the database. Instead, compare only the things we actually care about: # Were any destintations added or removed? # Was any edge data changed? If the answer to both questions is "no", consider the update a no-op. Test Plan: In the next diff, I'm making project members use the EDGE transaction type. Before this change, adding an existing project member would generate a transaction with no changes. Now, it is correctly detected as a no-op, while normal transactions continue to work properly. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4379 Differential Revision: https://secure.phabricator.com/D8166
This commit is contained in:
parent
21de2b1a0c
commit
2141a28f1b
1 changed files with 33 additions and 1 deletions
|
@ -208,6 +208,38 @@ abstract class PhabricatorApplicationTransactionEditor
|
|||
case PhabricatorTransactions::TYPE_CUSTOMFIELD:
|
||||
$field = $this->getCustomFieldForTransaction($object, $xaction);
|
||||
return $field->getApplicationTransactionHasEffect($xaction);
|
||||
case PhabricatorTransactions::TYPE_EDGE:
|
||||
// A straight value comparison here doesn't always get the right
|
||||
// result, because newly added edges aren't fully populated. Instead,
|
||||
// compare the changes in a more granular way.
|
||||
$old = $xaction->getOldValue();
|
||||
$new = $xaction->getNewValue();
|
||||
|
||||
$old_dst = array_keys($old);
|
||||
$new_dst = array_keys($new);
|
||||
|
||||
// NOTE: For now, we don't consider edge reordering to be a change.
|
||||
// We have very few order-dependent edges and effectively no order
|
||||
// oriented UI. This might change in the future.
|
||||
sort($old_dst);
|
||||
sort($new_dst);
|
||||
|
||||
if ($old_dst !== $new_dst) {
|
||||
// We've added or removed edges, so this transaction definitely
|
||||
// has an effect.
|
||||
return true;
|
||||
}
|
||||
|
||||
// We haven't added or removed edges, but we might have changed
|
||||
// edge data.
|
||||
foreach ($old as $key => $old_value) {
|
||||
$new_value = $new[$key];
|
||||
if ($old_value['data'] !== $new_value['data']) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return ($xaction->getOldValue() !== $xaction->getNewValue());
|
||||
|
@ -1011,7 +1043,7 @@ abstract class PhabricatorApplicationTransactionEditor
|
|||
}
|
||||
|
||||
if (!isset($edge['data'])) {
|
||||
$edge['data'] = null;
|
||||
$edge['data'] = array();
|
||||
}
|
||||
|
||||
return $edge;
|
||||
|
|
Loading…
Reference in a new issue