diff --git a/src/applications/differential/controller/revisionview/DifferentialRevisionViewController.php b/src/applications/differential/controller/revisionview/DifferentialRevisionViewController.php
index d1cb96c3a7..6f40466d55 100644
--- a/src/applications/differential/controller/revisionview/DifferentialRevisionViewController.php
+++ b/src/applications/differential/controller/revisionview/DifferentialRevisionViewController.php
@@ -269,6 +269,16 @@ final class DifferentialRevisionViewController extends DifferentialController {
$local_view->setUser($user);
$local_view->setLocalCommits(idx($props, 'local:commits'));
+ $other_revisions = $this->loadOtherRevisions(
+ $changesets,
+ $target,
+ $repository);
+
+ $other_view = null;
+ if ($other_revisions) {
+ $other_view = $this->renderOtherRevisions($other_revisions);
+ }
+
$toc_view = new DifferentialDiffTableOfContentsView();
$toc_view->setChangesets($changesets);
$toc_view->setVisibleChangesets($visible_changesets);
@@ -320,6 +330,7 @@ final class DifferentialRevisionViewController extends DifferentialController {
$warning.
$local_view->render().
$toc_view->render().
+ $other_view.
$changeset_view->render());
if ($comment_form) {
$page_pane->appendChild($comment_form->render());
@@ -708,5 +719,65 @@ final class DifferentialRevisionViewController extends DifferentialController {
return $symbol_indexes;
}
+ private function loadOtherRevisions($changesets, $target, $repository) {
+ if (!$repository) {
+ return array();
+ }
+
+ $paths = array();
+ foreach ($changesets as $changeset) {
+ $paths[] = $changeset->getAbsoluteRepositoryPath(
+ $target,
+ $repository);
+ }
+
+ if (!$paths) {
+ return array();
+ }
+
+ $path_map = id(new DiffusionPathIDQuery($paths))->loadPathIDs();
+
+ if (!$path_map) {
+ return array();
+ }
+
+ $query = id(new DifferentialRevisionQuery())
+ ->withStatus(DifferentialRevisionQuery::STATUS_OPEN)
+ ->setOrder(DifferentialRevisionQuery::ORDER_PATH_MODIFIED)
+ ->setLimit(10)
+ ->needRelationships(true);
+
+ foreach ($path_map as $path => $path_id) {
+ $query->withPath($repository->getID(), $path_id);
+ }
+
+ $results = $query->execute();
+
+ // Strip out *this* revision.
+ foreach ($results as $key => $result) {
+ if ($result->getID() == $this->revisionID) {
+ unset($results[$key]);
+ }
+ }
+
+ return $results;
+ }
+
+ private function renderOtherRevisions(array $revisions) {
+ $view = id(new DifferentialRevisionListView())
+ ->setRevisions($revisions)
+ ->setFields(DifferentialRevisionListView::getDefaultFields())
+ ->setUser($this->getRequest()->getUser());
+
+ $phids = $view->getRequiredHandlePHIDs();
+ $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
+ $view->setHandles($handles);
+
+ return
+ '
'.
+ '
Open Revisions Affecting These Files
'.
+ $view->render().
+ '';
+ }
}
diff --git a/src/applications/differential/controller/revisionview/__init__.php b/src/applications/differential/controller/revisionview/__init__.php
index 4ed36fa2f2..d09c1ffa69 100644
--- a/src/applications/differential/controller/revisionview/__init__.php
+++ b/src/applications/differential/controller/revisionview/__init__.php
@@ -13,6 +13,7 @@ phutil_require_module('phabricator', 'applications/differential/constants/action
phutil_require_module('phabricator', 'applications/differential/controller/base');
phutil_require_module('phabricator', 'applications/differential/field/selector/base');
phutil_require_module('phabricator', 'applications/differential/parser/changeset');
+phutil_require_module('phabricator', 'applications/differential/query/revision');
phutil_require_module('phabricator', 'applications/differential/storage/auxiliaryfield');
phutil_require_module('phabricator', 'applications/differential/storage/changeset');
phutil_require_module('phabricator', 'applications/differential/storage/comment');
@@ -26,7 +27,9 @@ phutil_require_module('phabricator', 'applications/differential/view/localcommit
phutil_require_module('phabricator', 'applications/differential/view/primarypane');
phutil_require_module('phabricator', 'applications/differential/view/revisioncommentlist');
phutil_require_module('phabricator', 'applications/differential/view/revisiondetail');
+phutil_require_module('phabricator', 'applications/differential/view/revisionlist');
phutil_require_module('phabricator', 'applications/differential/view/revisionupdatehistory');
+phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base');
phutil_require_module('phabricator', 'applications/draft/storage/draft');
phutil_require_module('phabricator', 'applications/flag/constants/color');
phutil_require_module('phabricator', 'applications/flag/query/flag');
diff --git a/src/applications/differential/view/difftableofcontents/DifferentialDiffTableOfContentsView.php b/src/applications/differential/view/difftableofcontents/DifferentialDiffTableOfContentsView.php
index 51970f4937..378a499e3b 100644
--- a/src/applications/differential/view/difftableofcontents/DifferentialDiffTableOfContentsView.php
+++ b/src/applications/differential/view/difftableofcontents/DifferentialDiffTableOfContentsView.php
@@ -278,4 +278,5 @@ final class DifferentialDiffTableOfContentsView extends AphrontView {
),
phutil_escape_html($display_file));
}
+
}
diff --git a/src/applications/diffusion/request/git/DiffusionGitRequest.php b/src/applications/diffusion/request/git/DiffusionGitRequest.php
index 6cd359655d..af60b1927f 100644
--- a/src/applications/diffusion/request/git/DiffusionGitRequest.php
+++ b/src/applications/diffusion/request/git/DiffusionGitRequest.php
@@ -26,64 +26,18 @@ final class DiffusionGitRequest extends DiffusionRequest {
}
protected function didInitialize() {
- if ($this->repository) {
- $repository = $this->repository;
-
- // TODO: This is not terribly efficient and does not produce terribly
- // good error messages, but it seems better to put error handling code
- // here than to try to do it in every query.
-
- $branch = $this->getBranch();
-
- // TODO: Here, particularly, we should give the user a specific error
- // message to indicate whether they've typed in some bogus branch and/or
- // followed a bad link, or misconfigured the default branch in the
- // Repository tool.
- list($this->stableCommitName) = $repository->execxLocalCommand(
- 'rev-parse --verify %s/%s',
- DiffusionBranchInformation::DEFAULT_GIT_REMOTE,
- $branch);
-
- if ($this->commit) {
- list($commit) = $repository->execxLocalCommand(
- 'rev-parse --verify %s',
- $this->commit);
-
- // Beyond verifying them, expand commit short forms to full 40-character
- // hashes.
- $this->commit = trim($commit);
-
- // If we have a commit, overwrite the branch commit with the more
- // specific commit.
- $this->stableCommitName = $this->commit;
-
-/*
-
- TODO: Unclear if this is actually a good idea or not; it breaks commit views
- at the very least.
-
- list($contains) = $repository->execxLocalCommand(
- 'branch --contains %s',
- $this->commit);
- $contains = array_filter(explode("\n", $contains));
- $found = false;
- foreach ($contains as $containing_branch) {
- $containing_branch = trim($containing_branch, "* \n");
- if ($containing_branch == $branch) {
- $found = true;
- break;
- }
- }
- if (!$found) {
- throw new Exception(
- "Commit does not exist on this branch!");
- }
-*/
-
- }
+ if (!$this->commit) {
+ return;
}
+ // Expand commit short forms to full 40-character hashes. This does not
+ // verify them, --verify exits with return code 0 for anything that
+ // looks like a valid hash.
+ list($commit) = $this->getRepository()->execxLocalCommand(
+ 'rev-parse --verify %s',
+ $this->commit);
+ $this->commit = trim($commit);
}
public function getBranch() {
@@ -105,6 +59,18 @@ final class DiffusionGitRequest extends DiffusionRequest {
}
public function getStableCommitName() {
+ if (!$this->stableCommitName) {
+ if ($this->commit) {
+ $this->stableCommitName = $this->commit;
+ } else {
+ $branch = $this->getBranch();
+ list($stdout) = $this->getRepository()->execxLocalCommand(
+ 'rev-parse --verify %s/%s',
+ DiffusionBranchInformation::DEFAULT_GIT_REMOTE,
+ $branch);
+ $this->stableCommitName = trim($stdout);
+ }
+ }
return substr($this->stableCommitName, 0, 16);
}