Differential D17067 Diff 41083 src/applications/differential/xaction/DifferentialRevisionReviewersTransaction.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/xaction/DifferentialRevisionReviewersTransaction.php
| <?php | <?php | ||||
| final class DifferentialRevisionReviewersTransaction | final class DifferentialRevisionReviewersTransaction | ||||
| extends DifferentialRevisionTransactionType { | extends DifferentialRevisionTransactionType { | ||||
| const TRANSACTIONTYPE = 'differential.revision.reviewers'; | const TRANSACTIONTYPE = 'differential.revision.reviewers'; | ||||
| const EDITKEY = 'reviewers'; | |||||
| public function generateOldValue($object) { | public function generateOldValue($object) { | ||||
| $reviewers = $object->getReviewerStatus(); | $reviewers = $object->getReviewerStatus(); | ||||
| $reviewers = mpull($reviewers, 'getStatus', 'getReviewerPHID'); | $reviewers = mpull($reviewers, 'getStatus', 'getReviewerPHID'); | ||||
| return $reviewers; | return $reviewers; | ||||
| } | } | ||||
| public function generateNewValue($object, $value) { | public function generateNewValue($object, $value) { | ||||
| $actor = $this->getActor(); | $actor = $this->getActor(); | ||||
| $datasource = id(new DifferentialBlockingReviewerDatasource()) | $datasource = id(new DifferentialBlockingReviewerDatasource()) | ||||
| ->setViewer($actor); | ->setViewer($actor); | ||||
| $reviewers = $this->generateOldValue($object); | $reviewers = $this->generateOldValue($object); | ||||
| $old_reviewers = $reviewers; | |||||
| // First, remove any reviewers we're getting rid of. | // First, remove any reviewers we're getting rid of. | ||||
| $rem = idx($value, '-', array()); | $rem = idx($value, '-', array()); | ||||
| $rem = $datasource->evaluateTokens($rem); | $rem = $datasource->evaluateTokens($rem); | ||||
| foreach ($rem as $phid) { | foreach ($rem as $phid) { | ||||
| unset($reviewers[$phid]); | unset($reviewers[$phid]); | ||||
| } | } | ||||
| Show All 29 Lines | if ($set !== null) { | ||||
| // We treat setting reviewers as though they were being added to an | // We treat setting reviewers as though they were being added to an | ||||
| // empty list, so we can share more code between pathways. | // empty list, so we can share more code between pathways. | ||||
| $reviewers = array(); | $reviewers = array(); | ||||
| } | } | ||||
| $status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING; | $status_blocking = DifferentialReviewerStatus::STATUS_BLOCKING; | ||||
| foreach ($add_map as $phid => $new_status) { | foreach ($add_map as $phid => $new_status) { | ||||
| $old_status = idx($reviewers, $phid); | $old_status = idx($old_reviewers, $phid); | ||||
| // If we have an old status and this didn't make the reviewer blocking | // If we have an old status and this didn't make the reviewer blocking | ||||
| // or nonblocking, just retain the old status. This makes sure we don't | // or nonblocking, just retain the old status. This makes sure we don't | ||||
| // throw away rejects, accepts, etc. | // throw away rejects, accepts, etc. | ||||
| if ($old_status) { | if ($old_status) { | ||||
| $was_blocking = ($old_status == $status_blocking); | $was_blocking = ($old_status == $status_blocking); | ||||
| $now_blocking = ($new_status == $status_blocking); | $now_blocking = ($new_status == $status_blocking); | ||||
| $is_block = ($now_blocking && !$was_blocking); | $is_block = ($now_blocking && !$was_blocking); | ||||
| $is_unblock = (!$now_blocking && $was_blocking); | $is_unblock = (!$now_blocking && $was_blocking); | ||||
| if (!$is_block && !$is_unblock) { | if (!$is_block && !$is_unblock) { | ||||
| $reviewers[$phid] = $old_status; | |||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| $reviewers[$phid] = $new_status; | $reviewers[$phid] = $new_status; | ||||
| } | } | ||||
| return $reviewers; | return $reviewers; | ||||
| } | } | ||||
| public function getTransactionHasEffect($object, $old, $new) { | |||||
| // At least for now, we ignore transactions which ONLY reorder reviewers | |||||
| // without making any actual changes. | |||||
| ksort($old); | |||||
| ksort($new); | |||||
| return ($old !== $new); | |||||
| } | |||||
| public function applyExternalEffects($object, $value) { | public function applyExternalEffects($object, $value) { | ||||
| $src_phid = $object->getPHID(); | $src_phid = $object->getPHID(); | ||||
| $old = $this->generateOldValue($object); | $old = $this->generateOldValue($object); | ||||
| $new = $value; | $new = $value; | ||||
| $edge_type = DifferentialRevisionHasReviewerEdgeType::EDGECONST; | $edge_type = DifferentialRevisionHasReviewerEdgeType::EDGECONST; | ||||
| $editor = new PhabricatorEdgeEditor(); | $editor = new PhabricatorEdgeEditor(); | ||||
| ▲ Show 20 Lines • Show All 261 Lines • Show Last 20 Lines | |||||