import hashlib
import shutil
import fcntl
+import re
import gbp.log as gbplog
from gbp.git.repository import GitRepository, GitRepositoryError
repo.force_fetch()
return repo
+ def get_tag_info(self, tag):
+ """Look up data of a tag"""
+ stdout, _stderr, ret = self._git_inout('cat-file', ['tag', tag])
+ if ret:
+ raise GitRepositoryError("'%s' is not an annotated tag" % tag)
+
+ # Very old tags may not have tagger info, use None as default values
+ info = {'tagger': {'name': None, 'email': None, 'date': None}}
+
+ info['sha1'] = self.rev_parse(tag)
+ tagger_re = re.compile(
+ r'tagger (?P<name>\S.+) <(?P<email>\S+)> (?P<date>.+)')
+ num = 0
+ lines = stdout.splitlines()
+ for num, line in enumerate(lines):
+ match = tagger_re.match(line)
+ if match:
+ info['tagger'] = match.groupdict()
+ if not line:
+ break
+
+ # Parse subject, skip the blank line after tag/tagger info
+ subject_lines = []
+ for num, line in enumerate(lines[num+1:], num+1):
+ if not line:
+ break
+ subject_lines.append(line)
+ info['subject'] = ' '.join(subject_lines)
+
+ # Get message body, skip the blank line after subject
+ info['body'] = ''.join([line + '\n' for line in lines[num+1:]])
+
+ return info
+
class CachedRepoError(Exception):
"""Repository cache errors"""
# Restore orig repo HEAD
self.orig_repo.set_branch(orig_branch)
+ def test_get_tag_info(self):
+ """Test get_tag_info() method"""
+ repo = MirrorGitRepository.clone('testrepo', self.orig_repo.path)
+ tagger = {'name': 'John Doe',
+ 'email': 'j@example.com',
+ 'date': '1390000000 +0200'}
+ os.environ['GIT_COMMITTER_NAME'] = tagger['name']
+ os.environ['GIT_COMMITTER_EMAIL'] = tagger['email']
+ os.environ['GIT_COMMITTER_DATE'] = tagger['date']
+
+ # Non-tag
+ with assert_raises(GitRepositoryError):
+ info = repo.get_tag_info('HEAD')
+
+ # Completely empty message
+ repo.create_tag('tag1', msg=' ')
+ info = repo.get_tag_info('tag1')
+ eq_(info['tagger'], tagger)
+ eq_(info['subject'], '')
+ eq_(info['body'], '')
+ eq_(info['sha1'], repo.rev_parse('tag1'))
+
+ # Empty message body
+ repo.create_tag('tag2', msg='Tag subject')
+ info = repo.get_tag_info('tag2')
+ eq_(info['tagger'], tagger)
+ eq_(info['subject'], 'Tag subject')
+ eq_(info['body'], '')
+
+ # Multi-line subject with body
+ repo.create_tag('tag3', msg='Tag\nsubject\n\nTag\nbody')
+ info = repo.get_tag_info('tag3')
+ eq_(info['tagger'], tagger)
+ eq_(info['subject'], 'Tag subject')
+ eq_(info['body'], 'Tag\nbody\n')
+
+ # Clean environmemt
+ del os.environ['GIT_COMMITTER_NAME']
+ del os.environ['GIT_COMMITTER_EMAIL']
+ del os.environ['GIT_COMMITTER_DATE']
+
class TestCachedRepo(UnitTestsBase):
"""Test CachedRepo class"""