import tempfile
import shutil
import re
+from datetime import datetime
import gbp.rpm as rpm
from gbp.rpm.policy import RpmPkgPolicy
options.spec_dir = ''
+def update_tag_str_fields(fields, tag_format_str, repo, commit_info):
+ """Update string format fields for packaging tag"""
+ fields['nowtime'] = datetime.now().strftime(RpmPkgPolicy.tag_timestamp_format)
+
+ fields['authortime'] = datetime.fromtimestamp(int(commit_info['author'].date.split()[0])).strftime(RpmPkgPolicy.tag_timestamp_format)
+ fields['committime'] = datetime.fromtimestamp(int(commit_info['committer'].date.split()[0])).strftime(RpmPkgPolicy.tag_timestamp_format)
+ fields['version'] = version=RpmPkgPolicy.compose_full_version(fields)
+
+ # Parse tags with incremental numbering
+ re_fields = dict(fields,
+ nowtimenum=fields['nowtime'] + ".(?P<nownum>[0-9]+)",
+ authortimenum=fields['authortime'] + ".(?P<authornum>[0-9]+)",
+ committimenum=fields['committime'] + ".(?P<commitnum>[0-9]+)")
+ 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
+
+ fields['nowtimenum'] = fields['nowtime'] + ".1"
+ fields['authortimenum'] = fields['authortime'] + ".1"
+ fields['committimenum'] = fields['committime'] + ".1"
+ for t in reversed(repo.get_tags()):
+ m = tag_re.match(t)
+ if m:
+ if 'nownum' in m.groupdict():
+ fields['nowtimenum'] = "%s.%s" % (fields['nowtime'], int(m.group('nownum'))+1)
+ if 'authornum' in m.groupdict():
+ fields['authortimenum'] = "%s.%s" % (fields['authortime'], int(m.group('authornum'))+1)
+ if 'commitnum' in m.groupdict():
+ fields['committimenum'] = "%s.%s" % (fields['committime'], int(m.group('commitnum'))+1)
+ break
+
+
+def packaging_tag_name(repo, spec, commit_info, options):
+ """Compose packaging tag as string"""
+ tag_str_fields = dict(spec.version, vendor=options.vendor)
+ update_tag_str_fields(tag_str_fields, options.packaging_tag, repo,
+ commit_info)
+ return repo.version_to_tag(options.packaging_tag, tag_str_fields)
+
+
+def create_packaging_tag(repo, tag, commit, version, options):
+ """Create a packaging/release Git tag"""
+ msg = "%s release %s" % (options.vendor,
+ RpmPkgPolicy.compose_full_version(version))
+ repo.create_tag(name=tag, msg=msg, sign=options.sign_tags,
+ keyid=options.keyid, commit=commit)
+
+
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 ]
# 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))
- tag_str_fields = dict(spec.version, vendor=options.vendor)
- tag = repo.version_to_tag(options.packaging_tag, tag_str_fields)
+ gbp.log.info("Tagging %s" % RpmPkgPolicy.compose_full_version(spec.version))
+ commit_info = repo.get_commit_info(tree)
+ tag = packaging_tag_name(repo, spec, commit_info, options)
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)),
- sign=options.sign_tags, keyid=options.keyid, commit=tree)
+ create_packaging_tag(repo, tag, commit=tree, version=spec.version,
+ options=options)
if options.posttag:
sha = repo.rev_parse("%s^{}" % tag)
Command(options.posttag, shell=True,