protected function executeQuery()
 {
     $drequest = $this->getRequest();
     $repository = $drequest->getRepository();
     list($err, $stdout) = $repository->execLocalCommand('tag -l --contains %s', $drequest->getCommit());
     if ($err) {
         // Git exits with an error code if the commit is bogus.
         return array();
     }
     $stdout = trim($stdout);
     if (!strlen($stdout)) {
         return array();
     }
     $tag_names = explode("\n", $stdout);
     $tag_names = array_fill_keys($tag_names, true);
     $tag_query = DiffusionTagListQuery::newFromDiffusionRequest($drequest);
     $tags = $tag_query->loadTags();
     $result = array();
     foreach ($tags as $tag) {
         if (isset($tag_names[$tag->getName()])) {
             $result[] = $tag;
         }
     }
     if ($this->getOffset()) {
         $result = array_slice($result, $this->getOffset());
     }
     if ($this->getLimit()) {
         $result = array_slice($result, 0, $this->getLimit());
     }
     return $result;
 }
 public function processRequest()
 {
     $drequest = $this->getDiffusionRequest();
     $request = $this->getRequest();
     $user = $request->getUser();
     $repository = $drequest->getRepository();
     $pager = new AphrontPagerView();
     $pager->setURI($request->getRequestURI(), 'offset');
     $pager->setOffset($request->getInt('offset'));
     if ($drequest->getRawCommit()) {
         $is_commit = true;
         $query = DiffusionCommitTagsQuery::newFromDiffusionRequest($drequest);
         $query->setOffset($pager->getOffset());
         $query->setLimit($pager->getPageSize() + 1);
         $tags = $query->loadTags();
     } else {
         $is_commit = false;
         $query = DiffusionTagListQuery::newFromDiffusionRequest($drequest);
         $query->setOffset($pager->getOffset());
         $query->setLimit($pager->getPageSize() + 1);
         $tags = $query->loadTags();
     }
     $tags = $pager->sliceResults($tags);
     $content = null;
     if (!$tags) {
         $content = new AphrontErrorView();
         $content->setTitle('No Tags');
         if ($is_commit) {
             $content->appendChild('This commit has no tags.');
         } else {
             $content->appendChild('This repository has no tags.');
         }
         $content->setSeverity(AphrontErrorView::SEVERITY_NODATA);
     } else {
         $commits = id(new PhabricatorAuditCommitQuery())->withIdentifiers($drequest->getRepository()->getID(), mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
         $view = id(new DiffusionTagListView())->setTags($tags)->setUser($user)->setCommits($commits)->setDiffusionRequest($drequest);
         $phids = $view->getRequiredHandlePHIDs();
         $handles = $this->loadViewerHandles($phids);
         $view->setHandles($handles);
         $panel = id(new AphrontPanelView())->setHeader('Tags')->appendChild($view)->appendChild($pager);
         $content = $panel;
     }
     return $this->buildStandardPageResponse(array($this->buildCrumbs(array('tags' => true, 'commit' => $drequest->getRawCommit())), $content), array('title' => array('Tags', $repository->getCallsign() . ' Repository')));
 }
 private function buildTagListTable(DiffusionRequest $drequest)
 {
     $tag_limit = 15;
     $query = DiffusionTagListQuery::newFromDiffusionRequest($drequest);
     $query->setLimit($tag_limit + 1);
     $tags = $query->loadTags();
     if (!$tags) {
         return null;
     }
     $more_tags = count($tags) > $tag_limit;
     $tags = array_slice($tags, 0, $tag_limit);
     $commits = id(new PhabricatorAuditCommitQuery())->withIdentifiers($drequest->getRepository()->getID(), mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
     $view = new DiffusionTagListView();
     $view->setDiffusionRequest($drequest);
     $view->setTags($tags);
     $view->setUser($this->getRequest()->getUser());
     $view->setCommits($commits);
     $phids = $view->getRequiredHandlePHIDs();
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     $view->setHandles($handles);
     $panel = new AphrontPanelView();
     $panel->setHeader('Tags');
     if ($more_tags) {
         $panel->setCaption('Showing the ' . $tag_limit . ' most recent tags.');
     }
     $panel->addButton(phutil_render_tag('a', array('href' => $drequest->generateURI(array('action' => 'tags')), 'class' => 'grey button'), "Show All Tags »"));
     $panel->appendChild($view);
     return $panel;
 }