Correct Aphlict websocket URI construction after PHP8 compatibility changes
[phabricator.git] / src / applications / repository / query / PhabricatorRepositorySearchEngine.php
blob90a10e987280068e4f2f147cecc370e4980cec8d
1 <?php
3 final class PhabricatorRepositorySearchEngine
4 extends PhabricatorApplicationSearchEngine {
6 public function getResultTypeDescription() {
7 return pht('Repositories');
10 public function getApplicationClassName() {
11 return 'PhabricatorDiffusionApplication';
14 public function newQuery() {
15 return id(new PhabricatorRepositoryQuery())
16 ->needProjectPHIDs(true)
17 ->needCommitCounts(true)
18 ->needMostRecentCommits(true)
19 ->needProfileImage(true);
22 protected function buildCustomSearchFields() {
23 return array(
24 id(new PhabricatorSearchStringListField())
25 ->setLabel(pht('Callsigns'))
26 ->setKey('callsigns'),
27 id(new PhabricatorSearchStringListField())
28 ->setLabel(pht('Short Names'))
29 ->setKey('shortNames'),
30 id(new PhabricatorSearchSelectField())
31 ->setLabel(pht('Status'))
32 ->setKey('status')
33 ->setOptions($this->getStatusOptions()),
34 id(new PhabricatorSearchSelectField())
35 ->setLabel(pht('Hosted'))
36 ->setKey('hosted')
37 ->setOptions($this->getHostedOptions()),
38 id(new PhabricatorSearchCheckboxesField())
39 ->setLabel(pht('Types'))
40 ->setKey('types')
41 ->setOptions(PhabricatorRepositoryType::getAllRepositoryTypes()),
42 id(new PhabricatorSearchStringListField())
43 ->setLabel(pht('URIs'))
44 ->setKey('uris')
45 ->setDescription(
46 pht('Search for repositories by clone/checkout URI.')),
47 id(new PhabricatorPHIDsSearchField())
48 ->setLabel(pht('Services'))
49 ->setKey('almanacServicePHIDs')
50 ->setAliases(
51 array(
52 'almanacServicePHID',
53 'almanacService',
54 'almanacServices',
55 )),
59 protected function buildQueryFromParameters(array $map) {
60 $query = $this->newQuery();
62 if ($map['callsigns']) {
63 $query->withCallsigns($map['callsigns']);
66 if ($map['shortNames']) {
67 $query->withSlugs($map['shortNames']);
70 if ($map['status']) {
71 $status = idx($this->getStatusValues(), $map['status']);
72 if ($status) {
73 $query->withStatus($status);
77 if ($map['hosted']) {
78 $hosted = idx($this->getHostedValues(), $map['hosted']);
79 if ($hosted) {
80 $query->withHosted($hosted);
84 if ($map['types']) {
85 $query->withTypes($map['types']);
88 if ($map['uris']) {
89 $query->withURIs($map['uris']);
92 if ($map['almanacServicePHIDs']) {
93 $query->withAlmanacServicePHIDs($map['almanacServicePHIDs']);
96 return $query;
99 protected function getURI($path) {
100 return '/diffusion/'.$path;
103 protected function getBuiltinQueryNames() {
104 $names = array(
105 'active' => pht('Active Repositories'),
106 'all' => pht('All Repositories'),
109 return $names;
112 public function buildSavedQueryFromBuiltin($query_key) {
114 $query = $this->newSavedQuery();
115 $query->setQueryKey($query_key);
117 switch ($query_key) {
118 case 'active':
119 return $query->setParameter('status', 'open');
120 case 'all':
121 return $query;
124 return parent::buildSavedQueryFromBuiltin($query_key);
127 private function getStatusOptions() {
128 return array(
129 '' => pht('Active and Inactive Repositories'),
130 'open' => pht('Active Repositories'),
131 'closed' => pht('Inactive Repositories'),
135 private function getStatusValues() {
136 return array(
137 '' => PhabricatorRepositoryQuery::STATUS_ALL,
138 'open' => PhabricatorRepositoryQuery::STATUS_OPEN,
139 'closed' => PhabricatorRepositoryQuery::STATUS_CLOSED,
143 private function getHostedOptions() {
144 return array(
145 '' => pht('Hosted and Remote Repositories'),
146 'phabricator' => pht('Hosted Repositories'),
147 'remote' => pht('Remote Repositories'),
151 private function getHostedValues() {
152 return array(
153 '' => PhabricatorRepositoryQuery::HOSTED_ALL,
154 'phabricator' => PhabricatorRepositoryQuery::HOSTED_PHABRICATOR,
155 'remote' => PhabricatorRepositoryQuery::HOSTED_REMOTE,
159 protected function getRequiredHandlePHIDsForResultList(
160 array $repositories,
161 PhabricatorSavedQuery $query) {
162 return array_mergev(mpull($repositories, 'getProjectPHIDs'));
165 protected function renderResultList(
166 array $repositories,
167 PhabricatorSavedQuery $query,
168 array $handles) {
169 assert_instances_of($repositories, 'PhabricatorRepository');
171 $viewer = $this->requireViewer();
173 $list = new PHUIObjectItemListView();
174 foreach ($repositories as $repository) {
175 $id = $repository->getID();
177 $item = id(new PHUIObjectItemView())
178 ->setUser($viewer)
179 ->setObject($repository)
180 ->setHeader($repository->getName())
181 ->setObjectName($repository->getMonogram())
182 ->setHref($repository->getURI())
183 ->setImageURI($repository->getProfileImageURI());
185 $commit = $repository->getMostRecentCommit();
186 if ($commit) {
187 $commit_link = phutil_tag(
188 'a',
189 array(
190 'href' => $commit->getURI(),
192 pht(
193 '%s: %s',
194 $commit->getLocalName(),
195 $commit->getSummary()));
197 $item->setSubhead($commit_link);
198 $item->setEpoch($commit->getEpoch());
201 $item->addIcon(
202 'none',
203 PhabricatorRepositoryType::getNameForRepositoryType(
204 $repository->getVersionControlSystem()));
206 $size = $repository->getCommitCount();
207 if ($size) {
208 $history_uri = $repository->generateURI(
209 array(
210 'action' => 'history',
213 $item->addAttribute(
214 phutil_tag(
215 'a',
216 array(
217 'href' => $history_uri,
219 pht('%s Commit(s)', new PhutilNumber($size))));
220 } else {
221 $item->addAttribute(pht('No Commits'));
224 $project_handles = array_select_keys(
225 $handles,
226 $repository->getProjectPHIDs());
227 if ($project_handles) {
228 $item->addAttribute(
229 id(new PHUIHandleTagListView())
230 ->setSlim(true)
231 ->setHandles($project_handles));
234 if (!$repository->isTracked()) {
235 $item->setDisabled(true);
236 $item->addIcon('disable-grey', pht('Inactive'));
237 } else if ($repository->isImporting()) {
238 $item->addIcon('fa-clock-o indigo', pht('Importing...'));
241 $list->addItem($item);
244 $result = new PhabricatorApplicationSearchResultView();
245 $result->setObjectList($list);
246 $result->setNoDataString(pht('No repositories found for this query.'));
248 return $result;
251 protected function willUseSavedQuery(PhabricatorSavedQuery $saved) {
252 $project_phids = $saved->getParameter('projectPHIDs', array());
254 $old = $saved->getParameter('projects', array());
255 foreach ($old as $phid) {
256 $project_phids[] = $phid;
259 $any = $saved->getParameter('anyProjectPHIDs', array());
260 foreach ($any as $project) {
261 $project_phids[] = 'any('.$project.')';
264 $saved->setParameter('projectPHIDs', $project_phids);
267 protected function getNewUserBody() {
269 $new_button = id(new PHUIButtonView())
270 ->setTag('a')
271 ->setText(pht('New Repository'))
272 ->setHref('/diffusion/edit/')
273 ->setColor(PHUIButtonView::GREEN);
275 $icon = $this->getApplication()->getIcon();
276 $app_name = $this->getApplication()->getName();
277 $view = id(new PHUIBigInfoView())
278 ->setIcon($icon)
279 ->setTitle(pht('Welcome to %s', $app_name))
280 ->setDescription(
281 pht('Import, create, or just browse repositories in Diffusion.'))
282 ->addAction($new_button);
284 return $view;