Page MenuHomePhabricator

D20457.diff
No OneTemporary

D20457.diff

diff --git a/src/applications/diffusion/controller/DiffusionBlameController.php b/src/applications/diffusion/controller/DiffusionBlameController.php
--- a/src/applications/diffusion/controller/DiffusionBlameController.php
+++ b/src/applications/diffusion/controller/DiffusionBlameController.php
@@ -36,27 +36,7 @@
$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 @@
$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 @@
$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 @@
$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 @@
}
}
+ 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;
+ }
+
}

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 24, 6:55 AM (4 d, 4 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7388785
Default Alt Text
D20457.diff (3 KB)

Event Timeline