public function handleRequest(AphrontRequest $request)
 {
     $response = $this->loadDiffusionContext();
     if ($response) {
         return $response;
     }
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     $tag_limit = 10;
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $tags = array();
             break;
         default:
             $tags = DiffusionRepositoryTag::newFromConduit($this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('commit' => $drequest->getCommit(), 'limit' => $tag_limit + 1)));
             break;
     }
     $has_more_tags = count($tags) > $tag_limit;
     $tags = array_slice($tags, 0, $tag_limit);
     $tag_links = array();
     foreach ($tags as $tag) {
         $tag_links[] = phutil_tag('a', array('href' => $drequest->generateURI(array('action' => 'browse', 'commit' => $tag->getName()))), $tag->getName());
     }
     if ($has_more_tags) {
         $tag_links[] = phutil_tag('a', array('href' => $drequest->generateURI(array('action' => 'tags'))), pht("More Tags…"));
     }
     return id(new AphrontAjaxResponse())->setContent($tag_links ? implode(', ', $tag_links) : pht('None'));
 }
 public function updateTransactionMailBody(PhabricatorMetaMTAMailBody $body, PhabricatorApplicationTransactionEditor $editor, array $xactions)
 {
     $params = array('commit' => $this->getObject()->getCommitIdentifier(), 'callsign' => $this->getObject()->getRepository()->getCallsign());
     $tags_raw = id(new ConduitCall('diffusion.tagsquery', $params))->setUser($this->getViewer())->execute();
     $tags = DiffusionRepositoryTag::newFromConduit($tags_raw);
     if (!$tags) {
         return;
     }
     $tag_names = mpull($tags, 'getName');
     sort($tag_names);
     $body->addTextSection(pht('TAGS'), implode(', ', $tag_names));
 }
 public function handleRequest(AphrontRequest $request)
 {
     $response = $this->loadDiffusionContext();
     if ($response) {
         return $response;
     }
     $viewer = $this->getViewer();
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     $pager = id(new PHUIPagerView())->readFromRequest($request);
     $params = array('limit' => $pager->getPageSize() + 1, 'offset' => $pager->getOffset());
     if (strlen($drequest->getSymbolicCommit())) {
         $is_commit = true;
         $params['commit'] = $drequest->getSymbolicCommit();
     } else {
         $is_commit = false;
     }
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $tags = array();
             break;
         default:
             $conduit_result = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', $params);
             $tags = DiffusionRepositoryTag::newFromConduit($conduit_result);
             break;
     }
     $tags = $pager->sliceResults($tags);
     $content = null;
     $header = id(new PHUIHeaderView())->setHeader(pht('Tags'))->setHeaderIcon('fa-tags');
     if (!$tags) {
         $content = $this->renderStatusMessage(pht('No Tags'), $is_commit ? pht('This commit has no tags.') : pht('This repository has no tags.'));
     } else {
         $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withRepository($repository)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
         $view = id(new DiffusionTagListView())->setTags($tags)->setUser($viewer)->setCommits($commits)->setDiffusionRequest($drequest);
         $phids = $view->getRequiredHandlePHIDs();
         $handles = $this->loadViewerHandles($phids);
         $view->setHandles($handles);
         $content = $view;
     }
     $crumbs = $this->buildCrumbs(array('tags' => true, 'commit' => $drequest->getSymbolicCommit()));
     $crumbs->setBorder(true);
     $box = id(new PHUIObjectBoxView())->setHeaderText($repository->getDisplayName())->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setTable($view);
     $pager_box = $this->renderTablePagerBox($pager);
     $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter(array($box, $pager_box));
     return $this->newPage()->setTitle(array(pht('Tags'), $repository->getDisplayName()))->setCrumbs($crumbs)->appendChild($view);
 }
 public function processRequest()
 {
     $drequest = $this->getDiffusionRequest();
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
     $pager = new AphrontPagerView();
     $pager->setURI($request->getRequestURI(), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $params = array('limit' => $pager->getPageSize() + 1, 'offset' => $pager->getOffset());
     if ($drequest->getSymbolicCommit()) {
         $is_commit = true;
         $params['commit'] = $drequest->getSymbolicCommit();
     } else {
         $is_commit = false;
     }
     $tags = array();
     try {
         $conduit_result = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', $params);
         $tags = DiffusionRepositoryTag::newFromConduit($conduit_result);
     } catch (ConduitException $ex) {
         if ($ex->getMessage() != 'ERR-UNSUPPORTED-VCS') {
             throw $ex;
         }
     }
     $tags = $pager->sliceResults($tags);
     $content = null;
     if (!$tags) {
         $content = $this->renderStatusMessage(pht('No Tags'), $is_commit ? pht('This commit has no tags.') : pht('This repository has no tags.'));
     } else {
         $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withRepository($repository)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
         $view = id(new DiffusionTagListView())->setTags($tags)->setUser($viewer)->setCommits($commits)->setDiffusionRequest($drequest);
         $phids = $view->getRequiredHandlePHIDs();
         $handles = $this->loadViewerHandles($phids);
         $view->setHandles($handles);
         $panel = id(new AphrontPanelView())->setNoBackground(true)->appendChild($view)->appendChild($pager);
         $content = $panel;
     }
     $crumbs = $this->buildCrumbs(array('tags' => true, 'commit' => $drequest->getSymbolicCommit()));
     return $this->buildApplicationPage(array($crumbs, $content), array('title' => array(pht('Tags'), $repository->getCallsign() . ' Repository'), 'device' => false));
 }
 protected function buildPropertyView(DiffusionRequest $drequest, PhabricatorActionListView $actions)
 {
     $viewer = $this->getRequest()->getUser();
     $view = id(new PHUIPropertyListView())->setUser($viewer)->setActionList($actions);
     $stable_commit = $drequest->getStableCommit();
     $callsign = $drequest->getRepository()->getCallsign();
     $view->addProperty(pht('Commit'), phutil_tag('a', array('href' => $drequest->generateURI(array('action' => 'commit', 'commit' => $stable_commit))), $drequest->getRepository()->formatCommitName($stable_commit)));
     if ($drequest->getSymbolicType() == 'tag') {
         $symbolic = $drequest->getSymbolicCommit();
         $view->addProperty(pht('Tag'), $symbolic);
         $tags = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('names' => array($symbolic), 'needMessages' => true));
         $tags = DiffusionRepositoryTag::newFromConduit($tags);
         $tags = mpull($tags, null, 'getName');
         $tag = idx($tags, $symbolic);
         if ($tag && strlen($tag->getMessage())) {
             $view->addSectionHeader(pht('Tag Content'));
             $view->addTextContent($this->markupText($tag->getMessage()));
         }
     }
     return $view;
 }
 protected function buildPropertyView(DiffusionRequest $drequest, PhabricatorActionListView $actions)
 {
     $viewer = $this->getViewer();
     $view = id(new PHUIPropertyListView())->setUser($viewer)->setActionList($actions);
     $stable_commit = $drequest->getStableCommit();
     $callsign = $drequest->getRepository()->getCallsign();
     $view->addProperty(pht('Commit'), phutil_tag('a', array('href' => $drequest->generateURI(array('action' => 'commit', 'commit' => $stable_commit))), $drequest->getRepository()->formatCommitName($stable_commit)));
     if ($drequest->getSymbolicType() == 'tag') {
         $symbolic = $drequest->getSymbolicCommit();
         $view->addProperty(pht('Tag'), $symbolic);
         $tags = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('names' => array($symbolic), 'needMessages' => true));
         $tags = DiffusionRepositoryTag::newFromConduit($tags);
         $tags = mpull($tags, null, 'getName');
         $tag = idx($tags, $symbolic);
         if ($tag && strlen($tag->getMessage())) {
             $view->addSectionHeader(pht('Tag Content'));
             $view->addTextContent($this->markupText($tag->getMessage()));
         }
     }
     $repository = $drequest->getRepository();
     $owners = 'PhabricatorOwnersApplication';
     if (PhabricatorApplication::isClassInstalled($owners)) {
         $package_query = id(new PhabricatorOwnersPackageQuery())->setViewer($viewer)->withControl($repository->getPHID(), array($drequest->getPath()));
         $package_query->execute();
         $packages = $package_query->getControllingPackagesForPath($repository->getPHID(), $drequest->getPath());
         if ($packages) {
             $ownership = id(new PHUIStatusListView())->setUser($viewer);
             foreach ($packages as $package) {
                 $icon = 'fa-list-alt';
                 $color = 'grey';
                 $item = id(new PHUIStatusItemView())->setIcon($icon, $color)->setTarget($viewer->renderHandle($package->getPHID()));
                 $ownership->addItem($item);
             }
         } else {
             $ownership = phutil_tag('em', array(), pht('None'));
         }
         $view->addProperty(pht('Packages'), $ownership);
     }
     return $view;
 }
 protected function processDiffusionRequest(AphrontRequest $request)
 {
     $drequest = $this->getDiffusionRequest();
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
     $pager = new PHUIPagerView();
     $pager->setURI($request->getRequestURI(), 'offset');
     $pager->setOffset($request->getInt('offset'));
     $params = array('limit' => $pager->getPageSize() + 1, 'offset' => $pager->getOffset());
     if ($drequest->getSymbolicCommit()) {
         $is_commit = true;
         $params['commit'] = $drequest->getSymbolicCommit();
     } else {
         $is_commit = false;
     }
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $tags = array();
             break;
         default:
             $conduit_result = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', $params);
             $tags = DiffusionRepositoryTag::newFromConduit($conduit_result);
             break;
     }
     $tags = $pager->sliceResults($tags);
     $content = null;
     if (!$tags) {
         $content = $this->renderStatusMessage(pht('No Tags'), $is_commit ? pht('This commit has no tags.') : pht('This repository has no tags.'));
     } else {
         $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withRepository($repository)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->needCommitData(true)->execute();
         $view = id(new DiffusionTagListView())->setTags($tags)->setUser($viewer)->setCommits($commits)->setDiffusionRequest($drequest);
         $phids = $view->getRequiredHandlePHIDs();
         $handles = $this->loadViewerHandles($phids);
         $view->setHandles($handles);
         $panel = id(new PHUIObjectBoxView())->setHeaderText(pht('Tags'))->appendChild($view);
         $content = $panel;
     }
     $crumbs = $this->buildCrumbs(array('tags' => true, 'commit' => $drequest->getSymbolicCommit()));
     return $this->buildApplicationPage(array($crumbs, $content, $pager), array('title' => array(pht('Tags'), pht('%s Repository', $repository->getCallsign()))));
 }
 public function processRequest()
 {
     $request = $this->getDiffusionRequest();
     $tag_limit = 10;
     $tags = array();
     try {
         $tags = DiffusionRepositoryTag::newFromConduit($this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('commit' => $request->getCommit(), 'limit' => $tag_limit + 1)));
     } catch (ConduitException $ex) {
         if ($ex->getMessage() != 'ERR-UNSUPPORTED-VCS') {
             throw $ex;
         }
     }
     $has_more_tags = count($tags) > $tag_limit;
     $tags = array_slice($tags, 0, $tag_limit);
     $tag_links = array();
     foreach ($tags as $tag) {
         $tag_links[] = phutil_tag('a', array('href' => $request->generateURI(array('action' => 'browse', 'commit' => $tag->getName()))), $tag->getName());
     }
     if ($has_more_tags) {
         $tag_links[] = phutil_tag('a', array('href' => $request->generateURI(array('action' => 'tags'))), pht("More Tags…"));
     }
     return id(new AphrontAjaxResponse())->setContent($tag_links ? implode(', ', $tag_links) : pht('None'));
 }
 protected function executeQuery()
 {
     $drequest = $this->getRequest();
     $repository = $drequest->getRepository();
     $count = $this->getOffset() + $this->getLimit();
     list($stdout) = $repository->execxLocalCommand('for-each-ref %C --sort=-creatordate --format=%s refs/tags', $count ? '--count=' . (int) $count : null, '%(objectname) %(objecttype) %(refname) %(*objectname) %(*objecttype) ' . '%(subject)%01%(creator)');
     $stdout = trim($stdout);
     if (!strlen($stdout)) {
         return array();
     }
     $tags = array();
     foreach (explode("\n", $stdout) as $line) {
         list($info, $creator) = explode("", $line);
         list($objectname, $objecttype, $refname, $refobjectname, $refobjecttype, $description) = explode(' ', $info, 6);
         $matches = null;
         if (!preg_match('/^(.*) ([0-9]+) ([0-9+-]+)$/', $creator, $matches)) {
             // It's possible a tag doesn't have a creator (tagger)
             $author = null;
             $epoch = null;
         } else {
             $author = $matches[1];
             $epoch = $matches[2];
         }
         $tag = new DiffusionRepositoryTag();
         $tag->setAuthor($author);
         $tag->setEpoch($epoch);
         $tag->setCommitIdentifier(nonempty($refobjectname, $objectname));
         $tag->setName(preg_replace('@^refs/tags/@', '', $refname));
         $tag->setDescription($description);
         $tag->setType('git/' . $objecttype);
         $tags[] = $tag;
     }
     $offset = $this->getOffset();
     if ($offset) {
         $tags = array_slice($tags, $offset);
     }
     return $tags;
 }
 private function buildTagListTable(DiffusionRequest $drequest)
 {
     $viewer = $this->getRequest()->getUser();
     $repository = $drequest->getRepository();
     switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             // no tags in SVN
             return null;
     }
     $tag_limit = 15;
     $tags = array();
     $tags = DiffusionRepositoryTag::newFromConduit($this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('commit' => null, 'limit' => $tag_limit + 1)));
     if (!$tags) {
         return null;
     }
     $more_tags = count($tags) > $tag_limit;
     $tags = array_slice($tags, 0, $tag_limit);
     $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->withRepository($repository)->needCommitData(true)->execute();
     $view = id(new DiffusionTagListView())->setUser($viewer)->setDiffusionRequest($drequest)->setTags($tags)->setCommits($commits);
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
     $panel = new PHUIObjectBoxView();
     $header = new PHUIHeaderView();
     $header->setHeader(pht('Tags'));
     if ($more_tags) {
         $header->setSubHeader(pht('Showing the %d most recent tags.', $tag_limit));
     }
     $icon = id(new PHUIIconView())->setIconFont('fa-tag');
     $button = new PHUIButtonView();
     $button->setText(pht('Show All Tags'));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($drequest->generateURI(array('action' => 'tags')));
     $header->addActionLink($button);
     $panel->setHeader($header);
     $panel->setTable($view);
     return $panel;
 }
 protected function buildPropertyView(DiffusionRequest $drequest)
 {
     $viewer = $this->getViewer();
     $view = id(new PHUIPropertyListView())->setUser($viewer);
     if ($drequest->getSymbolicType() == 'tag') {
         $symbolic = $drequest->getSymbolicCommit();
         $view->addProperty(pht('Tag'), $symbolic);
         $tags = $this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('names' => array($symbolic), 'needMessages' => true));
         $tags = DiffusionRepositoryTag::newFromConduit($tags);
         $tags = mpull($tags, null, 'getName');
         $tag = idx($tags, $symbolic);
         if ($tag && strlen($tag->getMessage())) {
             $view->addSectionHeader(pht('Tag Content'), 'fa-tag');
             $view->addTextContent($this->markupText($tag->getMessage()));
         }
     }
     if ($view->hasAnyProperties()) {
         return $view;
     }
     return null;
 }
 private function buildTagListTable(DiffusionRequest $drequest)
 {
     $viewer = $this->getRequest()->getUser();
     $tag_limit = 15;
     $tags = array();
     try {
         $tags = DiffusionRepositoryTag::newFromConduit($this->callConduitWithDiffusionRequest('diffusion.tagsquery', array('commit' => null, 'limit' => $tag_limit + 1)));
     } catch (ConduitException $e) {
         if ($e->getMessage() != 'ERR-UNSUPPORTED-VCS') {
             throw $e;
         }
     }
     if (!$tags) {
         return null;
     }
     $more_tags = count($tags) > $tag_limit;
     $tags = array_slice($tags, 0, $tag_limit);
     $commits = id(new DiffusionCommitQuery())->setViewer($viewer)->withIdentifiers(mpull($tags, 'getCommitIdentifier'))->withRepository($drequest->getRepository())->needCommitData(true)->execute();
     $view = id(new DiffusionTagListView())->setUser($viewer)->setDiffusionRequest($drequest)->setTags($tags)->setCommits($commits);
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
     $panel = new PHUIObjectBoxView();
     $header = new PHUIHeaderView();
     $header->setHeader(pht('Tags'));
     if ($more_tags) {
         $header->setSubHeader(pht('Showing the %d most recent tags.', $tag_limit));
     }
     $icon = id(new PHUIIconView())->setIconFont('fa-tag');
     $button = new PHUIButtonView();
     $button->setText(pht('Show All Tags'));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($drequest->generateURI(array('action' => 'tags')));
     $header->addActionLink($button);
     $panel->setHeader($header);
     $panel->appendChild($view);
     return $panel;
 }