from gbp.git import GitRepository, GitRepositoryError
from gbp.pkg.pristinetar import PristineTar
+from gbp.rpm.policy import RpmPkgPolicy
class RpmGitRepository(GitRepository):
"""A git repository that holds the source of an RPM package"""
@param format: tag pattern
@type format: C{str}
- @param version: rpm version number
- @type version: C{str}
+ @param version: rpm version components ('epoch', 'upstreamversion', 'release',...)
+ @type version: C{dict} of C{str}
+ @param vendor: distribution vendor
+ @type vendor: C{str}
@return: sha1 of the commit the tag references to
"""
tag = self.version_to_tag(format, version, vendor)
@staticmethod
def version_to_tag(format, version, vendor="vendor"):
- """Generate a tag from a given format and a version
+ """
+ Generate a tag from a given format and a version
+
+ @param format: tag pattern
+ @type format: C{str}
+ @param version: rpm version components ('epoch', 'upstreamversion', 'release',...)
+ @type version: C{dict} of C{str}
+ @param vendor: distribution vendor
+ @type vendor: C{str}
+ @return: version tag
- >>> RpmGitRepository.version_to_tag("packaging/%(version)s", "0:0~0")
+ >>> RpmGitRepository.version_to_tag("packaging/%(version)s", dict(epoch='0', upstreamversion='0~0'))
'packaging/0%0_0'
- >>> RpmGitRepository.version_to_tag("%(vendor)s/v%(version)s", "1.0", "myvendor")
- 'myvendor/v1.0'
+ >>> RpmGitRepository.version_to_tag("%(vendor)s/v%(version)s", dict(upstreamversion='1.0', release='2'), "myvendor")
+ 'myvendor/v1.0-2'
"""
- return format % dict(version=RpmGitRepository._sanitize_version(version),
- vendor=vendor)
+ version_tag = format % dict(version,
+ version=RpmPkgPolicy.compose_full_version(version),
+ vendor=vendor)
+ return RpmGitRepository._sanitize_tag(version_tag)
@staticmethod
- def _sanitize_version(version):
+ def _sanitize_tag(tag):
"""sanitize a version so git accepts it as a tag
- >>> RpmGitRepository._sanitize_version("0.0.0")
+ >>> RpmGitRepository._sanitize_tag("0.0.0")
'0.0.0'
- >>> RpmGitRepository._sanitize_version("0.0~0")
+ >>> RpmGitRepository._sanitize_tag("0.0~0")
'0.0_0'
- >>> RpmGitRepository._sanitize_version("0:0.0")
+ >>> RpmGitRepository._sanitize_tag("0:0.0")
'0%0.0'
- >>> RpmGitRepository._sanitize_version("0%0~0")
+ >>> RpmGitRepository._sanitize_tag("0%0~0")
'0%0_0'
"""
- return version.replace('~', '_').replace(':', '%')
+ return tag.replace('~', '_').replace(':', '%')
@property
def pristine_tar_branch(self):
return True
return False
+ @classmethod
+ def split_full_version(cls, version):
+ """
+ Parse full version string and split it into individual "version
+ components", i.e. upstreamversion, epoch and release
+
+ @param version: full version of a package
+ @type version: C{str}
+ @return: individual version components
+ @rtype: C{dict}
+
+ >>> RpmPkgPolicy.split_full_version("1")
+ {'release': None, 'epoch': None, 'upstreamversion': '1'}
+ >>> RpmPkgPolicy.split_full_version("1.2.3-5.3")
+ {'release': '5.3', 'epoch': None, 'upstreamversion': '1.2.3'}
+ >>> RpmPkgPolicy.split_full_version("3:1.2.3")
+ {'release': None, 'epoch': '3', 'upstreamversion': '1.2.3'}
+ >>> RpmPkgPolicy.split_full_version("3:1-0")
+ {'release': '0', 'epoch': '3', 'upstreamversion': '1'}
+ """
+ epoch = None
+ upstreamversion = None
+ release = None
+
+ e_vr = version.split(":", 1)
+ if len(e_vr) == 1:
+ v_r = e_vr[0].split("-", 1)
+ else:
+ epoch = e_vr[0]
+ v_r = e_vr[1].split("-", 1)
+ upstreamversion = v_r[0]
+ if len(v_r) > 1:
+ release = v_r[1]
+
+ return {'epoch': epoch,
+ 'upstreamversion': upstreamversion,
+ 'release': release}
+
+ @classmethod
+ def compose_full_version(cls, evr):
+ """
+ Compose a full version string from individual "version components",
+ i.e. epoch, version and release
+
+ @param evr: dict of version components
+ @type evr: C{dict} of C{str}
+ @return: full version
+ @rtype: C{str}
+
+ >>> RpmPkgPolicy.compose_full_version({'epoch': '', 'upstreamversion': '1.0'})
+ '1.0'
+ >>> RpmPkgPolicy.compose_full_version({'epoch': '2', 'upstreamversion': '1.0', 'release': None})
+ '2:1.0'
+ >>> RpmPkgPolicy.compose_full_version({'epoch': None, 'upstreamversion': '1', 'release': '0'})
+ '1-0'
+ >>> RpmPkgPolicy.compose_full_version({'epoch': '2', 'upstreamversion': '1.0', 'release': '2.3'})
+ '2:1.0-2.3'
+ >>> RpmPkgPolicy.compose_full_version({'epoch': '2', 'upstreamversion': '', 'release': '2.3'})
+ """
+ if 'upstreamversion' in evr and evr['upstreamversion']:
+ version = ""
+ if 'epoch' in evr and evr['epoch']:
+ version += "%s:" % evr['epoch']
+ version += evr['upstreamversion']
+ if 'release' in evr and evr['release']:
+ version += "-%s" % evr['release']
+ if version:
+ return version
+ return None
+
def get_upstream_tree(repo, spec, options):
"""Determine the upstream tree from the given options"""
if options.upstream_tree.upper() == 'TAG':
- upstream_tree = repo.version_to_tag(options.upstream_tag, spec.version, vendor="Upstream")
+ upstream_tree = repo.version_to_tag(options.upstream_tag, dict(upstreamversion=spec.version), "Upstream")
elif options.upstream_tree.upper() == 'BRANCH':
if not repo.has_branch(options.upstream_branch):
raise GbpError("%s is not a valid branch" % options.upstream_branch)
# Tag (note: tags the exported version)
if options.tag or options.tag_only:
gbp.log.info("Tagging %s" % spec.version)
- tag = repo.version_to_tag(options.packaging_tag, spec.version, vendor=options.vendor)
+ tag = repo.version_to_tag(options.packaging_tag, dict(upstreamversion=spec.version), options.vendor)
if options.retag and repo.has_tag(tag):
repo.delete_tag(tag)
repo.create_tag(name=tag, msg="%s release %s" % (options.vendor, spec.version),
gbp.log.info("Pristine-tar: commiting %s" % pristine_orig)
repo.pristine_tar.commit(pristine_orig, options.upstream_branch)
- tag = repo.version_to_tag(options.upstream_tag, version, vendor="Upstream")
+ tag = repo.version_to_tag(options.upstream_tag, dict(upstreamversion=version), "Upstream")
repo.create_tag(name=tag,
msg="Upstream version %s" % version,
commit=commit,
import gbp.command_wrappers as gbpc
from gbp.rpm import (parse_srpm, SrcRpmFile, SpecFile, guess_spec, NoSpecError,
parse_spec, RpmUpstreamSource)
+from gbp.rpm.policy import RpmPkgPolicy
from gbp.rpm.git import (RpmGitRepository, GitRepositoryError)
from gbp.git.modifier import GitModifier
from gbp.config import GbpOptionParserRpm, GbpOptionGroup, no_upstream_branch_msg
def move_tag_stamp(repo, format, version, vendor):
"Move tag out of the way appending the current timestamp"
old = repo.version_to_tag(format, version, vendor)
- timestamped = "%s~%s" % (version, int(time.time()))
- new = repo.version_to_tag(format, timestamped, vendor)
+ new = repo.version_to_tag('%s~%d' % (format, int(time.time())),
+ version, vendor)
repo.move_tag(old, new)
spec = parse_spec(pkg)
pkgname = spec.name
- pkgver = "%s-%s" % (spec.version, spec.release)
+ pkgver = dict(upstreamversion=spec.version, release=spec.release)
upstream_version = spec.version
packager = spec.packager
unpacked = True
dirs['src'] = os.path.abspath(os.path.dirname(pkg))
src = parse_srpm(srpm)
pkgname = src.name
- pkgver = src.version
+ pkgver = dict(upstreamversion=src.version)
upstream_version = src.upstream_version
packager = src.packager
unpacked = False
upstream = None
format = [(options.upstream_tag, "Upstream"), (options.packaging_tag, options.vendor)][options.native]
- tag = repo.version_to_tag(format[0], upstream_version, options.vendor)
+ tag = repo.version_to_tag(format[0], dict(upstreamversion=upstream_version), options.vendor)
if repo.find_version(options.packaging_tag, pkgver, options.vendor):
- gbp.log.warn("Version %s already imported." % pkgver)
+ gbp.log.warn("Version %s already imported." % RpmPkgPolicy.compose_full_version(pkgver))
if options.allow_same_version:
- gbp.log.info("Moving tag of version '%s' since import forced" % pkgver)
+ gbp.log.info("Moving tag of version '%s' since import forced" % RpmPkgPolicy.compose_full_version(pkgver))
move_tag_stamp(repo, options.packaging_tag, pkgver, options.vendor)
else:
raise SkipImport
# Import upstream sources
if upstream:
- upstream_commit = repo.find_version(format[0], upstream_version, options.vendor)
+ upstream_commit = repo.find_version(format[0], dict(upstreamversion=upstream_version), options.vendor)
if not upstream_commit:
gbp.log.info("Tag %s not found, importing %s tarball" % (tag, format[1]))
raise GbpError
tag = repo.version_to_tag(options.packaging_tag, pkgver, options.vendor)
- msg = "%s release %s" % (options.vendor, pkgver)
+ msg = "%s release %s" % (options.vendor, RpmPkgPolicy.compose_full_version(pkgver))
if options.orphan_packaging or not upstream:
parents = []
gbpc.RemoveTree(dirs[d])()
if not ret and not skipped:
- gbp.log.info("Version '%s' imported under '%s'" % (pkgver, pkgname))
+ gbp.log.info("Version '%s' imported under '%s'" % (RpmPkgPolicy.compose_full_version(pkgver), pkgname))
return ret
if __name__ == '__main__':
raise GbpError, "Can't parse spec"
# Find upstream version
- upstream_commit = repo.find_version(options.upstream_tag, spec.version, vendor="Upstream")
+ upstream_commit = repo.find_version(options.upstream_tag, dict(upstreamversion=spec.version), "Upstream")
if not upstream_commit:
raise GbpError, ("Couldn't find upstream version %s. Don't know on what base to import." % spec.version)
raise GbpError, "Can't parse spec"
# Find upstream version
- commit = repo.find_version(options.upstream_tag, spec.version, vendor="Upstream")
+ commit = repo.find_version(options.upstream_tag, dict(upstreamversion=spec.version), "Upstream")
if commit:
commits=[commit]
else:
raise GbpError, "Can't parse spec"
# Find upstream version
- upstream_commit = repo.find_version(options.upstream_tag, spec.version, vendor="Upstream")
+ upstream_commit = repo.find_version(options.upstream_tag, dict(upstreamversion=spec.version), "Upstream")
if not upstream_commit:
raise GbpError, ("Couldn't find upstream version %s. Don't know on what base to import." % spec.version)