1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-23 15:22:41 +01:00

Make updates of rejected revisions behave correctly again

Summary:
Ref T2222. Ref T4481. Specifically:

  - When a revision is updated, change all "Reject" reviewers to "Reject Prior".
  - Change status to "Needs Review".
  - Update the state logic to account for this properly.

Test Plan:
  - Created a revision as user A, with B as a reviewer.
  - Rejected as B.
  - Updated the revision as A.
  - Saw revision in "needs review" state, with B as a "Rejected Prior" reviewer.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T4481, T2222

Differential Revision: https://secure.phabricator.com/D8402
This commit is contained in:
epriestley 2014-03-05 10:47:29 -08:00
parent 857e3aee83
commit 9da6ec2081
3 changed files with 61 additions and 5 deletions

View file

@ -7,6 +7,8 @@ final class DifferentialReviewerStatus {
const STATUS_ACCEPTED = 'accepted'; const STATUS_ACCEPTED = 'accepted';
const STATUS_REJECTED = 'rejected'; const STATUS_REJECTED = 'rejected';
const STATUS_COMMENTED = 'commented'; const STATUS_COMMENTED = 'commented';
const STATUS_ACCEPTED_OLDER = 'accepted-older';
const STATUS_REJECTED_OLDER = 'rejected-older';
/** /**
* Returns the relative strength of a status, used to pick a winner when a * Returns the relative strength of a status, used to pick a winner when a
@ -27,8 +29,11 @@ final class DifferentialReviewerStatus {
self::STATUS_BLOCKING => 3, self::STATUS_BLOCKING => 3,
self::STATUS_ACCEPTED => 4, self::STATUS_ACCEPTED_OLDER => 4,
self::STATUS_REJECTED => 4, self::STATUS_REJECTED_OLDER => 4,
self::STATUS_ACCEPTED => 5,
self::STATUS_REJECTED => 5,
); );
return idx($map, $constant, 0); return idx($map, $constant, 0);

View file

@ -137,6 +137,9 @@ final class DifferentialTransactionEditor
PhabricatorLiskDAO $object, PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) { PhabricatorApplicationTransaction $xaction) {
$status_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW;
$status_revision = ArcanistDifferentialRevisionStatus::NEEDS_REVISION;
switch ($xaction->getTransactionType()) { switch ($xaction->getTransactionType()) {
case PhabricatorTransactions::TYPE_VIEW_POLICY: case PhabricatorTransactions::TYPE_VIEW_POLICY:
$object->setViewPolicy($xaction->getNewValue()); $object->setViewPolicy($xaction->getNewValue());
@ -151,12 +154,10 @@ final class DifferentialTransactionEditor
case PhabricatorTransactions::TYPE_EDGE: case PhabricatorTransactions::TYPE_EDGE:
return; return;
case DifferentialTransaction::TYPE_UPDATE: case DifferentialTransaction::TYPE_UPDATE:
$object->setStatus($status_review);
// TODO: Update the `diffPHID` once we add that. // TODO: Update the `diffPHID` once we add that.
return; return;
case DifferentialTransaction::TYPE_ACTION: case DifferentialTransaction::TYPE_ACTION:
$status_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW;
$status_revision = ArcanistDifferentialRevisionStatus::NEEDS_REVISION;
switch ($xaction->getNewValue()) { switch ($xaction->getNewValue()) {
case DifferentialAction::ACTION_RESIGN: case DifferentialAction::ACTION_RESIGN:
case DifferentialAction::ACTION_ACCEPT: case DifferentialAction::ACTION_ACCEPT:
@ -203,6 +204,38 @@ final class DifferentialTransactionEditor
$results = parent::expandTransaction($object, $xaction); $results = parent::expandTransaction($object, $xaction);
switch ($xaction->getTransactionType()) { switch ($xaction->getTransactionType()) {
case DifferentialTransaction::TYPE_UPDATE:
$new_accept = DifferentialReviewerStatus::STATUS_ACCEPTED;
$new_reject = DifferentialReviewerStatus::STATUS_REJECTED;
$old_accept = DifferentialReviewerStatus::STATUS_ACCEPTED_OLDER;
$old_reject = DifferentialReviewerStatus::STATUS_REJECTED_OLDER;
// When a revision is updated, change all "reject" to "rejected older
// revision". This means we won't immediately push the update back into
// "needs review", but outstanding rejects will still block it from
// moving to "accepted".
$edits = array();
foreach ($object->getReviewerStatus() as $reviewer) {
if ($reviewer->getStatus() == $new_reject) {
$edits[$reviewer->getReviewerPHID()] = array(
'data' => array(
'status' => $old_reject,
),
);
}
// TODO: If sticky accept is off, do a similar update for accepts.
}
if ($edits) {
$results[] = id(new DifferentialTransaction())
->setTransactionType($type_edge)
->setMetadataValue('edge:type', $edge_reviewer)
->setIgnoreOnNoEffect(true)
->setNewValue(array('+' => $edits));
}
break;
case PhabricatorTransactions::TYPE_COMMENT: case PhabricatorTransactions::TYPE_COMMENT:
// When a user leaves a comment, upgrade their reviewer status from // When a user leaves a comment, upgrade their reviewer status from
// "added" to "commented" if they're also a reviewer. We may further // "added" to "commented" if they're also a reviewer. We may further
@ -433,10 +466,12 @@ final class DifferentialTransactionEditor
// //
// - at least one accepting reviewer who is a user; and // - at least one accepting reviewer who is a user; and
// - no rejects; and // - no rejects; and
// - no rejects of older diffs; and
// - no blocking reviewers. // - no blocking reviewers.
$has_accepting_user = false; $has_accepting_user = false;
$has_rejecting_reviewer = false; $has_rejecting_reviewer = false;
$has_rejecting_older_reviewer = false;
$has_blocking_reviewer = false; $has_blocking_reviewer = false;
foreach ($new_revision->getReviewerStatus() as $reviewer) { foreach ($new_revision->getReviewerStatus() as $reviewer) {
$reviewer_status = $reviewer->getStatus(); $reviewer_status = $reviewer->getStatus();
@ -444,6 +479,9 @@ final class DifferentialTransactionEditor
case DifferentialReviewerStatus::STATUS_REJECTED: case DifferentialReviewerStatus::STATUS_REJECTED:
$has_rejecting_reviewer = true; $has_rejecting_reviewer = true;
break; break;
case DifferentialReviewerStatus::STATUS_REJECTED_OLDER:
$has_rejecting_older_reviewer = true;
break;
case DifferentialReviewerStatus::STATUS_BLOCKING: case DifferentialReviewerStatus::STATUS_BLOCKING:
$has_blocking_reviewer = true; $has_blocking_reviewer = true;
break; break;
@ -458,6 +496,7 @@ final class DifferentialTransactionEditor
$new_status = null; $new_status = null;
if ($has_accepting_user && if ($has_accepting_user &&
!$has_rejecting_reviewer && !$has_rejecting_reviewer &&
!$has_rejecting_older_reviewer &&
!$has_blocking_reviewer) { !$has_blocking_reviewer) {
$new_status = $status_accepted; $new_status = $status_accepted;
} else if ($has_rejecting_reviewer) { } else if ($has_rejecting_reviewer) {

View file

@ -58,6 +58,12 @@ final class DifferentialReviewersView extends AphrontView {
} }
break; break;
case DifferentialReviewerStatus::STATUS_ACCEPTED_OLDER:
$item->setIcon(
'accept-dark',
pht('Accepted Prior Diff'));
break;
case DifferentialReviewerStatus::STATUS_REJECTED: case DifferentialReviewerStatus::STATUS_REJECTED:
if ($is_current) { if ($is_current) {
$item->setIcon( $item->setIcon(
@ -70,6 +76,12 @@ final class DifferentialReviewersView extends AphrontView {
} }
break; break;
case DifferentialReviewerStatus::STATUS_REJECTED_OLDER:
$item->setIcon(
'reject-dark',
pht('Rejected Prior Diff'));
break;
case DifferentialReviewerStatus::STATUS_COMMENTED: case DifferentialReviewerStatus::STATUS_COMMENTED:
if ($is_current) { if ($is_current) {
$item->setIcon( $item->setIcon(