diff options
author | Luca Boccassi <bluca@debian.org> | 2018-09-06 18:34:13 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2018-11-23 16:53:55 +0100 |
commit | e5aedb16548a6a83223862b96ba2112e0c02c126 (patch) | |
tree | 15d10c4317493d39d2c7a63fca1dfce155762ce0 /gbp | |
parent | 44acc6d523e08e8e8a97f8cddd37419ab16db4eb (diff) |
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 <bluca@debian.org>
Diffstat (limited to 'gbp')
-rw-r--r-- | gbp/deb/git.py | 6 | ||||
-rw-r--r-- | gbp/pkg/pkgpolicy.py | 38 | ||||
-rwxr-xr-x | gbp/scripts/buildpackage.py | 5 | ||||
-rwxr-xr-x | gbp/scripts/export_orig.py | 5 |
4 files changed, 49 insertions, 5 deletions
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<M>[^%])' + r'%(?P<R>([^%]|\\%))+' + 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(): |