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; }