Path: blob/master/src/applications/audit/query/PhabricatorCommitSearchEngine.php
12256 views
<?php12final class PhabricatorCommitSearchEngine3extends PhabricatorApplicationSearchEngine {45public function getResultTypeDescription() {6return pht('Diffusion Commits');7}89public function getApplicationClassName() {10return 'PhabricatorDiffusionApplication';11}1213public function newQuery() {14return id(new DiffusionCommitQuery())15->needAuditRequests(true)16->needCommitData(true)17->needIdentities(true)18->needDrafts(true);19}2021protected function newResultBuckets() {22return DiffusionCommitResultBucket::getAllResultBuckets();23}2425protected function buildQueryFromParameters(array $map) {26$query = $this->newQuery();2728if ($map['responsiblePHIDs']) {29$query->withResponsiblePHIDs($map['responsiblePHIDs']);30}3132if ($map['auditorPHIDs']) {33$query->withAuditorPHIDs($map['auditorPHIDs']);34}3536if ($map['authorPHIDs']) {37$query->withAuthorPHIDs($map['authorPHIDs']);38}3940if ($map['statuses']) {41$query->withStatuses($map['statuses']);42}4344if ($map['repositoryPHIDs']) {45$query->withRepositoryPHIDs($map['repositoryPHIDs']);46}4748if ($map['packagePHIDs']) {49$query->withPackagePHIDs($map['packagePHIDs']);50}5152if ($map['unreachable'] !== null) {53$query->withUnreachable($map['unreachable']);54}5556if ($map['permanent'] !== null) {57$query->withPermanent($map['permanent']);58}5960if ($map['ancestorsOf']) {61$query->withAncestorsOf($map['ancestorsOf']);62}6364if ($map['identifiers']) {65$query->withIdentifiers($map['identifiers']);66}6768return $query;69}7071protected function buildCustomSearchFields() {72return array(73id(new PhabricatorSearchDatasourceField())74->setLabel(pht('Responsible Users'))75->setKey('responsiblePHIDs')76->setConduitKey('responsible')77->setAliases(array('responsible', 'responsibles', 'responsiblePHID'))78->setDatasource(new DifferentialResponsibleDatasource())79->setDescription(80pht(81'Find commits where given users, projects, or packages are '.82'responsible for the next steps in the audit workflow.')),83id(new PhabricatorUsersSearchField())84->setLabel(pht('Authors'))85->setKey('authorPHIDs')86->setConduitKey('authors')87->setAliases(array('author', 'authors', 'authorPHID'))88->setDescription(pht('Find commits authored by particular users.')),89id(new PhabricatorSearchDatasourceField())90->setLabel(pht('Auditors'))91->setKey('auditorPHIDs')92->setConduitKey('auditors')93->setAliases(array('auditor', 'auditors', 'auditorPHID'))94->setDatasource(new DiffusionAuditorFunctionDatasource())95->setDescription(96pht(97'Find commits where given users, projects, or packages are '.98'auditors.')),99id(new PhabricatorSearchCheckboxesField())100->setLabel(pht('Audit Status'))101->setKey('statuses')102->setAliases(array('status'))103->setOptions(DiffusionCommitAuditStatus::newOptions())104->setDeprecatedOptions(105DiffusionCommitAuditStatus::newDeprecatedOptions())106->setDescription(pht('Find commits with given audit statuses.')),107id(new PhabricatorSearchDatasourceField())108->setLabel(pht('Repositories'))109->setKey('repositoryPHIDs')110->setConduitKey('repositories')111->setAliases(array('repository', 'repositories', 'repositoryPHID'))112->setDatasource(new DiffusionRepositoryFunctionDatasource())113->setDescription(pht('Find commits in particular repositories.')),114id(new PhabricatorSearchDatasourceField())115->setLabel(pht('Packages'))116->setKey('packagePHIDs')117->setConduitKey('packages')118->setAliases(array('package', 'packages', 'packagePHID'))119->setDatasource(new PhabricatorOwnersPackageDatasource())120->setDescription(121pht('Find commits which affect given packages.')),122id(new PhabricatorSearchThreeStateField())123->setLabel(pht('Unreachable'))124->setKey('unreachable')125->setOptions(126pht('(Show All)'),127pht('Show Only Unreachable Commits'),128pht('Hide Unreachable Commits'))129->setDescription(130pht(131'Find or exclude unreachable commits which are not ancestors of '.132'any branch, tag, or ref.')),133id(new PhabricatorSearchThreeStateField())134->setLabel(pht('Permanent'))135->setKey('permanent')136->setOptions(137pht('(Show All)'),138pht('Show Only Permanent Commits'),139pht('Hide Permanent Commits'))140->setDescription(141pht(142'Find or exclude permanent commits which are ancestors of '.143'any permanent branch, tag, or ref.')),144id(new PhabricatorSearchStringListField())145->setLabel(pht('Ancestors Of'))146->setKey('ancestorsOf')147->setDescription(148pht(149'Find commits which are ancestors of a particular ref, '.150'like "master".')),151id(new PhabricatorSearchStringListField())152->setLabel(pht('Identifiers'))153->setKey('identifiers')154->setDescription(155pht(156'Find commits with particular identifiers (usually, hashes). '.157'Supports full or partial identifiers (like "abcd12340987..." or '.158'"abcd1234") and qualified or unqualified identifiers (like '.159'"rXabcd1234" or "abcd1234").')),160);161}162163protected function getURI($path) {164return '/diffusion/commit/'.$path;165}166167protected function getBuiltinQueryNames() {168$names = array();169170if ($this->requireViewer()->isLoggedIn()) {171$names['active'] = pht('Active Audits');172$names['authored'] = pht('Authored');173$names['audited'] = pht('Audited');174}175176$names['all'] = pht('All Commits');177178return $names;179}180181public function buildSavedQueryFromBuiltin($query_key) {182$query = $this->newSavedQuery();183$query->setQueryKey($query_key);184$viewer = $this->requireViewer();185186$viewer_phid = $viewer->getPHID();187switch ($query_key) {188case 'all':189return $query;190case 'active':191$bucket_key = DiffusionCommitRequiredActionResultBucket::BUCKETKEY;192193$open = DiffusionCommitAuditStatus::getOpenStatusConstants();194195$query196->setParameter('responsiblePHIDs', array($viewer_phid))197->setParameter('statuses', $open)198->setParameter('bucket', $bucket_key)199->setParameter('unreachable', false);200return $query;201case 'authored':202$query203->setParameter('authorPHIDs', array($viewer_phid));204return $query;205case 'audited':206$query207->setParameter('auditorPHIDs', array($viewer_phid));208return $query;209}210211return parent::buildSavedQueryFromBuiltin($query_key);212}213214protected function renderResultList(215array $commits,216PhabricatorSavedQuery $query,217array $handles) {218assert_instances_of($commits, 'PhabricatorRepositoryCommit');219$viewer = $this->requireViewer();220221$bucket = $this->getResultBucket($query);222223$template = id(new DiffusionCommitGraphView())224->setViewer($viewer)225->setShowAuditors(true);226227$views = array();228if ($bucket) {229$bucket->setViewer($viewer);230231try {232$groups = $bucket->newResultGroups($query, $commits);233234foreach ($groups as $group) {235// Don't show groups in Dashboard Panels236if ($group->getObjects() || !$this->isPanelContext()) {237$item_list = id(clone $template)238->setCommits($group->getObjects())239->newObjectItemListView();240241$views[] = $item_list242->setHeader($group->getName())243->setNoDataString($group->getNoDataString());244}245}246} catch (Exception $ex) {247$this->addError($ex->getMessage());248}249}250251if (!$views) {252$item_list = id(clone $template)253->setCommits($commits)254->newObjectItemListView();255256$views[] = $item_list257->setNoDataString(pht('No commits found.'));258}259260return id(new PhabricatorApplicationSearchResultView())261->setContent($views);262}263264protected function getNewUserBody() {265266$view = id(new PHUIBigInfoView())267->setIcon('fa-check-circle-o')268->setTitle(pht('Welcome to Audit'))269->setDescription(270pht('Post-commit code review and auditing. Audits you are assigned '.271'to will appear here.'));272273return $view;274}275276}277278279