MirrorGitRepository: add get_tag_info() method
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 1 Apr 2014 09:15:48 +0000 (12:15 +0300)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 1 Apr 2014 10:44:23 +0000 (13:44 +0300)
For getting data about a tag - similar to get_commit_info().

Change-Id: I158b9fffd831842253147bec8d88ecee511ee0c1
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp_repocache/__init__.py
tests/test_gbp_repocache.py

index d1e009e83313866fd55d439b2deed4efd4758e12..09cdea9af6fa941f84a43e49af92be876669868a 100644 (file)
@@ -22,6 +22,7 @@ import os
 import hashlib
 import shutil
 import fcntl
+import re
 
 import gbp.log as gbplog
 from gbp.git.repository import GitRepository, GitRepositoryError
@@ -108,6 +109,40 @@ class MirrorGitRepository(GitRepository): # pylint: disable=R0904
             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"""
index aa68391e5a90dc70b44bb1a666a02460e1fa0bcc..3205696480527e4a105c7723121f719ff4f2fffe 100644 (file)
@@ -79,6 +79,47 @@ class TestMirrorGitRepository(UnitTestsBase):
         # 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"""