aboutsummaryrefslogtreecommitdiffhomepage
path: root/gbp
diff options
context:
space:
mode:
authorLuca Boccassi <bluca@debian.org>2018-09-06 18:34:13 +0200
committerGuido Günther <agx@sigxcpu.org>2018-11-23 16:53:55 +0100
commite5aedb16548a6a83223862b96ba2112e0c02c126 (patch)
tree15d10c4317493d39d2c7a63fca1dfce155762ce0 /gbp
parent44acc6d523e08e8e8a97f8cddd37419ab16db4eb (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.py6
-rw-r--r--gbp/pkg/pkgpolicy.py38
-rwxr-xr-xgbp/scripts/buildpackage.py5
-rwxr-xr-xgbp/scripts/export_orig.py5
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():