X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=jenna;h=99de03b29e1771e0a2a580b6260e8606b53941d9;hb=9540d873fa78598454af57f5f8a4875969ed0439;hp=e1666b9c7f992ab7f52f8bca249b58dbe03adb15;hpb=cd4af5e0861a437353d10058c3cb099e3befb369;p=dak.git diff --git a/jenna b/jenna index e1666b9c..99de03b2 100755 --- a/jenna +++ b/jenna @@ -1,8 +1,8 @@ #!/usr/bin/env python # Generate file lists used by apt-ftparchive to generate Packages and Sources files -# Copyright (C) 2000, 2001, 2002 James Troup -# $Id: jenna,v 1.19 2002-06-05 16:53:05 troup Exp $ +# Copyright (C) 2000, 2001, 2002, 2003, 2004 James Troup +# $Id: jenna,v 1.29 2004-11-27 17:58:47 troup Exp $ # 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 @@ -61,69 +61,12 @@ Write out file lists suitable for use with apt-ftparchive. -n, --no-delete don't delete older versions -s, --suite=SUITE only write file lists for this suite -ARCH, COMPONENT and SUITE can be space seperated lists, e.g. +ARCH, COMPONENT and SUITE can be space separated lists, e.g. --architecture=\"m68k i386\""""; sys.exit(exit_code); ################################################################################ -# Handle -a, -c and -s arguments; returns them as SQL constraints -def parse_args(): - if Options["Suite"]: - suite_ids_list = []; - for suite in string.split(Options["Suite"]): - suite_id = db_access.get_suite_id(suite); - if suite_id == -1: - utils.warn("suite '%s' not recognised." % (suite)); - else: - suite_ids_list.append(suite_id); - if suite_ids_list: - con_suites = "AND su.id IN (%s)" % string.join(map(str, suite_ids_list), ", "); - else: - utils.fubar("No valid suite given."); - else: - con_suites = ""; - - if Options["Architecture"]: - arch_ids_list = []; - check_source = 0; - for architecture in string.split(Options["Architecture"]): - if architecture == "source": - check_source = 1; - else: - architecture_id = db_access.get_architecture_id(architecture); - if architecture_id == -1: - utils.warn("architecture '%s' not recognised." % (architecture)); - else: - arch_ids_list.append(architecture_id); - if arch_ids_list: - con_architectures = "AND a.id IN (%s)" % string.join(map(str, arch_ids_list), ", "); - else: - if not check_source: - utils.fubar("No valid architecture given."); - else: - con_architectures = ""; - check_source = 1; - - if Options["Component"]: - component_ids_list = []; - for component in string.split(Options["Component"]): - component_id = db_access.get_component_id(component); - if component_id == -1: - utils.warn("component '%s' not recognised." % (component)); - else: - component_ids_list.append(component_id); - if component_ids_list: - con_components = "AND su.id IN (%s)" % string.join(map(str, component_ids_list), ", "); - else: - utils.fubar("No valid component given."); - else: - con_components = ""; - - return (con_suites, con_architectures, con_components, check_source); - -################################################################################ - def version_cmp(a, b): return -apt_pkg.VersionCompare(a[0], b[0]); @@ -162,7 +105,7 @@ def resolve_arch_all_vs_any(versions, packages): unique_id = i[1]; arch = packages[unique_id]["arch"]; if arch == "all": - arch_all_versions = i; + arch_all_versions = [i]; arch_all_version = i[0]; arch_any_versions.remove(i); # Sort arch: any versions into descending order @@ -174,7 +117,7 @@ def resolve_arch_all_vs_any(versions, packages): delete_table = "bin_associations"; delete_col = "bin"; - if apt_pkg.VersionCompare(highest_arch_any_version, arch_all_version) != 1: + if apt_pkg.VersionCompare(highest_arch_any_version, arch_all_version) < 1: # arch: all dominates delete_packages(arch_any_versions, pkg, "all", suite, arch_all_version, delete_table, delete_col, packages); @@ -205,7 +148,7 @@ def remove_duplicate_versions(versions, packages): # Remove all but the highest delete_packages(dominated_versions, pkg, arch, suite, dominant_version, delete_table, delete_col, packages); - return dominant_versions; + return [dominant_versions]; ################################################################################ @@ -217,12 +160,9 @@ def cleanup(packages): pkg = packages[unique_id]["pkg"]; arch = packages[unique_id]["arch"]; version = packages[unique_id]["version"]; - if not d.has_key(suite): - d[suite] = {}; - if not d[suite].has_key(pkg): - d[suite][pkg] = {}; - if not d[suite][pkg].has_key(arch): - d[suite][pkg][arch] = []; + d.setdefault(suite, {}); + d[suite].setdefault(pkg, {}); + d[suite][pkg].setdefault(arch, []); d[suite][pkg][arch].append([version, unique_id]); # Clean up old versions for suite in d.keys(): @@ -242,14 +182,14 @@ def cleanup(packages): # Check to see if we have arch: all and arch: !all (ignoring source) num_arches = len(arches.keys()); if arches.has_key("source"): - num_arches = num_arches - 1; + num_arches -= 1; # If we do, remove the duplicates if num_arches > 1: versions = []; for arch in arches.keys(): if arch != "source": versions.extend(d[suite][pkg][arch]); - remove_duplicate_versions(versions, packages); + resolve_arch_all_vs_any(versions, packages); ################################################################################ @@ -323,34 +263,26 @@ def write_filelists(packages, dislocated_files): component = packages[unique_id]["component"]; arch = packages[unique_id]["arch"]; type = packages[unique_id]["type"]; - if not d.has_key(suite): - d[suite] = {}; - if not d[suite].has_key(component): - d[suite][component] = {}; - if not d[suite][component].has_key(arch): - d[suite][component][arch] = {}; - if not d[suite][component].has_key(arch): - d[suite][component][arch] = {}; - if not d[suite][component][arch].has_key(type): - d[suite][component][arch][type] = []; + d.setdefault(suite, {}); + d[suite].setdefault(component, {}); + d[suite][component].setdefault(arch, {}); + d[suite][component][arch].setdefault(type, []); d[suite][component][arch][type].append(unique_id); # Flesh out the index if not Options["Suite"]: suites = Cnf.SubTree("Suite").List(); else: - suites = string.split(Options["Suite"]); + suites = utils.split_args(Options["Suite"]); for suite in map(string.lower, suites): - if not d.has_key(suite): - d[suite] = {}; + d.setdefault(suite, {}); if not Options["Component"]: components = Cnf.ValueList("Suite::%s::Components" % (suite)); else: - components = string.split(Options["Components"]); + components = utils.split_args(Options["Component"]); udeb_components = Cnf.ValueList("Suite::%s::UdebComponents" % (suite)); udeb_components = udeb_components; for component in components: - if not d[suite].has_key(component): - d[suite][component] = {}; + d[suite].setdefault(component, {}); if component in udeb_components: binary_types = [ "deb", "udeb" ]; else: @@ -358,17 +290,15 @@ def write_filelists(packages, dislocated_files): if not Options["Architecture"]: architectures = Cnf.ValueList("Suite::%s::Architectures" % (suite)); else: - architectures = string.split(Options["Architectures"]); + architectures = utils.split_args(Options["Architectures"]); for arch in map(string.lower, architectures): - if not d[suite][component].has_key(arch): - d[suite][component][arch] = {}; + d[suite][component].setdefault(arch, {}); if arch == "source": types = [ "dsc" ]; else: types = binary_types; for type in types: - if not d[suite][component][arch].has_key(type): - d[suite][component][arch][type] = []; + d[suite][component][arch].setdefault(type, []); # Then walk it for suite in d.keys(): if Cnf.has_key("Suite::%s::Components" % (suite)): @@ -379,9 +309,13 @@ def write_filelists(packages, dislocated_files): for type in d[suite][component][arch].keys(): list = d[suite][component][arch][type]; # If it's a binary, we need to add in the arch: all debs too - if arch != "source" and d[suite][component].has_key("all") \ - and d[suite][component]["all"].has_key(type): - list.extend(d[suite][component]["all"][type]); + if arch != "source": + archall_suite = Cnf.get("Jenna::ArchAllMap::%s" % (suite)); + if archall_suite: + list.extend(d[archall_suite][component]["all"][type]); + elif d[suite][component].has_key("all") and \ + d[suite][component]["all"].has_key(type): + list.extend(d[suite][component]["all"][type]); write_filelist(suite, component, arch, type, list, packages, dislocated_files); else: # legacy-mixed suite @@ -406,13 +340,29 @@ def stable_dislocation_p(): if not Options["Suite"]: return 1; # Otherwise, look in what suites the user specified - suites = string.split(Options["Suite"]); - return suites.count("stable"); + suites = utils.split_args(Options["Suite"]); + + if "stable" in suites: + return 1; + else: + return 0; ################################################################################ def do_da_do_da(): - (con_suites, con_architectures, con_components, check_source) = parse_args(); + # If we're only doing a subset of suites, ensure we do enough to + # be able to do arch: all mapping. + if Options["Suite"]: + suites = utils.split_args(Options["Suite"]); + for suite in suites: + archall_suite = Cnf.get("Jenna::ArchAllMap::%s" % (suite)); + if archall_suite and archall_suite not in suites: + utils.warn("Adding %s as %s maps Arch: all from it." % (archall_suite, suite)); + suites.append(archall_suite); + Options["Suite"] = ",".join(suites); + + (con_suites, con_architectures, con_components, check_source) = \ + utils.parse_args(Options); if stable_dislocation_p(): dislocated_files = claire.find_dislocated_stable(Cnf, projectB); @@ -428,7 +378,7 @@ SELECT b.id, b.package, a.arch_string, b.version, l.path, f.filename, c.name, AND f.location = l.id AND l.component = c.id AND ba.suite = su.id %s %s %s""" % (con_suites, con_architectures, con_components); if check_source: - query = query + """ + query += """ UNION SELECT s.id, s.source, 'source', s.version, l.path, f.filename, c.name, f.id, su.suite_name, 'dsc' @@ -443,7 +393,7 @@ SELECT s.id, s.source, 'source', s.version, l.path, f.filename, c.name, f.id, for i in ql: (id, pkg, arch, version, path, filename, component, file_id, suite, type) = i; # 'id' comes from either 'binaries' or 'source', so it's not unique - unique_id = unique_id + 1; + unique_id += 1; packages[unique_id] = Dict(id=id, pkg=pkg, arch=arch, version=version, path=path, filename=filename, component=component, file_id=file_id,