Differential D17495 Diff 42073 src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/differential/xaction/DifferentialRevisionReviewTransaction.php
Show First 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | protected function applyReviewerEffect( | ||||
foreach ($map as $reviewer_phid => $reviewer_status) { | foreach ($map as $reviewer_phid => $reviewer_status) { | ||||
$map[$reviewer_phid] = array( | $map[$reviewer_phid] = array( | ||||
'data' => array( | 'data' => array( | ||||
'status' => $reviewer_status, | 'status' => $reviewer_status, | ||||
), | ), | ||||
); | ); | ||||
} | } | ||||
// This is currently double-writing: to the old (edge) store and the new | |||||
// (reviewer) store. Do the old edge write first. | |||||
$src_phid = $revision->getPHID(); | $src_phid = $revision->getPHID(); | ||||
$edge_type = DifferentialRevisionHasReviewerEdgeType::EDGECONST; | $edge_type = DifferentialRevisionHasReviewerEdgeType::EDGECONST; | ||||
$editor = new PhabricatorEdgeEditor(); | $editor = new PhabricatorEdgeEditor(); | ||||
foreach ($map as $dst_phid => $edge_data) { | foreach ($map as $dst_phid => $edge_data) { | ||||
if ($status == DifferentialReviewerStatus::STATUS_RESIGNED) { | if ($status == DifferentialReviewerStatus::STATUS_RESIGNED) { | ||||
// TODO: For now, we just remove these reviewers. In the future, we will | // TODO: For now, we just remove these reviewers. In the future, we will | ||||
// store resignations explicitly. | // store resignations explicitly. | ||||
$editor->removeEdge($src_phid, $edge_type, $dst_phid); | $editor->removeEdge($src_phid, $edge_type, $dst_phid); | ||||
} else { | } else { | ||||
$editor->addEdge($src_phid, $edge_type, $dst_phid, $edge_data); | $editor->addEdge($src_phid, $edge_type, $dst_phid, $edge_data); | ||||
} | } | ||||
} | } | ||||
$editor->save(); | $editor->save(); | ||||
// Now, do the new write. | |||||
if ($map) { | |||||
$table = new DifferentialReviewer(); | |||||
$reviewers = $table->loadAllWhere( | |||||
'revisionPHID = %s AND reviewerPHID IN (%Ls)', | |||||
$src_phid, | |||||
array_keys($map)); | |||||
$reviewers = mpull($reviewers, null, 'getReviewerPHID'); | |||||
foreach ($map as $dst_phid => $edge_data) { | |||||
$reviewer = idx($reviewers, $dst_phid); | |||||
if (!$reviewer) { | |||||
$reviewer = id(new DifferentialReviewer()) | |||||
->setRevisionPHID($src_phid) | |||||
->setReviewerPHID($dst_phid); | |||||
} | |||||
$reviewer->setReviewerStatus($status); | |||||
if ($status == DifferentialReviewerStatus::STATUS_RESIGNED) { | |||||
if ($reviewer->getID()) { | |||||
$reviewer->delete(); | |||||
} | |||||
} else { | |||||
try { | |||||
$reviewer->save(); | |||||
} catch (AphrontDuplicateKeyQueryException $ex) { | |||||
// At least for now, just ignore it if we lost a race. | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
} | } |