Differential D17114 Diff 41171 src/applications/differential/xaction/DifferentialRevisionActionTransaction.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/xaction/DifferentialRevisionActionTransaction.php
- This file was copied to src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php.
Show All 13 Lines | public function isActionAvailable($object, PhabricatorUser $viewer) { | ||||
} catch (Exception $ex) { | } catch (Exception $ex) { | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
abstract protected function validateAction($object, PhabricatorUser $viewer); | abstract protected function validateAction($object, PhabricatorUser $viewer); | ||||
abstract protected function getRevisionActionLabel(); | abstract protected function getRevisionActionLabel(); | ||||
protected function getRevisionActionGroupKey() { | |||||
return DifferentialRevisionEditEngine::ACTIONGROUP_REVISION; | |||||
} | |||||
protected function getRevisionActionDescription() { | protected function getRevisionActionDescription() { | ||||
return null; | return null; | ||||
} | } | ||||
public static function loadAllActions() { | public static function loadAllActions() { | ||||
return id(new PhutilClassMapQuery()) | return id(new PhutilClassMapQuery()) | ||||
->setAncestorClass(__CLASS__) | ->setAncestorClass(__CLASS__) | ||||
->setUniqueMethod('getRevisionActionKey') | ->setUniqueMethod('getRevisionActionKey') | ||||
->execute(); | ->execute(); | ||||
} | } | ||||
protected function isViewerRevisionAuthor( | protected function isViewerRevisionAuthor( | ||||
DifferentialRevision $revision, | DifferentialRevision $revision, | ||||
PhabricatorUser $viewer) { | PhabricatorUser $viewer) { | ||||
if (!$viewer->getPHID()) { | if (!$viewer->getPHID()) { | ||||
return false; | return false; | ||||
} | } | ||||
return ($viewer->getPHID() === $revision->getAuthorPHID()); | return ($viewer->getPHID() === $revision->getAuthorPHID()); | ||||
} | } | ||||
protected function isViewerAnyReviewer( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer) { | |||||
return ($this->getViewerReviewerStatus($revision, $viewer) !== null); | |||||
} | |||||
protected function isViewerAcceptingReviewer( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer) { | |||||
return $this->isViewerReviewerStatusAmong( | |||||
$revision, | |||||
$viewer, | |||||
array( | |||||
DifferentialReviewerStatus::STATUS_ACCEPTED, | |||||
)); | |||||
} | |||||
protected function isViewerRejectingReviewer( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer) { | |||||
return $this->isViewerReviewerStatusAmong( | |||||
$revision, | |||||
$viewer, | |||||
array( | |||||
DifferentialReviewerStatus::STATUS_REJECTED, | |||||
)); | |||||
} | |||||
protected function getViewerReviewerStatus( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer) { | |||||
if (!$viewer->getPHID()) { | |||||
return null; | |||||
} | |||||
foreach ($revision->getReviewerStatus() as $reviewer) { | |||||
if ($reviewer->getReviewerPHID() != $viewer->getPHID()) { | |||||
continue; | |||||
} | |||||
return $reviewer->getStatus(); | |||||
} | |||||
return null; | |||||
} | |||||
protected function isViewerReviewerStatusAmong( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer, | |||||
array $status_list) { | |||||
$status = $this->getViewerReviewerStatus($revision, $viewer); | |||||
if ($status === null) { | |||||
return false; | |||||
} | |||||
$status_map = array_fuse($status_list); | |||||
return isset($status_map[$status]); | |||||
} | |||||
protected function applyReviewerEffect( | |||||
DifferentialRevision $revision, | |||||
PhabricatorUser $viewer, | |||||
$value, | |||||
$status) { | |||||
$map = array(); | |||||
// When you accept or reject, you may accept or reject on behalf of all | |||||
// reviewers you have authority for. When you resign, you only affect | |||||
// yourself. | |||||
$with_authority = ($status != DifferentialReviewerStatus::STATUS_RESIGNED); | |||||
if ($with_authority) { | |||||
foreach ($revision->getReviewerStatus() as $reviewer) { | |||||
if ($reviewer->hasAuthority($viewer)) { | |||||
$map[$reviewer->getReviewerPHID()] = $status; | |||||
} | |||||
} | |||||
} | |||||
// In all cases, you affect yourself. | |||||
$map[$viewer->getPHID()] = $status; | |||||
// Convert reviewer statuses into edge data. | |||||
foreach ($map as $reviewer_phid => $reviewer_status) { | |||||
$map[$reviewer_phid] = array( | |||||
'data' => array( | |||||
'status' => $reviewer_status, | |||||
), | |||||
); | |||||
} | |||||
$src_phid = $revision->getPHID(); | |||||
$edge_type = DifferentialRevisionHasReviewerEdgeType::EDGECONST; | |||||
$editor = new PhabricatorEdgeEditor(); | |||||
foreach ($map as $dst_phid => $edge_data) { | |||||
if ($status == DifferentialReviewerStatus::STATUS_RESIGNED) { | |||||
// TODO: For now, we just remove these reviewers. In the future, we will | |||||
// store resignations explicitly. | |||||
$editor->removeEdge($src_phid, $edge_type, $dst_phid); | |||||
} else { | |||||
$editor->addEdge($src_phid, $edge_type, $dst_phid, $edge_data); | |||||
} | |||||
} | |||||
$editor->save(); | |||||
} | |||||
public function newEditField( | public function newEditField( | ||||
DifferentialRevision $revision, | DifferentialRevision $revision, | ||||
PhabricatorUser $viewer) { | PhabricatorUser $viewer) { | ||||
$field = id(new PhabricatorApplyEditField()) | $field = id(new PhabricatorApplyEditField()) | ||||
->setKey($this->getRevisionActionKey()) | ->setKey($this->getRevisionActionKey()) | ||||
->setTransactionType($this->getTransactionTypeConstant()) | ->setTransactionType($this->getTransactionTypeConstant()) | ||||
->setValue(true); | ->setValue(true); | ||||
if ($this->isActionAvailable($revision, $viewer)) { | if ($this->isActionAvailable($revision, $viewer)) { | ||||
$label = $this->getRevisionActionLabel(); | $label = $this->getRevisionActionLabel(); | ||||
if ($label !== null) { | if ($label !== null) { | ||||
$field->setCommentActionLabel($label); | $field->setCommentActionLabel($label); | ||||
$description = $this->getRevisionActionDescription(); | $description = $this->getRevisionActionDescription(); | ||||
$field->setActionDescription($description); | $field->setActionDescription($description); | ||||
$group_key = $this->getRevisionActionGroupKey(); | |||||
$field->setCommentActionGroupKey($group_key); | |||||
} | } | ||||
} | } | ||||
return $field; | return $field; | ||||
} | } | ||||
public function validateTransactions($object, array $xactions) { | public function validateTransactions($object, array $xactions) { | ||||
$errors = array(); | $errors = array(); | ||||
Show All 21 Lines |