mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-29 00:40:57 +01:00
Allow revisions to be commandeered
Summary: - Adds "Commandeer Revision", to allow you to plunder revisions from those lost to sea (e.g., interns who have left or co-workers who are dealing with a family emergency). - Removes admin-abandon to simplify things, since you can just Commandeer + Abandon now. - There are other workarounds available but this is the natural/expected workflow (and the one everyone always asks for) and there's no real reason not to allow it. Test Plan: Swashbuckled. Reviewers: cpiro, btrahan, vrana, jungejason Reviewed By: cpiro CC: aran, zeeg Differential Revision: https://secure.phabricator.com/D2257
This commit is contained in:
parent
74cdad29d0
commit
68d90ef698
4 changed files with 41 additions and 17 deletions
|
@ -33,6 +33,7 @@ final class DifferentialAction {
|
|||
const ACTION_CREATE = 'create';
|
||||
const ACTION_ADDREVIEWERS = 'add_reviewers';
|
||||
const ACTION_ADDCCS = 'add_ccs';
|
||||
const ACTION_CLAIM = 'claim';
|
||||
|
||||
public static function getActionPastTenseVerb($action) {
|
||||
static $verbs = array(
|
||||
|
@ -51,6 +52,7 @@ final class DifferentialAction {
|
|||
self::ACTION_CREATE => 'created',
|
||||
self::ACTION_ADDREVIEWERS => 'added reviewers to',
|
||||
self::ACTION_ADDCCS => 'added CCs to',
|
||||
self::ACTION_CLAIM => 'commandeered',
|
||||
);
|
||||
|
||||
if (!empty($verbs[$action])) {
|
||||
|
@ -73,6 +75,7 @@ final class DifferentialAction {
|
|||
self::ACTION_ADDREVIEWERS => 'Add Reviewers',
|
||||
self::ACTION_ADDCCS => 'Add CCs',
|
||||
self::ACTION_COMMIT => 'Mark Committed',
|
||||
self::ACTION_CLAIM => 'Commandeer Revision',
|
||||
);
|
||||
|
||||
if (!empty($verbs[$action])) {
|
||||
|
|
|
@ -477,17 +477,16 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
|||
$actions = array(
|
||||
DifferentialAction::ACTION_COMMENT => true,
|
||||
);
|
||||
$admin_actions = array();
|
||||
|
||||
$viewer = $this->getRequest()->getUser();
|
||||
$viewer_phid = $viewer->getPHID();
|
||||
$viewer_is_admin = $viewer->getIsAdmin();
|
||||
$viewer_is_owner = ($viewer_phid == $revision->getAuthorPHID());
|
||||
$viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers());
|
||||
$viewer_did_accept = ($viewer_phid === $revision->loadReviewedBy());
|
||||
$status = $revision->getStatus();
|
||||
|
||||
if ($viewer_is_owner) {
|
||||
switch ($revision->getStatus()) {
|
||||
switch ($status) {
|
||||
case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
|
||||
$actions[DifferentialAction::ACTION_ABANDON] = true;
|
||||
$actions[DifferentialAction::ACTION_RETHINK] = true;
|
||||
|
@ -509,20 +508,17 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
|||
break;
|
||||
}
|
||||
} else {
|
||||
switch ($revision->getStatus()) {
|
||||
switch ($status) {
|
||||
case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
|
||||
$admin_actions[DifferentialAction::ACTION_ABANDON] = $viewer_is_admin;
|
||||
$actions[DifferentialAction::ACTION_ACCEPT] = true;
|
||||
$actions[DifferentialAction::ACTION_REJECT] = true;
|
||||
$actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer;
|
||||
break;
|
||||
case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
|
||||
$admin_actions[DifferentialAction::ACTION_ABANDON] = $viewer_is_admin;
|
||||
$actions[DifferentialAction::ACTION_ACCEPT] = true;
|
||||
$actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer;
|
||||
break;
|
||||
case ArcanistDifferentialRevisionStatus::ACCEPTED:
|
||||
$admin_actions[DifferentialAction::ACTION_ABANDON] = $viewer_is_admin;
|
||||
$actions[DifferentialAction::ACTION_REJECT] = true;
|
||||
$actions[DifferentialAction::ACTION_RESIGN] =
|
||||
$viewer_is_reviewer && !$viewer_did_accept;
|
||||
|
@ -531,22 +527,19 @@ final class DifferentialRevisionViewController extends DifferentialController {
|
|||
case ArcanistDifferentialRevisionStatus::ABANDONED:
|
||||
break;
|
||||
}
|
||||
if ($status != ArcanistDifferentialRevisionStatus::COMMITTED) {
|
||||
$actions[DifferentialAction::ACTION_CLAIM] = true;
|
||||
}
|
||||
}
|
||||
|
||||
$actions[DifferentialAction::ACTION_ADDREVIEWERS] = true;
|
||||
$actions[DifferentialAction::ACTION_ADDCCS] = true;
|
||||
|
||||
$actions = array_keys(array_filter($actions));
|
||||
$admin_actions = array_keys(array_filter($admin_actions));
|
||||
$actions_dict = array();
|
||||
|
||||
foreach ($actions as $action) {
|
||||
$actions_dict[$action] = DifferentialAction::getActionVerb($action);
|
||||
}
|
||||
foreach ($admin_actions as $action) {
|
||||
$actions_dict[$action] =
|
||||
'(Admin) ' . DifferentialAction::getActionVerb($action);
|
||||
}
|
||||
|
||||
return $actions_dict;
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ final class DifferentialCommentEditor {
|
|||
return $this->changedByCommit;
|
||||
}
|
||||
|
||||
public function setAddedReviewers($added_reviewers) {
|
||||
public function setAddedReviewers(array $added_reviewers) {
|
||||
$this->addedReviewers = $added_reviewers;
|
||||
return $this;
|
||||
}
|
||||
|
@ -101,7 +101,6 @@ final class DifferentialCommentEditor {
|
|||
$actor_phid = $this->actorPHID;
|
||||
$actor = id(new PhabricatorUser())->loadOneWhere('PHID = %s', $actor_phid);
|
||||
$actor_is_author = ($actor_phid == $revision->getAuthorPHID());
|
||||
$actor_is_admin = $actor->getIsAdmin();
|
||||
$revision_status = $revision->getStatus();
|
||||
|
||||
$revision->loadRelationships();
|
||||
|
@ -147,7 +146,7 @@ final class DifferentialCommentEditor {
|
|||
break;
|
||||
|
||||
case DifferentialAction::ACTION_ABANDON:
|
||||
if (!($actor_is_author || $actor_is_admin)) {
|
||||
if (!$actor_is_author) {
|
||||
throw new Exception('You can only abandon your own revisions.');
|
||||
}
|
||||
|
||||
|
@ -363,7 +362,6 @@ final class DifferentialCommentEditor {
|
|||
if ($added_reviewers) {
|
||||
$key = DifferentialComment::METADATA_ADDED_REVIEWERS;
|
||||
$metadata[$key] = $added_reviewers;
|
||||
|
||||
} else {
|
||||
$user_tried_to_add = count($this->getAddedReviewers());
|
||||
if ($user_tried_to_add == 0) {
|
||||
|
@ -414,6 +412,32 @@ final class DifferentialCommentEditor {
|
|||
"authors, reviewers or CCs.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DifferentialAction::ACTION_CLAIM:
|
||||
if ($actor_is_author) {
|
||||
throw new Exception("You can not commandeer your own revision.");
|
||||
}
|
||||
|
||||
switch ($revision_status) {
|
||||
case ArcanistDifferentialRevisionStatus::COMMITTED:
|
||||
throw new DifferentialActionHasNoEffectException(
|
||||
"You can not commandeer this revision because it has ".
|
||||
"already been committed.");
|
||||
break;
|
||||
}
|
||||
|
||||
$this->setAddedReviewers(array($revision->getAuthorPHID()));
|
||||
|
||||
// NOTE: Set the new author PHID before calling addReviewers(), since it
|
||||
// doesn't permit the author to become a reviewer.
|
||||
$revision->setAuthorPHID($actor_phid);
|
||||
|
||||
$added_reviewers = $this->addReviewers();
|
||||
if ($added_reviewers) {
|
||||
$key = DifferentialComment::METADATA_ADDED_REVIEWERS;
|
||||
$metadata[$key] = $added_reviewers;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new Exception('Unsupported action.');
|
||||
|
|
|
@ -104,3 +104,7 @@
|
|||
.phabricator-transaction-view .differential-comment-action-request_review {
|
||||
border-color: #cc9966;
|
||||
}
|
||||
|
||||
.phabricator-transaction-view .differential-comment-action-claim {
|
||||
border-color: #000000;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue