import daklib.daksubprocess
from dbconn import DBConn, get_architecture, get_component, get_suite, \
get_override_type, Keyring, session_wrapper, \
- get_active_keyring_paths, get_primary_keyring_path, \
+ get_active_keyring_paths, \
get_suite_architectures, get_or_set_metadatakey, DBSource, \
Component, Override, OverrideType
from sqlalchemy import desc
from regexes import re_html_escaping, html_escaping, re_single_line_field, \
re_multi_line_field, re_srchasver, re_taint_free, \
re_re_mark, re_whitespace_comment, re_issource, \
- re_is_orig_source, re_build_dep_arch, re_parse_maintainer
+ re_build_dep_arch, re_parse_maintainer
from formats import parse_format, validate_changes_format
from srcformats import get_format_from_string
alias_cache = None #: Cache for email alias checks
key_uid_email_cache = {} #: Cache for email addresses from gpg key uids
-# (hashname, function, earliest_changes_version)
-known_hashes = [("sha1", apt_pkg.sha1sum, (1, 8)),
- ("sha256", apt_pkg.sha256sum, (1, 8))] #: hashes we accept for entries in .changes/.dsc
-
# Monkeypatch commands.getstatusoutput as it may not return the correct exit
# code in lenny's Python. This also affects commands.getoutput and
# commands.getstatus.
missingfields.append(keyword)
if len(missingfields):
- raise ParseChangesError("Missing mandantory field(s) in changes file (policy 5.5): %s" % (missingfields))
+ raise ParseChangesError("Missing mandatory field(s) in changes file (policy 5.5): %s" % (missingfields))
return changes
has = defaultdict(lambda: 0)
ftype_lookup = (
- (r'orig.tar.gz', ('orig_tar_gz', 'orig_tar')),
- (r'diff.gz', ('debian_diff',)),
- (r'tar.gz', ('native_tar_gz', 'native_tar')),
+ (r'orig\.tar\.(gz|bz2|xz)\.asc', ('orig_tar_sig',)),
+ (r'orig\.tar\.gz', ('orig_tar_gz', 'orig_tar')),
+ (r'diff\.gz', ('debian_diff',)),
+ (r'tar\.gz', ('native_tar_gz', 'native_tar')),
(r'debian\.tar\.(gz|bz2|xz)', ('debian_tar',)),
(r'orig\.tar\.(gz|bz2|xz)', ('orig_tar',)),
(r'tar\.(gz|bz2|xz)', ('native_tar',)),
+ (r'orig-.+\.tar\.(gz|bz2|xz)\.asc', ('more_orig_tar_sig',)),
(r'orig-.+\.tar\.(gz|bz2|xz)', ('more_orig_tar',)),
)
# File does not match anything in lookup table; reject
if not matched:
- reject("%s: unexpected source file '%s'" % (dsc_filename, f))
+ rejmsg.append("%s: unexpected source file '%s'" % (dsc_filename, f))
+ break
# Check for multiple files
- for file_type in ('orig_tar', 'native_tar', 'debian_tar', 'debian_diff'):
+ for file_type in ('orig_tar', 'orig_tar_sig', 'native_tar', 'debian_tar', 'debian_diff'):
if has[file_type] > 1:
rejmsg.append("%s: lists multiple %s" % (dsc_filename, file_type))
################################################################################
-def check_reverse_depends(removals, suite, arches=None, session=None, cruft=False, quiet=False):
+def check_reverse_depends(removals, suite, arches=None, session=None, cruft=False, quiet=False, include_arch_all=True):
dbsuite = get_suite(suite, session)
overridesuite = dbsuite
if dbsuite.overridesuite is not None:
'metakey_d_id': metakey_d.key_id,
'metakey_p_id': metakey_p.key_id,
}
- for architecture in all_arches | set(['all']):
+ if include_arch_all:
+ rdep_architectures = all_arches | set(['all'])
+ else:
+ rdep_architectures = all_arches
+ for architecture in rdep_architectures:
deps = {}
sources = {}
virtual_packages = {}
all_broken = defaultdict(set)
metakey_bd = get_or_set_metadatakey("Build-Depends", session)
metakey_bdi = get_or_set_metadatakey("Build-Depends-Indep", session)
+ if include_arch_all:
+ metakey_ids = (metakey_bd.key_id, metakey_bdi.key_id)
+ else:
+ metakey_ids = (metakey_bd.key_id,)
+
params = {
'suite_id': dbsuite.suite_id,
- 'metakey_ids': (metakey_bd.key_id, metakey_bdi.key_id),
+ 'metakey_ids': metakey_ids,
}
statement = '''
SELECT s.source, string_agg(sm.value, ', ') as build_dep
FROM source s
JOIN source_metadata sm ON s.id = sm.src_id
WHERE s.id in
- (SELECT source FROM src_associations
+ (SELECT src FROM newest_src_association
WHERE suite = :suite_id)
AND sm.key_id in :metakey_ids
GROUP BY s.id, s.source'''
print
return dep_problem
+
+################################################################################
+
+def parse_built_using(control):
+ """source packages referenced via Built-Using
+
+ @type control: dict-like
+ @param control: control file to take Built-Using field from
+
+ @rtype: list of (str, str)
+ @return: list of (source_name, source_version) pairs
+ """
+ built_using = control.get('Built-Using', None)
+ if built_using is None:
+ return []
+
+ bu = []
+ for dep in apt_pkg.parse_depends(built_using):
+ assert len(dep) == 1, 'Alternatives are not allowed in Built-Using field'
+ source_name, source_version, comp = dep[0]
+ assert comp == '=', 'Built-Using must contain strict dependencies'
+ bu.append((source_name, source_version))
+
+ return bu
+
+################################################################################
+
+def is_in_debug_section(control):
+ """binary package is a debug package
+
+ @type control: dict-like
+ @param control: control file of binary package
+
+ @rtype Boolean
+ @return: True if the binary package is a debug package
+ """
+ section = control['Section'].split('/', 1)[-1]
+ auto_built_package = control.get("Auto-Built-Package")
+ return section == "debug" and auto_built_package == "debug-symbols"