예제 #1
0
    def __init__(self, options, impl='cpython3'):
        self.options = options
        self.packages = {}
        self.python_version = None
        source_section = True
        binary_package = None
        # Note that each DebHelper instance supports ONE interpreter type only
        # it's not possible to mix cpython2, cpython3 and pypy here
        self.impl = impl
        skip_tpl = set()
        for name, tpls in PKG_NAME_TPLS.items():
            if name != impl:
                skip_tpl.update(tpls)
        skip_tpl = tuple(skip_tpl)

        pkgs = options.package
        skip_pkgs = options.no_package

        try:
            fp = open('debian/control', 'r', encoding='utf-8')
        except IOError:
            raise Exception('cannot find debian/control file')

        for line in fp:
            if not line.strip():
                source_section = False
                binary_package = None
                continue
            line_l = line.lower()  # field names are case-insensitive
            if binary_package:
                if binary_package not in self.packages:
                    continue
                if line_l.startswith('architecture:'):
                    arch = line[13:].strip()
                    # TODO: if arch doesn't match current architecture:
                    #del self.packages[binary_package]
                    self.packages[binary_package]['arch'] = arch
                    continue
            elif line_l.startswith('package:'):
                binary_package = line[8:].strip()
                if skip_tpl and binary_package.startswith(skip_tpl):
                    log.debug('skipping package: %s', binary_package)
                    continue
                if pkgs and binary_package not in pkgs:
                    continue
                if skip_pkgs and binary_package in skip_pkgs:
                    continue
                self.packages[binary_package] = {
                    'substvars': {},
                    'autoscripts': {},
                    'rtupdates': [],
                    'arch': 'any'
                }
            elif line_l.startswith('source:'):
                self.source_name = line[7:].strip()
            elif source_section and self.impl == 'cpython3' and line_l.startswith(
                    'x-python3-version:'):
                self.python_version = line[18:]
                if len(self.python_version.split(',')) > 2:
                    raise ValueError(
                        'too many arguments provided for X-Python3-Version: min and max only.'
                    )
            elif source_section and self.impl == 'cpython2':
                if line_l.startswith('xs-python-version:'):
                    if not self.python_version:
                        self.python_version = line[18:].strip()
                if line_l.startswith('x-python-version:'):
                    self.python_version = line[17:].strip()

        fp.close()
        log.debug('source=%s, binary packages=%s', self.source_name,
                  list(self.packages.keys()))
예제 #2
0
    def __init__(self, options, impl='cpython3'):
        self.options = options
        self.packages = {}
        self.build_depends = {}
        self.python_version = None
        source_section = True
        binary_package = None
        build_depends_line = ''
        inside_bdepends_field = False
        # Note that each DebHelper instance supports ONE interpreter type only
        # it's not possible to mix cpython2, cpython3 and pypy here
        self.impl = impl
        skip_tpl = set()
        for name, tpls in PKG_NAME_TPLS.items():
            if name != impl:
                skip_tpl.update(tpls)
        skip_tpl = tuple(skip_tpl)
        substvar = DEPENDS_SUBSTVARS[impl]

        pkgs = options.package
        skip_pkgs = options.no_package

        try:
            fp = open('debian/control', 'r', encoding='utf-8')
        except IOError:
            raise Exception('cannot find debian/control file')

        for line in fp:
            if line.startswith('#'):
                continue
            if not line.strip():
                source_section = False
                binary_package = None
                inside_depends_field = False
                continue
            line_l = line.lower()  # field names are case-insensitive
            if binary_package:
                if binary_package not in self.packages:
                    continue
                if line_l.startswith('architecture:'):
                    arch = line[13:].strip()
                    if options.arch is False and arch != 'all' or\
                       options.arch is True and arch == 'all':
                        # TODO: check also if arch matches current architecture:
                        del self.packages[binary_package]
                    else:
                        self.packages[binary_package]['arch'] = arch
                    continue
                if not binary_package.startswith(PKG_NAME_TPLS[impl]):
                    # package doesn't have common prefix (python-, python3-, pypy-)
                    # so lets check if Depends contains appropriate substvar
                    if line_l.startswith('depends:'):
                        if substvar in line:
                            continue
                        inside_depends_field = True
                    elif inside_depends_field:  # multiline continuation
                        if not line.startswith((' ', '\t')):
                            inside_depends_field = False
                            log.debug(
                                'skipping package %s (missing %s in Depends)',
                                binary_package, substvar)
                            del self.packages[binary_package]
                        elif substvar in line:
                            inside_depends_field = None
            elif line_l.startswith('package:'):
                binary_package = line[8:].strip()
                if skip_tpl and binary_package.startswith(skip_tpl):
                    log.debug('skipping package: %s', binary_package)
                    continue
                if pkgs and binary_package not in pkgs:
                    continue
                if skip_pkgs and binary_package in skip_pkgs:
                    continue
                self.packages[binary_package] = {
                    'substvars': {},
                    'autoscripts': {},
                    'rtupdates': [],
                    'arch': 'any'
                }
            elif line_l.startswith('source:'):
                self.source_name = line[7:].strip()
            elif source_section and self.impl == 'cpython3' and line_l.startswith(
                    'x-python3-version:'):
                self.python_version = line[18:]
                if len(self.python_version.split(',')) > 2:
                    raise ValueError(
                        'too many arguments provided for X-Python3-Version: min and max only.'
                    )
            elif source_section and self.impl == 'cpython2':
                if line_l.startswith('xs-python-version:'):
                    if not self.python_version:
                        self.python_version = line[18:].strip()
                if line_l.startswith('x-python-version:'):
                    self.python_version = line[17:].strip()
            elif source_section and line_l.startswith(
                ('build-depends:', 'build-depends-indep:')):
                inside_bdepends_field = True
                build_depends_line += ',' + line.split(':',
                                                       1)[1].strip(', \t\n')
            elif inside_bdepends_field:  # multiline continuation
                if not line.startswith((' ', '\t', '#')):
                    inside_bdepends_field = False
                elif not line.strip().startswith('#'):
                    build_depends_line += ',' + line.strip(', \t\n')

        for dep1 in build_depends_line.strip(', \t').split(','):
            for dep2 in dep1.split('|'):
                details = parse_dep(dep2)
                if details:
                    details = details.groupdict()
                    if details['arch']:
                        architectures = details['arch'].split()
                    else:
                        architectures = [None]
                    for arch in architectures:
                        self.build_depends.setdefault(
                            details['name'], {})[arch] = details['version']

        fp.close()
        log.debug('source=%s, binary packages=%s', self.source_name,
                  list(self.packages.keys()))
예제 #3
0
    def __init__(self, options, impl='cpython3'):
        self.options = options
        self.packages = {}
        self.python_version = None
        source_section = True
        binary_package = None
        # Note that each DebHelper instance supports ONE interpreter type only
        # it's not possible to mix cpython2, cpython3 and pypy here
        self.impl = impl
        skip_tpl = set()
        for name, tpls in PKG_NAME_TPLS.items():
            if name != impl:
                skip_tpl.update(tpls)
        skip_tpl = tuple(skip_tpl)

        pkgs = options.package
        skip_pkgs = options.no_package

        try:
            fp = open('debian/control', 'r', encoding='utf-8')
        except IOError:
            raise Exception('cannot find debian/control file')

        for line in fp:
            if not line.strip():
                source_section = False
                binary_package = None
                continue
            line_l = line.lower()  # field names are case-insensitive
            if binary_package:
                if binary_package not in self.packages:
                    continue
                if line_l.startswith('architecture:'):
                    arch = line[13:].strip()
                    # TODO: if arch doesn't match current architecture:
                    #del self.packages[binary_package]
                    self.packages[binary_package]['arch'] = arch
                    continue
            elif line_l.startswith('package:'):
                binary_package = line[8:].strip()
                if skip_tpl and binary_package.startswith(skip_tpl):
                    log.debug('skipping package: %s', binary_package)
                    continue
                if pkgs and binary_package not in pkgs:
                    continue
                if skip_pkgs and binary_package in skip_pkgs:
                    continue
                self.packages[binary_package] = {'substvars': {},
                                                 'autoscripts': {},
                                                 'rtupdates': [],
                                                 'arch': 'any'}
            elif line_l.startswith('source:'):
                self.source_name = line[7:].strip()
            elif source_section and self.impl == 'cpython3' and line_l.startswith('x-python3-version:'):
                self.python_version = line[18:]
                if len(self.python_version.split(',')) > 2:
                    raise ValueError('too many arguments provided for X-Python3-Version: min and max only.')
            elif source_section and self.impl == 'cpython2':
                if line_l.startswith('xs-python-version:'):
                    if not self.python_version:
                        self.python_version = line[18:].strip()
                if line_l.startswith('x-python-version:'):
                    self.python_version = line[17:].strip()

        fp.close()
        log.debug('source=%s, binary packages=%s', self.source_name,
                  list(self.packages.keys()))
예제 #4
0
    def __init__(self, options, impl='cpython3'):
        self.options = options
        self.packages = {}
        self.build_depends = {}
        self.python_version = None
        source_section = True
        binary_package = None
        build_depends_line = ''
        inside_bdepends_field = False
        # Note that each DebHelper instance supports ONE interpreter type only
        # it's not possible to mix cpython2, cpython3 and pypy here
        self.impl = impl
        skip_tpl = set()
        for name, tpls in PKG_NAME_TPLS.items():
            if name != impl:
                skip_tpl.update(tpls)
        skip_tpl = tuple(skip_tpl)
        substvar = DEPENDS_SUBSTVARS[impl]

        pkgs = options.package
        skip_pkgs = options.no_package

        try:
            fp = open('debian/control', 'r', encoding='utf-8')
        except IOError:
            raise Exception('cannot find debian/control file')

        for line in fp:
            if line.startswith('#'):
                continue
            if not line.strip():
                source_section = False
                binary_package = None
                inside_depends_field = False
                continue
            line_l = line.lower()  # field names are case-insensitive
            if binary_package:
                if binary_package not in self.packages:
                    continue
                if line_l.startswith('architecture:'):
                    arch = line[13:].strip()
                    if options.arch is False and arch != 'all' or\
                       options.arch is True and arch == 'all':
                        # TODO: check also if arch matches current architecture:
                        del self.packages[binary_package]
                    else:
                        self.packages[binary_package]['arch'] = arch
                    continue
                if not binary_package.startswith(PKG_NAME_TPLS[impl]):
                    # package doesn't have common prefix (python-, python3-, pypy-)
                    # so lets check if Depends contains appropriate substvar
                    if line_l.startswith('depends:'):
                        if substvar in line:
                            continue
                        inside_depends_field = True
                    elif inside_depends_field:  # multiline continuation
                        if not line.startswith((' ', '\t')):
                            inside_depends_field = False
                            log.debug('skipping package %s (missing %s in Depends)',
                                      binary_package, substvar)
                            del self.packages[binary_package]
                        elif substvar in line:
                            inside_depends_field = None
            elif line_l.startswith('package:'):
                binary_package = line[8:].strip()
                if skip_tpl and binary_package.startswith(skip_tpl):
                    log.debug('skipping package: %s', binary_package)
                    continue
                if pkgs and binary_package not in pkgs:
                    continue
                if skip_pkgs and binary_package in skip_pkgs:
                    continue
                self.packages[binary_package] = {'substvars': {},
                                                 'autoscripts': {},
                                                 'rtupdates': [],
                                                 'arch': 'any'}
            elif line_l.startswith('source:'):
                self.source_name = line[7:].strip()
            elif source_section and self.impl == 'cpython3' and line_l.startswith('x-python3-version:'):
                self.python_version = line[18:]
                if len(self.python_version.split(',')) > 2:
                    raise ValueError('too many arguments provided for X-Python3-Version: min and max only.')
            elif source_section and self.impl == 'cpython2':
                if line_l.startswith('xs-python-version:'):
                    if not self.python_version:
                        self.python_version = line[18:].strip()
                if line_l.startswith('x-python-version:'):
                    self.python_version = line[17:].strip()
            elif source_section and line_l.startswith(('build-depends:', 'build-depends-indep:')):
                inside_bdepends_field = True
                build_depends_line += ',' + line.split(':', 1)[1].strip(', \t\n')
            elif inside_bdepends_field:  # multiline continuation
                if not line.startswith((' ', '\t', '#')):
                    inside_bdepends_field = False
                elif not line.strip().startswith('#'):
                    build_depends_line += ',' + line.strip(', \t\n')

        for dep1 in build_depends_line.strip(', \t').split(','):
            for dep2 in dep1.split('|'):
                details = parse_dep(dep2)
                if details:
                    details = details.groupdict()
                    if details['arch']:
                        architectures = details['arch'].split()
                    else:
                        architectures = [None]
                    for arch in architectures:
                        self.build_depends.setdefault(details['name'],
                                                      {})[arch] = details['version']

        fp.close()
        log.debug('source=%s, binary packages=%s', self.source_name,
                  list(self.packages.keys()))