From 644e950ea3f13e1638c6cf8b0bdf1b29370950e9 Mon Sep 17 00:00:00 2001 From: Bob Trahan Date: Thu, 14 Aug 2014 12:40:47 -0700 Subject: [PATCH] Audit - add ability to query by repositories Summary: Fixes T5862. The Diffusion table uses `id` but all the other infrastructure uses `phid` so just do a quick load of the repositories to get the ids. Long term, we should re-key the table by phid I think. Test Plan: made a query with a repository and got a proper result set Reviewers: epriestley Reviewed By: epriestley Subscribers: epriestley, Korvin Maniphest Tasks: T5862 Differential Revision: https://secure.phabricator.com/D10245 --- .../query/PhabricatorCommitSearchEngine.php | 21 +++++++++++++++++-- .../diffusion/query/DiffusionCommitQuery.php | 19 +++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/applications/audit/query/PhabricatorCommitSearchEngine.php b/src/applications/audit/query/PhabricatorCommitSearchEngine.php index cc665358be..3d86c9b76c 100644 --- a/src/applications/audit/query/PhabricatorCommitSearchEngine.php +++ b/src/applications/audit/query/PhabricatorCommitSearchEngine.php @@ -59,6 +59,14 @@ final class PhabricatorCommitSearchEngine $query->withAuditAwaitingUser($this->requireViewer()); } + $repository_phids = $saved->getParameter('repositoryPHIDs', array()); + if ($repository_phids) { + // $repository_phids need to be mapped to $repository_ids via a subquery + // so make sure $viewer is set...! + $query->setViewer($this->requireViewer()); + $query->withRepositoryPHIDs($repository_phids); + } + return $query; } @@ -71,11 +79,13 @@ final class PhabricatorCommitSearchEngine 'commitAuthorPHIDs', array()); $audit_status = $saved->getParameter('auditStatus', null); + $repository_phids = $saved->getParameter('repositoryPHIDs', array()); $phids = array_mergev( array( $auditor_phids, - $commit_author_phids)); + $commit_author_phids, + $repository_phids)); $handles = id(new PhabricatorHandleQuery()) ->setViewer($this->requireViewer()) @@ -100,7 +110,14 @@ final class PhabricatorCommitSearchEngine ->setName('auditStatus') ->setLabel(pht('Audit Status')) ->setOptions($this->getAuditStatusOptions()) - ->setValue($audit_status)); + ->setValue($audit_status)) + ->appendChild( + id(new AphrontFormTokenizerControl()) + ->setLabel(pht('Repositories')) + ->setName('repositoryPHIDs') + ->setDatasource(new DiffusionRepositoryDatasource()) + ->setValue(array_select_keys($handles, $repository_phids))); + } protected function getURI($path) { diff --git a/src/applications/diffusion/query/DiffusionCommitQuery.php b/src/applications/diffusion/query/DiffusionCommitQuery.php index 7539090c2b..a472691ce4 100644 --- a/src/applications/diffusion/query/DiffusionCommitQuery.php +++ b/src/applications/diffusion/query/DiffusionCommitQuery.php @@ -59,6 +59,25 @@ final class DiffusionCommitQuery return $this; } + /** + * Look up commits in a specific repository. Prefer + * @{method:withRepositoryIDs}; the underyling table is keyed by ID such + * that this method requires a separate initial query to map PHID to ID. + * Furthermore, this method requires calling @{method:setViewer} in + * advance due to the separate query. + */ + public function withRepositoryPHIDs(array $phids) { + $repositories = id (new PhabricatorRepositoryQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs($phids) + ->execute(); + + if (!$repositories) { + throw new PhabricatorEmptyQueryException(); + } + $this->withRepositoryIDs(mpull($repositories, 'getID')); + } + /** * If a default repository is provided, ambiguous commit identifiers will * be assumed to belong to the default repository.