diff options
author | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2012-01-12 15:43:32 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2012-05-01 22:27:15 +0200 |
commit | 3308868a275d3ba96e411dab469367f14c767683 (patch) | |
tree | 36b41acefb169d810df60d21c51567dd3740dc96 /gbp | |
parent | 727cd7ba592364220ee71039f381406e6717220a (diff) |
Refactor deb helpers: introduce PkgPolicy class
Create a new 'pkg' basemodule, intended to be re-used by the upcoming
rpm package helpers. Move some deb functionality to a new pkg.PkgPolicy
class, to be used as a base for different package types. Introduces
Deb-specific deb.DebianPkgPolicy.
Diffstat (limited to 'gbp')
-rw-r--r-- | gbp/deb/__init__.py | 120 | ||||
-rw-r--r-- | gbp/deb/pristinetar.py | 3 | ||||
-rw-r--r-- | gbp/pkg/__init__.py | 104 | ||||
-rwxr-xr-x | gbp/scripts/buildpackage.py | 17 | ||||
-rw-r--r-- | gbp/scripts/import_orig.py | 12 |
5 files changed, 147 insertions, 109 deletions
diff --git a/gbp/deb/__init__.py b/gbp/deb/__init__.py index 50ce3f33..0b5168e3 100644 --- a/gbp/deb/__init__.py +++ b/gbp/deb/__init__.py @@ -28,42 +28,38 @@ import gbp.command_wrappers as gbpc from gbp.errors import GbpError from gbp.git import GitRepositoryError from gbp.deb.changelog import ChangeLog, NoChangeLogError +from gbp.pkg import (PkgPolicy, compressor_opts, compressor_aliases) # When trying to parse a version-number from a dsc or changes file, these are # the valid characters. debian_version_chars = 'a-zA-Z\d.~+-' -# Valid package names according to Debian Policy Manual 5.6.1: -# "Package names (both source and binary, see Package, Section 5.6.7) -# must consist only of lower case letters (a-z), digits (0-9), plus (+) -# and minus (-) signs, and periods (.). They must be at least two -# characters long and must start with an alphanumeric character." -packagename_re = re.compile("^[a-zA-Z0-9][a-zA-Z0-9\.\+\-~]+$") -packagename_msg = """Package names must be at least two characters long, start with an -alphanumeric and can only containg letters (a-z,A-Z), digits -(0-9), plus signs (+), minus signs (-), periods (.) and hyphens (~)""" - -# Valid upstream versions according to Debian Policy Manual 5.6.12: -# "The upstream_version may contain only alphanumerics[32] and the -# characters . + - : ~ (full stop, plus, hyphen, colon, tilde) and -# should start with a digit. If there is no debian_revision then hyphens -# are not allowed; if there is no epoch then colons are not allowed." -# Since we don't know about any epochs and debian revisions yet, the -# last two conditions are not checked. -upstreamversion_re = re.compile("^[0-9][a-z0-9\.\+\-\:\~]*$") -upstreamversion_msg = """Upstream version numbers must start with a digit and can only containg lower case -letters (a-z), digits (0-9), full stops (.), plus signs (+), minus signs -(-), colons (:) and tildes (~)""" - -# compression types, extra options and extensions -compressor_opts = { 'gzip' : [ '-n', 'gz' ], - 'bzip2' : [ '', 'bz2' ], - 'lzma' : [ '', 'lzma' ], - 'xz' : [ '', 'xz' ] } - -# Map frequently used names of compression types to the internal ones: -compressor_aliases = { 'bz2' : 'bzip2', - 'gz' : 'gzip', } + +class DebianPkgPolicy(PkgPolicy): + """Packaging policy for Debian""" + + # Valid package names according to Debian Policy Manual 5.6.1: + # "Package names (both source and binary, see Package, Section 5.6.7) + # must consist only of lower case letters (a-z), digits (0-9), plus (+) + # and minus (-) signs, and periods (.). They must be at least two + # characters long and must start with an alphanumeric character." + packagename_re = re.compile("^[a-zA-Z0-9][a-zA-Z0-9\.\+\-~]+$") + packagename_msg = """Package names must be at least two characters long, start with an + alphanumeric and can only containg letters (a-z,A-Z), digits + (0-9), plus signs (+), minus signs (-), periods (.) and hyphens (~)""" + + # Valid upstream versions according to Debian Policy Manual 5.6.12: + # "The upstream_version may contain only alphanumerics[32] and the + # characters . + - : ~ (full stop, plus, hyphen, colon, tilde) and + # should start with a digit. If there is no debian_revision then hyphens + # are not allowed; if there is no epoch then colons are not allowed." + # Since we don't know about any epochs and debian revisions yet, the + # last two conditions are not checked. + upstreamversion_re = re.compile("^[0-9][a-z0-9\.\+\-\:\~]*$") + upstreamversion_msg = """Upstream version numbers must start with a digit and can only containg lower case + letters (a-z), digits (0-9), full stops (.), plus signs (+), minus signs + (-), colons (:) and tildes (~)""" + class DpkgCompareVersions(gbpc.Command): cmd='/usr/bin/dpkg' @@ -447,68 +443,6 @@ def orig_file(cp, compression): compression) -def is_valid_packagename(name): - "Is this a valid Debian package name?" - return packagename_re.match(name) - -def is_valid_upstreamversion(version): - "Is this a valid upstream version number?" - return upstreamversion_re.match(version) - -def get_compression(orig_file): - """ - Given an orig file return the compression used - - >>> get_compression("abc.tar.gz") - 'gzip' - >>> get_compression("abc.tar.bz2") - 'bzip2' - >>> get_compression("abc.tar.foo") - >>> get_compression("abc") - """ - try: - ext = orig_file.rsplit('.',1)[1] - except IndexError: - return None - for (c, o) in compressor_opts.iteritems(): - if o[1] == ext: - return c - return None - - -def has_orig(orig_file, dir): - "Check if orig tarball exists in dir" - try: - os.stat( os.path.join(dir, orig_file) ) - except OSError: - return False - return True - -def symlink_orig(orig_file, orig_dir, output_dir, force=False): - """ - symlink orig tarball from orig_dir to output_dir - @return: True if link was created or src == dst - False in case of error or src doesn't exist - """ - orig_dir = os.path.abspath(orig_dir) - output_dir = os.path.abspath(output_dir) - - if orig_dir == output_dir: - return True - - src = os.path.join(orig_dir, orig_file) - dst = os.path.join(output_dir, orig_file) - if not os.access(src, os.F_OK): - return False - try: - if os.access(dst, os.F_OK) and force: - os.unlink(dst) - os.symlink(src, dst) - except OSError: - return False - return True - - def parse_uscan(out): """ Parse the uscan output return (True, tarball) if a new version was diff --git a/gbp/deb/pristinetar.py b/gbp/deb/pristinetar.py index abbe1360..2ac82efc 100644 --- a/gbp/deb/pristinetar.py +++ b/gbp/deb/pristinetar.py @@ -19,7 +19,8 @@ import os, re import gbp.log from gbp.command_wrappers import Command -from gbp.deb import UpstreamSource, compressor_opts +from gbp.pkg import compressor_opts +from gbp.deb import UpstreamSource class PristineTar(Command): """The pristine-tar branch in a git repository""" diff --git a/gbp/pkg/__init__.py b/gbp/pkg/__init__.py new file mode 100644 index 00000000..a3f02bc6 --- /dev/null +++ b/gbp/pkg/__init__.py @@ -0,0 +1,104 @@ +# vim: set fileencoding=utf-8 : +# +# (C) 2006,2007 Guido Guenther <agx@sigxcpu.org> +# (C) 2012 Intel Corporation <markus.lehtonen@linux.intel.com> +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +"""Common functionality of the Debian/RPM package helpers""" + +import os +import re +import glob + +import gbp.log +import gbp.command_wrappers as gbpc +from gbp.errors import GbpError +from gbp.command_wrappers import Command + +# compression types, extra options and extensions +compressor_opts = { 'gzip' : [ '-n', 'gz' ], + 'bzip2' : [ '', 'bz2' ], + 'lzma' : [ '', 'lzma' ], + 'xz' : [ '', 'xz' ] } + +# Map frequently used names of compression types to the internal ones: +compressor_aliases = { 'bz2' : 'bzip2', + 'gz' : 'gzip', } + +class PkgPolicy(object): + @classmethod + def is_valid_packagename(cls, name): + "Is this a valid package name?" + return cls.packagename_re.match(name) + + @classmethod + def is_valid_upstreamversion(cls, version): + "Is this a valid upstream version number?" + return cls.upstreamversion_re.match(version) + + @staticmethod + def get_compression(orig_file): + """ + Given an orig file return the compression used + + >>> PkgPolicy.get_compression("abc.tar.gz") + 'gzip' + >>> PkgPolicy.get_compression("abc.tar.bz2") + 'bzip2' + >>> PkgPolicy.get_compression("abc.tar.foo") + >>> PkgPolicy.get_compression("abc") + """ + try: + ext = orig_file.rsplit('.',1)[1] + except IndexError: + return None + for (c, o) in compressor_opts.iteritems(): + if o[1] == ext: + return c + return None + + @staticmethod + def has_orig(orig_file, dir): + "Check if orig tarball exists in dir" + try: + os.stat( os.path.join(dir, orig_file) ) + except OSError: + return False + return True + + @staticmethod + def symlink_orig(orig_file, orig_dir, output_dir, force=False): + """ + symlink orig tarball from orig_dir to output_dir + @return: True if link was created or src == dst + False in case of error or src doesn't exist + """ + orig_dir = os.path.abspath(orig_dir) + output_dir = os.path.abspath(output_dir) + + if orig_dir == output_dir: + return True + + src = os.path.join(orig_dir, orig_file) + dst = os.path.join(output_dir, orig_file) + if not os.access(src, os.F_OK): + return False + try: + if os.access(dst, os.F_OK) and force: + os.unlink(dst) + os.symlink(src, dst) + except OSError: + return False + return True + diff --git a/gbp/scripts/buildpackage.py b/gbp/scripts/buildpackage.py index 7e3ea1ec..e1e10974 100755 --- a/gbp/scripts/buildpackage.py +++ b/gbp/scripts/buildpackage.py @@ -38,11 +38,12 @@ from gbp.scripts.common.buildpackage import (index_name, wc_name, git_archive_submodules, git_archive_single, dump_tree, write_wc, drop_index) +from gbp.pkg import (compressor_opts, compressor_aliases) def git_archive(repo, cp, output_dir, treeish, comp_type, comp_level, with_submodules): "create a compressed orig tarball in output_dir using git_archive" try: - comp_opts = du.compressor_opts[comp_type][0] + comp_opts = compressor_opts[comp_type][0] except KeyError: raise GbpError, "Unsupported compression type '%s'" % comp_type @@ -86,12 +87,12 @@ def prepare_upstream_tarball(repo, cp, options, tarball_dir, output_dir): # look in tarball_dir first, if found force a symlink to it if options.tarball_dir: gbp.log.debug("Looking for orig tarball '%s' at '%s'" % (orig_file, tarball_dir)) - if not du.symlink_orig(orig_file, tarball_dir, output_dir, force=True): + if not du.DebianPkgPolicy.symlink_orig(orig_file, tarball_dir, output_dir, force=True): gbp.log.info("Orig tarball '%s' not found at '%s'" % (orig_file, tarball_dir)) else: gbp.log.info("Orig tarball '%s' found at '%s'" % (orig_file, tarball_dir)) # build an orig unless the user forbids it, always build (and overwrite pre-existing) if user forces it - if options.force_create or (not options.no_create_orig and not du.has_orig(orig_file, output_dir)): + if options.force_create or (not options.no_create_orig and not du.DebianPkgPolicy.has_orig(orig_file, output_dir)): if not pristine_tar_build_orig(repo, cp, output_dir, options): upstream_tree = git_archive_build_orig(repo, cp, output_dir, options) if options.pristine_tar_commit: @@ -290,9 +291,9 @@ def guess_comp_type(repo, comp_type, cp, tarball_dir): upstream_version = cp['Upstream-Version'] if comp_type != 'auto': - comp_type = du.compressor_aliases.get(comp_type, comp_type) + comp_type = compressor_aliases.get(comp_type, comp_type) try: - dummy = du.compressor_opts[comp_type] + dummy = compressor_opts[comp_type] except KeyError: gbp.log.warn("Unknown compression type - guessing.") comp_type = 'auto' @@ -302,8 +303,8 @@ def guess_comp_type(repo, comp_type, cp, tarball_dir): if not tarball_dir: tarball_dir = '..' detected = None - for comp in du.compressor_opts.keys(): - if du.has_orig(du.orig_file(cp, comp), tarball_dir): + for comp in compressor_opts.keys(): + if du.DebianPkgPolicy.has_orig(du.orig_file(cp, comp), tarball_dir): if detected is not None: raise GbpError, "Multiple orig tarballs found." detected = comp @@ -320,7 +321,7 @@ def guess_comp_type(repo, comp_type, cp, tarball_dir): else: commit = repo.pristine_tar_branch tarball = repo.get_subject(commit) - comp_type = du.get_compression(tarball) + comp_type = du.DebianPkgPolicy.get_compression(tarball) gbp.log.debug("Determined compression type '%s'" % comp_type) if not comp_type: comp_type = 'gzip' diff --git a/gbp/scripts/import_orig.py b/gbp/scripts/import_orig.py index 8559a255..4ba9bf8a 100644 --- a/gbp/scripts/import_orig.py +++ b/gbp/scripts/import_orig.py @@ -23,9 +23,7 @@ import sys import re import tempfile import gbp.command_wrappers as gbpc -from gbp.deb import (do_uscan, parse_changelog_repo, - is_valid_packagename, packagename_msg, - is_valid_upstreamversion, upstreamversion_msg) +from gbp.deb import (DebianPkgPolicy, do_uscan, parse_changelog_repo) from gbp.deb.changelog import ChangeLog, NoChangeLogError from gbp.deb.git import (GitRepositoryError, DebianGitRepository) from gbp.config import GbpOptionParserDebian, GbpOptionGroup, no_upstream_branch_msg @@ -101,8 +99,8 @@ def detect_name_and_version(repo, source, options): except NoChangeLogError: if options.interactive: sourcepackage = ask_package_name(guessed_package, - is_valid_packagename, - packagename_msg) + DebianPkgPolicy.is_valid_packagename, + DebianPkgPolicy.packagename_msg) else: if guessed_package: sourcepackage = guessed_package @@ -115,8 +113,8 @@ def detect_name_and_version(repo, source, options): else: if options.interactive: version = ask_package_version(guessed_version, - is_valid_upstreamversion, - upstreamversion_msg) + DebianPkgPolicy.is_valid_upstreamversion, + DebianPkgPolicy.upstreamversion_msg) else: if guessed_version: version = guessed_version |