[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorRepositorySearchEngine 4 extends PhabricatorApplicationSearchEngine { 5 6 public function getResultTypeDescription() { 7 return pht('Repositories'); 8 } 9 10 public function getApplicationClassName() { 11 return 'PhabricatorDiffusionApplication'; 12 } 13 14 public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 $saved = new PhabricatorSavedQuery(); 16 17 $saved->setParameter('callsigns', $request->getStrList('callsigns')); 18 $saved->setParameter('status', $request->getStr('status')); 19 $saved->setParameter('order', $request->getStr('order')); 20 $saved->setParameter('hosted', $request->getStr('hosted')); 21 $saved->setParameter('types', $request->getArr('types')); 22 $saved->setParameter('name', $request->getStr('name')); 23 $saved->setParameter('anyProjectPHIDs', $request->getArr('anyProjects')); 24 25 return $saved; 26 } 27 28 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 29 $query = id(new PhabricatorRepositoryQuery()) 30 ->needProjectPHIDs(true) 31 ->needCommitCounts(true) 32 ->needMostRecentCommits(true); 33 34 $callsigns = $saved->getParameter('callsigns'); 35 if ($callsigns) { 36 $query->withCallsigns($callsigns); 37 } 38 39 $status = $saved->getParameter('status'); 40 $status = idx($this->getStatusValues(), $status); 41 if ($status) { 42 $query->withStatus($status); 43 } 44 45 $order = $saved->getParameter('order'); 46 $order = idx($this->getOrderValues(), $order); 47 if ($order) { 48 $query->setOrder($order); 49 } else { 50 $query->setOrder(head($this->getOrderValues())); 51 } 52 53 $hosted = $saved->getParameter('hosted'); 54 $hosted = idx($this->getHostedValues(), $hosted); 55 if ($hosted) { 56 $query->withHosted($hosted); 57 } 58 59 $types = $saved->getParameter('types'); 60 if ($types) { 61 $query->withTypes($types); 62 } 63 64 $name = $saved->getParameter('name'); 65 if (strlen($name)) { 66 $query->withNameContains($name); 67 } 68 69 $any_project_phids = $saved->getParameter('anyProjectPHIDs'); 70 if ($any_project_phids) { 71 $query->withAnyProjects($any_project_phids); 72 } 73 74 return $query; 75 } 76 77 public function buildSearchForm( 78 AphrontFormView $form, 79 PhabricatorSavedQuery $saved_query) { 80 81 $callsigns = $saved_query->getParameter('callsigns', array()); 82 $types = $saved_query->getParameter('types', array()); 83 $types = array_fuse($types); 84 $name = $saved_query->getParameter('name'); 85 $any_project_phids = $saved_query->getParameter('anyProjectPHIDs', array()); 86 87 if ($any_project_phids) { 88 $any_project_handles = id(new PhabricatorHandleQuery()) 89 ->setViewer($this->requireViewer()) 90 ->withPHIDs($any_project_phids) 91 ->execute(); 92 } else { 93 $any_project_handles = array(); 94 } 95 96 $form 97 ->appendChild( 98 id(new AphrontFormTextControl()) 99 ->setName('callsigns') 100 ->setLabel(pht('Callsigns')) 101 ->setValue(implode(', ', $callsigns))) 102 ->appendChild( 103 id(new AphrontFormTextControl()) 104 ->setName('name') 105 ->setLabel(pht('Name Contains')) 106 ->setValue($name)) 107 ->appendChild( 108 id(new AphrontFormTokenizerControl()) 109 ->setDatasource(new PhabricatorProjectDatasource()) 110 ->setName('anyProjects') 111 ->setLabel(pht('In Any Project')) 112 ->setValue($any_project_handles)) 113 ->appendChild( 114 id(new AphrontFormSelectControl()) 115 ->setName('status') 116 ->setLabel(pht('Status')) 117 ->setValue($saved_query->getParameter('status')) 118 ->setOptions($this->getStatusOptions())) 119 ->appendChild( 120 id(new AphrontFormSelectControl()) 121 ->setName('hosted') 122 ->setLabel(pht('Hosted')) 123 ->setValue($saved_query->getParameter('hosted')) 124 ->setOptions($this->getHostedOptions())); 125 126 $type_control = id(new AphrontFormCheckboxControl()) 127 ->setLabel(pht('Types')); 128 129 $all_types = PhabricatorRepositoryType::getAllRepositoryTypes(); 130 foreach ($all_types as $key => $name) { 131 $type_control->addCheckbox( 132 'types[]', 133 $key, 134 $name, 135 isset($types[$key])); 136 } 137 138 $form 139 ->appendChild($type_control) 140 ->appendChild( 141 id(new AphrontFormSelectControl()) 142 ->setName('order') 143 ->setLabel(pht('Order')) 144 ->setValue($saved_query->getParameter('order')) 145 ->setOptions($this->getOrderOptions())); 146 } 147 148 protected function getURI($path) { 149 return '/diffusion/'.$path; 150 } 151 152 public function getBuiltinQueryNames() { 153 $names = array( 154 'active' => pht('Active Repositories'), 155 'all' => pht('All Repositories'), 156 ); 157 158 return $names; 159 } 160 161 public function buildSavedQueryFromBuiltin($query_key) { 162 163 $query = $this->newSavedQuery(); 164 $query->setQueryKey($query_key); 165 166 switch ($query_key) { 167 case 'active': 168 return $query->setParameter('status', 'open'); 169 case 'all': 170 return $query; 171 } 172 173 return parent::buildSavedQueryFromBuiltin($query_key); 174 } 175 176 private function getStatusOptions() { 177 return array( 178 '' => pht('Active and Inactive Repositories'), 179 'open' => pht('Active Repositories'), 180 'closed' => pht('Inactive Repositories'), 181 ); 182 } 183 184 private function getStatusValues() { 185 return array( 186 '' => PhabricatorRepositoryQuery::STATUS_ALL, 187 'open' => PhabricatorRepositoryQuery::STATUS_OPEN, 188 'closed' => PhabricatorRepositoryQuery::STATUS_CLOSED, 189 ); 190 } 191 192 private function getOrderOptions() { 193 return array( 194 'committed' => pht('Most Recent Commit'), 195 'name' => pht('Name'), 196 'callsign' => pht('Callsign'), 197 'created' => pht('Date Created'), 198 ); 199 } 200 201 private function getOrderValues() { 202 return array( 203 'committed' => PhabricatorRepositoryQuery::ORDER_COMMITTED, 204 'name' => PhabricatorRepositoryQuery::ORDER_NAME, 205 'callsign' => PhabricatorRepositoryQuery::ORDER_CALLSIGN, 206 'created' => PhabricatorRepositoryQuery::ORDER_CREATED, 207 ); 208 } 209 210 private function getHostedOptions() { 211 return array( 212 '' => pht('Hosted and Remote Repositories'), 213 'phabricator' => pht('Hosted Repositories'), 214 'remote' => pht('Remote Repositories'), 215 ); 216 } 217 218 private function getHostedValues() { 219 return array( 220 '' => PhabricatorRepositoryQuery::HOSTED_ALL, 221 'phabricator' => PhabricatorRepositoryQuery::HOSTED_PHABRICATOR, 222 'remote' => PhabricatorRepositoryQuery::HOSTED_REMOTE, 223 ); 224 } 225 226 protected function getRequiredHandlePHIDsForResultList( 227 array $repositories, 228 PhabricatorSavedQuery $query) { 229 return array_mergev(mpull($repositories, 'getProjectPHIDs')); 230 } 231 232 protected function renderResultList( 233 array $repositories, 234 PhabricatorSavedQuery $query, 235 array $handles) { 236 assert_instances_of($repositories, 'PhabricatorRepository'); 237 238 $viewer = $this->requireViewer();; 239 240 $list = new PHUIObjectItemListView(); 241 foreach ($repositories as $repository) { 242 $id = $repository->getID(); 243 244 $item = id(new PHUIObjectItemView()) 245 ->setUser($viewer) 246 ->setHeader($repository->getName()) 247 ->setObjectName('r'.$repository->getCallsign()) 248 ->setHref($this->getApplicationURI($repository->getCallsign().'/')); 249 250 $commit = $repository->getMostRecentCommit(); 251 if ($commit) { 252 $commit_link = DiffusionView::linkCommit( 253 $repository, 254 $commit->getCommitIdentifier(), 255 $commit->getSummary()); 256 $item->setSubhead($commit_link); 257 $item->setEpoch($commit->getEpoch()); 258 } 259 260 $item->addIcon( 261 'none', 262 PhabricatorRepositoryType::getNameForRepositoryType( 263 $repository->getVersionControlSystem())); 264 265 $size = $repository->getCommitCount(); 266 if ($size) { 267 $history_uri = DiffusionRequest::generateDiffusionURI( 268 array( 269 'callsign' => $repository->getCallsign(), 270 'action' => 'history', 271 )); 272 273 $item->addAttribute( 274 phutil_tag( 275 'a', 276 array( 277 'href' => $history_uri, 278 ), 279 pht('%s Commit(s)', new PhutilNumber($size)))); 280 } else { 281 $item->addAttribute(pht('No Commits')); 282 } 283 284 $project_handles = array_select_keys( 285 $handles, 286 $repository->getProjectPHIDs()); 287 if ($project_handles) { 288 $item->addAttribute( 289 id(new PHUIHandleTagListView()) 290 ->setSlim(true) 291 ->setHandles($project_handles)); 292 } 293 294 if (!$repository->isTracked()) { 295 $item->setDisabled(true); 296 $item->addIcon('disable-grey', pht('Inactive')); 297 } 298 299 $list->addItem($item); 300 } 301 302 return $list; 303 } 304 305 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |