X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fpackagelist.py;h=4a671839e11733b6085c298a2651c1d99d09174b;hb=be8648509d039e6737fa601c61884747c6ee094e;hp=82653a0b2978125df6d2457ded6d7e4aa0d3ae88;hpb=f55f512e0582645f6af01d6ae1914a043ecae139;p=dak.git diff --git a/daklib/packagelist.py b/daklib/packagelist.py index 82653a0b..4a671839 100644 --- a/daklib/packagelist.py +++ b/daklib/packagelist.py @@ -27,17 +27,20 @@ class InvalidSource(Exception): class PackageListEntry(object): def __init__(self, name, package_type, section, component, priority, **other): self.name = name - self.package_type = package_type + self.type = package_type self.section = section self.component = component self.priority = priority self.other = other - @property - def architectures(self): + + self.architectures = self._architectures() + + def _architectures(self): archs = self.other.get("arch", None) if archs is None: return None return archs.split(',') + def built_on_architecture(self, architecture): archs = self.architectures if archs is None: @@ -46,9 +49,12 @@ class PackageListEntry(object): if match_architecture(architecture, arch): return True return False + def built_in_suite(self, suite): built = False for arch in suite.architectures: + if arch.arch_string == 'source': + continue built_on_arch = self.built_on_architecture(arch.arch_string) if built_on_arch: return True @@ -58,17 +64,25 @@ class PackageListEntry(object): class PackageList(object): def __init__(self, source): - self._source = source - if 'Package-List' in self._source: - self._parse() - elif 'Binary' in self._source: - self._parse_fallback() + if 'Package-List' in source: + self._parse(source) + elif 'Binary' in source: + self._parse_fallback(source) else: raise InvalidSource('Source package has neither Package-List nor Binary field.') - def _parse(self): - self.package_list = {} - for line in self._source['Package-List'].split("\n"): + self.fallback = any(entry.architectures is None for entry in self.package_list) + + def _binaries(self, source): + return set(name.strip() for name in source['Binary'].split(",")) + + def _parse(self, source): + self.package_list = [] + + binaries_binary = self._binaries(source) + binaries_package_list = set() + + for line in source['Package-List'].split("\n"): if not line: continue fields = line.split() @@ -78,17 +92,26 @@ class PackageList(object): # [arch=[,]...] name = fields[0] package_type = fields[1] - component, section = extract_component_from_section(fields[2]) + section, component = extract_component_from_section(fields[2]) priority = fields[3] other = dict(kv.split('=', 1) for kv in fields[4:]) + if name in binaries_package_list: + raise InvalidSource("Package-List has two entries for '{0}'.".format(name)) + if name not in binaries_binary: + raise InvalidSource("Package-List lists {0} which is not listed in Binary.".format(name)) + binaries_package_list.add(name) + entry = PackageListEntry(name, package_type, section, component, priority, **other) - self.package_list[name] = entry + self.package_list.append(entry) + + if len(binaries_binary) != len(binaries_package_list): + raise InvalidSource("Package-List and Binaries fields have a different number of entries.") - def _parse_fallback(self): - self.package_list = {} + def _parse_fallback(self, source): + self.package_list = [] - for binary in self._source['Binary'].split(): + for binary in self._binaries(source): name = binary package_type = None component = None @@ -97,11 +120,11 @@ class PackageList(object): other = dict() entry = PackageListEntry(name, package_type, section, component, priority, **other) - self.package_list[name] = entry + self.package_list.append(entry) def packages_for_suite(self, suite): packages = [] - for entry in self.package_list.values(): + for entry in self.package_list: built = entry.built_in_suite(suite) if built or built is None: packages.append(entry) @@ -109,7 +132,7 @@ class PackageList(object): def has_arch_indep_packages(self): has_arch_indep = False - for entry in self.package_list.values(): + for entry in self.package_list: built = entry.built_on_architecture('all') if built: return True @@ -119,7 +142,7 @@ class PackageList(object): def has_arch_dep_packages(self): has_arch_dep = False - for entry in self.package_list.values(): + for entry in self.package_list: built_on_all = entry.built_on_architecture('all') if built_on_all == False: return True