[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/repository/query/ -> PhabricatorRepositorySearchEngine.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1