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() {
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'))
33 ->setOptions($this->getStatusOptions()),
34 id(new PhabricatorSearchSelectField())
35 ->setLabel(pht('Hosted'))
37 ->setOptions($this->getHostedOptions()),
38 id(new PhabricatorSearchCheckboxesField())
39 ->setLabel(pht('Types'))
41 ->setOptions(PhabricatorRepositoryType
::getAllRepositoryTypes()),
42 id(new PhabricatorSearchStringListField())
43 ->setLabel(pht('URIs'))
46 pht('Search for repositories by clone/checkout URI.')),
47 id(new PhabricatorPHIDsSearchField())
48 ->setLabel(pht('Services'))
49 ->setKey('almanacServicePHIDs')
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']);
71 $status = idx($this->getStatusValues(), $map['status']);
73 $query->withStatus($status);
78 $hosted = idx($this->getHostedValues(), $map['hosted']);
80 $query->withHosted($hosted);
85 $query->withTypes($map['types']);
89 $query->withURIs($map['uris']);
92 if ($map['almanacServicePHIDs']) {
93 $query->withAlmanacServicePHIDs($map['almanacServicePHIDs']);
99 protected function getURI($path) {
100 return '/diffusion/'.$path;
103 protected function getBuiltinQueryNames() {
105 'active' => pht('Active Repositories'),
106 'all' => pht('All Repositories'),
112 public function buildSavedQueryFromBuiltin($query_key) {
114 $query = $this->newSavedQuery();
115 $query->setQueryKey($query_key);
117 switch ($query_key) {
119 return $query->setParameter('status', 'open');
124 return parent
::buildSavedQueryFromBuiltin($query_key);
127 private function getStatusOptions() {
129 '' => pht('Active and Inactive Repositories'),
130 'open' => pht('Active Repositories'),
131 'closed' => pht('Inactive Repositories'),
135 private function getStatusValues() {
137 '' => PhabricatorRepositoryQuery
::STATUS_ALL
,
138 'open' => PhabricatorRepositoryQuery
::STATUS_OPEN
,
139 'closed' => PhabricatorRepositoryQuery
::STATUS_CLOSED
,
143 private function getHostedOptions() {
145 '' => pht('Hosted and Remote Repositories'),
146 'phabricator' => pht('Hosted Repositories'),
147 'remote' => pht('Remote Repositories'),
151 private function getHostedValues() {
153 '' => PhabricatorRepositoryQuery
::HOSTED_ALL
,
154 'phabricator' => PhabricatorRepositoryQuery
::HOSTED_PHABRICATOR
,
155 'remote' => PhabricatorRepositoryQuery
::HOSTED_REMOTE
,
159 protected function getRequiredHandlePHIDsForResultList(
161 PhabricatorSavedQuery
$query) {
162 return array_mergev(mpull($repositories, 'getProjectPHIDs'));
165 protected function renderResultList(
167 PhabricatorSavedQuery
$query,
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())
179 ->setObject($repository)
180 ->setHeader($repository->getName())
181 ->setObjectName($repository->getMonogram())
182 ->setHref($repository->getURI())
183 ->setImageURI($repository->getProfileImageURI());
185 $commit = $repository->getMostRecentCommit();
187 $commit_link = phutil_tag(
190 'href' => $commit->getURI(),
194 $commit->getLocalName(),
195 $commit->getSummary()));
197 $item->setSubhead($commit_link);
198 $item->setEpoch($commit->getEpoch());
203 PhabricatorRepositoryType
::getNameForRepositoryType(
204 $repository->getVersionControlSystem()));
206 $size = $repository->getCommitCount();
208 $history_uri = $repository->generateURI(
210 'action' => 'history',
217 'href' => $history_uri,
219 pht('%s Commit(s)', new PhutilNumber($size))));
221 $item->addAttribute(pht('No Commits'));
224 $project_handles = array_select_keys(
226 $repository->getProjectPHIDs());
227 if ($project_handles) {
229 id(new PHUIHandleTagListView())
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.'));
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())
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())
279 ->setTitle(pht('Welcome to %s', $app_name))
281 pht('Import, create, or just browse repositories in Diffusion.'))
282 ->addAction($new_button);