@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class HarbormasterBuildSearchEngine
4 extends PhabricatorApplicationSearchEngine {
5
6 public function getResultTypeDescription() {
7 return pht('Harbormaster Builds');
8 }
9
10 public function getApplicationClassName() {
11 return PhabricatorHarbormasterApplication::class;
12 }
13
14 public function newQuery() {
15 return new HarbormasterBuildQuery();
16 }
17
18 protected function buildCustomSearchFields() {
19 return array(
20 id(new PhabricatorSearchDatasourceField())
21 ->setLabel(pht('Build Plans'))
22 ->setKey('plans')
23 ->setAliases(array('plan'))
24 ->setDescription(
25 pht('Search for builds running a given build plan.'))
26 ->setDatasource(new HarbormasterBuildPlanDatasource()),
27 id(new PhabricatorPHIDsSearchField())
28 ->setLabel(pht('Buildables'))
29 ->setKey('buildables')
30 ->setAliases(array('buildable'))
31 ->setDescription(
32 pht('Search for builds running against particular buildables.')),
33 id(new PhabricatorSearchDatasourceField())
34 ->setLabel(pht('Statuses'))
35 ->setKey('statuses')
36 ->setAliases(array('status'))
37 ->setDescription(
38 pht('Search for builds with given statuses.'))
39 ->setDatasource(new HarbormasterBuildStatusDatasource()),
40 id(new PhabricatorSearchDatasourceField())
41 ->setLabel(pht('Initiators'))
42 ->setKey('initiators')
43 ->setAliases(array('initiator'))
44 ->setDescription(
45 pht(
46 'Search for builds started by someone or something in particular.'))
47 ->setDatasource(new HarbormasterBuildInitiatorDatasource()),
48 );
49 }
50
51 protected function getHiddenFields() {
52 return array(
53 'buildables',
54 );
55 }
56
57 protected function buildQueryFromParameters(array $map) {
58 $query = $this->newQuery();
59
60 if ($map['plans']) {
61 $query->withBuildPlanPHIDs($map['plans']);
62 }
63
64 if ($map['buildables']) {
65 $query->withBuildablePHIDs($map['buildables']);
66 }
67
68 if ($map['statuses']) {
69 $query->withBuildStatuses($map['statuses']);
70 }
71
72 if ($map['initiators']) {
73 $query->withInitiatorPHIDs($map['initiators']);
74 }
75
76 return $query;
77 }
78
79 protected function getURI($path) {
80 return '/harbormaster/build/'.$path;
81 }
82
83 protected function getBuiltinQueryNames() {
84 return array(
85 'initiated' => pht('My Builds'),
86 'all' => pht('All Builds'),
87 'waiting' => pht('Waiting'),
88 'active' => pht('Active'),
89 'completed' => pht('Completed'),
90 );
91 }
92
93 public function buildSavedQueryFromBuiltin($query_key) {
94 $query = $this->newSavedQuery();
95 $query->setQueryKey($query_key);
96
97 switch ($query_key) {
98 case 'initiated':
99 $viewer = $this->requireViewer();
100 return $query->setParameter('initiators', array($viewer->getPHID()));
101 case 'all':
102 return $query;
103 case 'waiting':
104 return $query
105 ->setParameter(
106 'statuses',
107 HarbormasterBuildStatus::getWaitingStatusConstants());
108 case 'active':
109 return $query
110 ->setParameter(
111 'statuses',
112 HarbormasterBuildStatus::getActiveStatusConstants());
113 case 'completed':
114 return $query
115 ->setParameter(
116 'statuses',
117 HarbormasterBuildStatus::getCompletedStatusConstants());
118 }
119
120 return parent::buildSavedQueryFromBuiltin($query_key);
121 }
122
123 /**
124 * @param array<HarbormasterBuild> $builds
125 * @param PhabricatorSavedQuery $query
126 * @param array<PhabricatorObjectHandle> $handles
127 */
128 protected function renderResultList(
129 array $builds,
130 PhabricatorSavedQuery $query,
131 array $handles) {
132 assert_instances_of($builds, HarbormasterBuild::class);
133
134 $viewer = $this->requireViewer();
135
136 $list = id(new HarbormasterBuildView())
137 ->setViewer($viewer)
138 ->setBuilds($builds)
139 ->newObjectList();
140
141 return id(new PhabricatorApplicationSearchResultView())
142 ->setObjectList($list)
143 ->setNoDataString(pht('No builds found.'));
144 }
145
146}