buildpackage-rpm: add more tagging options
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Wed, 4 Sep 2013 07:33:03 +0000 (10:33 +0300)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 7 Jan 2014 14:21:29 +0000 (16:21 +0200)
Add new possible keywords to be used in packaging-tag format string:
'nowtime', 'authortime', 'committime', 'nowtimenum', 'authortimenum' and
'committimenum'.

The '*timenum' keyword denote the corresponding '*time' keyword appended
with an additional incremental serial number. E.g. if 'nowtime' would
produce '20120531', 'nowtimenum' would (the first time) produce
'20120531.1'.

What is completely missing is a way to support these new tag keywords in
git-import-srpm tool. So, if you use these tags, git-import-srpm is not
able to reproduce the tags, (and, it is not necessarily able to
correctly tell if you've already imported a certain version of the
package).

Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
gbp/rpm/policy.py
gbp/scripts/buildpackage_rpm.py

index 9fbf5632f517f54dba0c2c4e28997a86d0d6cfbb..231f7ead07a55c47c9e6e50d161cafcce218219d 100644 (file)
@@ -43,6 +43,9 @@ class RpmPkgPolicy(PkgPolicy):
                            "and can only containg alphanumerics or characters "
                            "in %s" % list(version_whitelist_chars))
 
+    # Time stamp format to be used in tagging
+    tag_timestamp_format = "%Y%m%d"
+
     @classmethod
     def is_valid_orig_archive(cls, filename):
         """
index 3dd171689b79cd69d1b550f4be4d688d5a6f12c2..9adea212d5099a0e14fd02ce000155a37ff1fe4c 100755 (executable)
@@ -25,6 +25,7 @@ import sys
 import tempfile
 import shutil
 import re
+import datetime
 
 import gbp.rpm as rpm
 from gbp.rpm.policy import RpmPkgPolicy
@@ -220,6 +221,45 @@ def setup_builder(options, builder_args):
         options.spec_dir = ''
 
 
+def update_tag_str_fields(tag_format_str, fields, repo, commit):
+    extra = fields
+
+    extra['nowtime'] = datetime.datetime.now().strftime(RpmPkgPolicy.tag_timestamp_format)
+
+    commit_info = repo.get_commit_info(commit)
+    extra['authortime'] = datetime.datetime.fromtimestamp(int(commit_info['author'].date.split()[0])).strftime(RpmPkgPolicy.tag_timestamp_format)
+    extra['committime'] = datetime.datetime.fromtimestamp(int(commit_info['committer'].date.split()[0])).strftime(RpmPkgPolicy.tag_timestamp_format)
+    extra['version'] = version=RpmPkgPolicy.compose_full_version(fields)
+
+    # Parse tags with incremental numbering
+    re_fields = dict(extra,
+                     nowtimenum=extra['nowtime'] + ".(?P<nownum>[0-9]+)",
+                     authortimenum=extra['authortime'] + ".(?P<authornum>[0-9]+)",
+                     committimenum=extra['committime'] + ".(?P<commitnum>[0-9]+)")
+    re_fields.update(fields)
+
+    try:
+        tag_re = re.compile("^%s$" % (tag_format_str % re_fields))
+    except KeyError, err:
+        raise GbpError, "Unknown field '%s' in packaging-tag format string" % err
+
+    extra['nowtimenum'] = extra['nowtime'] + ".1"
+    extra['authortimenum'] = extra['authortime'] + ".1"
+    extra['committimenum'] = extra['committime'] + ".1"
+    for t in reversed(repo.get_tags()):
+        m = tag_re.match(t)
+        if m:
+            if 'nownum' in m.groupdict():
+                extra['nowtimenum'] = "%s.%s" % (extra['nowtime'], int(m.group('nownum'))+1)
+            if 'authornum' in m.groupdict():
+                extra['authortimenum'] = "%s.%s" % (extra['authortime'], int(m.group('authornum'))+1)
+            if 'commitnum' in m.groupdict():
+                extra['committimenum'] = "%s.%s" % (extra['committime'], int(m.group('commitnum'))+1)
+            break
+
+    return extra
+
+
 def parse_args(argv, prefix):
     args = [ arg for arg in argv[1:] if arg.find('--%s' % prefix) == 0 ]
     builder_args = [ arg for arg in argv[1:] if arg.find('--%s' % prefix) == -1 ]
@@ -472,13 +512,14 @@ def main(argv):
 
         # Tag (note: tags the exported version)
         if options.tag or options.tag_only:
-            gbp.log.info("Tagging %s" % rpm.RpmPkgPolicy.compose_full_version(spec.version))
+            gbp.log.info("Tagging %s" % RpmPkgPolicy.compose_full_version(spec.version))
             tag_str_fields = dict(spec.version, vendor=options.vendor)
+            tag_str_fields = update_tag_str_fields(options.packaging_tag, tag_str_fields, repo, tree)
             tag = repo.version_to_tag(options.packaging_tag, tag_str_fields)
             if options.retag and repo.has_tag(tag):
                 repo.delete_tag(tag)
             repo.create_tag(name=tag, msg="%s release %s" % (options.vendor,
-                                rpm.RpmPkgPolicy.compose_full_version(spec.version)),
+                            RpmPkgPolicy.compose_full_version(spec.version)),
                             sign=options.sign_tags, keyid=options.keyid, commit=tree)
             if options.posttag:
                 sha = repo.rev_parse("%s^{}" % tag)