From e5aedb16548a6a83223862b96ba2112e0c02c126 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Thu, 6 Sep 2018 18:34:13 +0200 Subject: buildpackage, export-orig: support version substitution for --git-tarball-dir Add support for passing %(version), %(hversion) and %(version%A%B) in buildpackage --git-tarball-dir and export-orig --tarball-dir. Closes: #909266 Signed-off-by: Luca Boccassi --- gbp/deb/git.py | 6 ++---- gbp/pkg/pkgpolicy.py | 38 ++++++++++++++++++++++++++++++++++++++ gbp/scripts/buildpackage.py | 5 ++++- gbp/scripts/export_orig.py | 5 +++++ 4 files changed, 49 insertions(+), 5 deletions(-) (limited to 'gbp') diff --git a/gbp/deb/git.py b/gbp/deb/git.py index fa865ee2..85c9da5e 100644 --- a/gbp/deb/git.py +++ b/gbp/deb/git.py @@ -22,9 +22,9 @@ import re from gbp.command_wrappers import CommandExecFailed from gbp.git import GitRepositoryError from gbp.deb.pristinetar import DebianPristineTar -from gbp.format import format_str from gbp.paths import to_bin from gbp.pkg.git import PkgGitRepository +from gbp.pkg.pkgpolicy import PkgPolicy import gbp.log @@ -169,9 +169,7 @@ class DebianGitRepository(PkgGitRepository): >>> DebianGitRepository.version_to_tag(r'%(version%-%\\%)s', "0-1.2.3") '0%1.2.3' """ - f, v = cls._mangle_version(format, version) - return format_str(f, dict(version=cls._sanitize_version(v), - hversion=cls._sanitize_version(v).replace('.', '-'))) + return PkgPolicy.version_subst(format, version, cls._sanitize_version) @classmethod def _mangle_version(cls, format, version): diff --git a/gbp/pkg/pkgpolicy.py b/gbp/pkg/pkgpolicy.py index 53887fee..b525ce20 100644 --- a/gbp/pkg/pkgpolicy.py +++ b/gbp/pkg/pkgpolicy.py @@ -20,6 +20,7 @@ import os import re from gbp.pkg.archive import Archive +from gbp.format import format_str class PkgPolicy(object): @@ -165,3 +166,40 @@ class PkgPolicy(object): @classmethod def symlink_orig(cls, orig_file, orig_dir, output_dir, force=False): return cls.symlink_origs([orig_file], orig_dir, output_dir, force=force) + + @staticmethod + def version_subst(format, version, sanitizer=lambda arg: arg): + """Generate a string from a given format and a version. The extracted + version can be passed through the sanitizer function argument before + being formatted into a string. + + %(version)s provides a clean version. + + %(hversion)s provides the same thing, but with '.' replaced with '-'. + hversion is useful for upstreams with tagging policies that prohibit . + characters. + + %(version%A%B)s provides %(version)s with string 'A' replaced by 'B'. + This way, simple version mangling is possible via substitution. + Inside the substition string, '%' needs to be escaped. See the + examples below. + + >>> PkgPolicy.version_subst("debian/%(version)s", "0:0~0") + 'debian/0:0~0' + >>> PkgPolicy.version_subst("libfoo-%(hversion)s", "1.8.1") + 'libfoo-1-8-1' + >>> PkgPolicy.version_subst("v%(version%.%_)s", "1.2.3") + 'v1_2_3' + >>> PkgPolicy.version_subst(r'%(version%-%\\%)s', "0-1.2.3") + '0%1.2.3' + """ + version_mangle_re = (r'%\(version' + r'%(?P[^%])' + r'%(?P([^%]|\\%))+' + r'\)s') + r = re.search(version_mangle_re, format) + if r: + format = re.sub(version_mangle_re, "%(version)s", format) + version = version.replace(r.group('M'), r.group('R').replace(r'\%', '%')) + return format_str(format, dict(version=sanitizer(version), + hversion=sanitizer(version).replace('.', '-'))) diff --git a/gbp/scripts/buildpackage.py b/gbp/scripts/buildpackage.py index d3a3222e..bd939974 100755 --- a/gbp/scripts/buildpackage.py +++ b/gbp/scripts/buildpackage.py @@ -45,6 +45,7 @@ from gbp.scripts.common.hook import Hook from gbp.scripts.export_orig import prepare_upstream_tarballs, guess_comp_type from gbp.scripts.tag import perform_tagging +from gbp.pkg.pkgpolicy import PkgPolicy # Functions to handle export-dir @@ -499,7 +500,9 @@ def main(argv): if not options.tag_only: output_dir = prepare_output_dir(options.export_dir) - tarball_dir = options.tarball_dir or output_dir + tarball_dir = output_dir + if options.tarball_dir and source.upstream_version is not None: + tarball_dir = PkgPolicy.version_subst(options.tarball_dir, source.upstream_version) tmp_dir = os.path.join(output_dir, "%s-tmp" % source.sourcepkg) build_env, hook_env = setup_pbuilder(options, repo, source.is_native()) major = (source.debian_version if source.is_native() diff --git a/gbp/scripts/export_orig.py b/gbp/scripts/export_orig.py index 1afbe6db..181c9093 100755 --- a/gbp/scripts/export_orig.py +++ b/gbp/scripts/export_orig.py @@ -29,6 +29,7 @@ import gbp.log import gbp.notifications from gbp.scripts.common import ExitCodes from gbp.pkg import Compressor, Archive +from gbp.pkg.pkgpolicy import PkgPolicy def prepare_upstream_tarballs(repo, source, options, tarball_dir, output_dir): @@ -335,6 +336,10 @@ def main(argv): except Exception as e: raise GbpError("Can't determine package type: %s" % e) + if options.tarball_dir and source.upstream_version is not None: + options.tarball_dir = PkgPolicy.version_subst(options.tarball_dir, + source.upstream_version) + output_dir = options.tarball_dir or os.path.join(repo.path, '..') if source.is_native(): -- cgit v1.2.3