Move BlameController away from ancient "TABLE_COMMIT"
Summary:
Ref T13276. Differential has a pre-edge "TABLE_COMMIT" with about a half-dozen weird callers I'd like to get rid of.
Move blame to use edges instead. (Bonus: this makes blame respect edge edits in the UI.)
Since there are some more callers to clean up this code may move into some "RelatedObjectQueryThing" class or something, but I'm taking it one step at a time for now.
Test Plan: {F6394106}
Reviewers: amckinley
Reviewed By: amckinley
Maniphest Tasks: T13276
Differential Revision: https://secure.phabricator.com/D20457
This commit is contained in:
@@ -36,27 +36,7 @@ final class DiffusionBlameController extends DiffusionController {
|
||||
|
||||
$commit_map = mpull($commits, 'getCommitIdentifier', 'getPHID');
|
||||
|
||||
$revisions = array();
|
||||
$revision_map = array();
|
||||
if ($commits) {
|
||||
$revision_ids = id(new DifferentialRevision())
|
||||
->loadIDsByCommitPHIDs(array_keys($commit_map));
|
||||
if ($revision_ids) {
|
||||
$revisions = id(new DifferentialRevisionQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs($revision_ids)
|
||||
->execute();
|
||||
$revisions = mpull($revisions, null, 'getID');
|
||||
}
|
||||
|
||||
foreach ($revision_ids as $commit_phid => $revision_id) {
|
||||
// If the viewer can't actually see this revision, skip it.
|
||||
if (!isset($revisions[$revision_id])) {
|
||||
continue;
|
||||
}
|
||||
$revision_map[$commit_map[$commit_phid]] = $revision_id;
|
||||
}
|
||||
}
|
||||
$revision_map = $this->loadRevisionsForCommits($commits);
|
||||
|
||||
$base_href = (string)$drequest->generateURI(
|
||||
array(
|
||||
@@ -75,8 +55,10 @@ final class DiffusionBlameController extends DiffusionController {
|
||||
$handle_phids[] = $commit->getAuthorDisplayPHID();
|
||||
}
|
||||
|
||||
foreach ($revisions as $revision) {
|
||||
$handle_phids[] = $revision->getAuthorPHID();
|
||||
foreach ($revision_map as $revisions) {
|
||||
foreach ($revisions as $revision) {
|
||||
$handle_phids[] = $revision->getAuthorPHID();
|
||||
}
|
||||
}
|
||||
|
||||
$handles = $viewer->loadHandles($handle_phids);
|
||||
@@ -84,13 +66,6 @@ final class DiffusionBlameController extends DiffusionController {
|
||||
$map = array();
|
||||
$epochs = array();
|
||||
foreach ($identifiers as $identifier) {
|
||||
$revision_id = idx($revision_map, $identifier);
|
||||
if ($revision_id) {
|
||||
$revision = idx($revisions, $revision_id);
|
||||
} else {
|
||||
$revision = null;
|
||||
}
|
||||
|
||||
$skip_href = $base_href.'?before='.$identifier;
|
||||
|
||||
$skip_link = javelin_tag(
|
||||
@@ -115,6 +90,17 @@ final class DiffusionBlameController extends DiffusionController {
|
||||
|
||||
$commit = idx($commits, $identifier);
|
||||
|
||||
$revision = null;
|
||||
if ($commit) {
|
||||
$revisions = idx($revision_map, $commit->getPHID());
|
||||
|
||||
// There may be multiple edges between this commit and revisions in the
|
||||
// database. If there are, just pick one arbitrarily.
|
||||
if ($revisions) {
|
||||
$revision = head($revisions);
|
||||
}
|
||||
}
|
||||
|
||||
$author_phid = null;
|
||||
|
||||
if ($commit) {
|
||||
@@ -281,4 +267,45 @@ final class DiffusionBlameController extends DiffusionController {
|
||||
}
|
||||
}
|
||||
|
||||
private function loadRevisionsForCommits(array $commits) {
|
||||
if (!$commits) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$commit_phids = mpull($commits, 'getPHID');
|
||||
|
||||
$edge_query = id(new PhabricatorEdgeQuery())
|
||||
->withSourcePHIDs($commit_phids)
|
||||
->withEdgeTypes(
|
||||
array(
|
||||
DiffusionCommitHasRevisionEdgeType::EDGECONST,
|
||||
));
|
||||
$edge_query->execute();
|
||||
|
||||
$revision_phids = $edge_query->getDestinationPHIDs();
|
||||
if (!$revision_phids) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$revisions = id(new DifferentialRevisionQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs($revision_phids)
|
||||
->execute();
|
||||
$revisions = mpull($revisions, null, 'getPHID');
|
||||
|
||||
$map = array();
|
||||
foreach ($commit_phids as $commit_phid) {
|
||||
$revision_phids = $edge_query->getDestinationPHIDs(
|
||||
array(
|
||||
$commit_phid,
|
||||
));
|
||||
|
||||
$map[$commit_phid] = array_select_keys($revisions, $revision_phids);
|
||||
}
|
||||
|
||||
return $map;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user