diff --git a/src/applications/differential/xaction/DifferentialRevisionResignTransaction.php b/src/applications/differential/xaction/DifferentialRevisionResignTransaction.php --- a/src/applications/differential/xaction/DifferentialRevisionResignTransaction.php +++ b/src/applications/differential/xaction/DifferentialRevisionResignTransaction.php @@ -44,7 +44,9 @@ public function generateOldValue($object) { $actor = $this->getActor(); - return !$this->isViewerAnyReviewer($object, $actor); + $resigned = DifferentialReviewerStatus::STATUS_RESIGNED; + + return ($this->getViewerReviewerStatus($object, $actor) == $resigned); } public function applyExternalEffects($object, $value) { @@ -61,12 +63,19 @@ 'been closed. You can only resign from open revisions.')); } - if (!$this->isViewerAnyReviewer($object, $viewer)) { + $resigned = DifferentialReviewerStatus::STATUS_RESIGNED; + if ($this->getViewerReviewerStatus($object, $viewer) == $resigned) { + throw new Exception( + pht( + 'You can not resign from this revision because you have already '. + 'resigned.')); + } + + if (!$this->isViewerAnyAuthority($object, $viewer)) { throw new Exception( pht( 'You can not resign from this revision because you are not a '. - 'reviewer. You can only resign from revisions where you are a '. - 'reviewer.')); + 'reviewer, and do not have authority over any reviewer.')); } } diff --git a/src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php b/src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php --- a/src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php +++ b/src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php @@ -33,6 +33,20 @@ return ($this->getViewerReviewerStatus($revision, $viewer) !== null); } + protected function isViewerAnyAuthority( + DifferentialRevision $revision, + PhabricatorUser $viewer) { + + $reviewers = $revision->getReviewers(); + foreach ($revision->getReviewers() as $reviewer) { + if ($reviewer->hasAuthority($viewer)) { + return true; + } + } + + return false; + } + protected function isViewerFullyAccepted( DifferentialRevision $revision, PhabricatorUser $viewer) { diff --git a/src/applications/differential/xaction/DifferentialRevisionTransactionType.php b/src/applications/differential/xaction/DifferentialRevisionTransactionType.php --- a/src/applications/differential/xaction/DifferentialRevisionTransactionType.php +++ b/src/applications/differential/xaction/DifferentialRevisionTransactionType.php @@ -60,6 +60,9 @@ protected function getActiveDiffPHID(DifferentialRevision $revision) { try { $diff = $revision->getActiveDiff(); + if (!$diff) { + return null; + } return $diff->getPHID(); } catch (Exception $ex) { return null;