X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=jenna;h=99de03b29e1771e0a2a580b6260e8606b53941d9;hb=9540d873fa78598454af57f5f8a4875969ed0439;hp=69ca6e07d0c2ea8f934358a0870e1886ca115999;hpb=c846e77a848d60dd115f00faa0d9a854161d99eb;p=dak.git diff --git a/jenna b/jenna index 69ca6e07..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.21 2002-10-16 02:47:32 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,7 +61,7 @@ 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); @@ -105,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 @@ -117,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); @@ -148,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]; ################################################################################ @@ -160,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(): @@ -192,7 +189,7 @@ def cleanup(packages): 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); ################################################################################ @@ -266,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 = Options["Suite"].split(); + 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 = Options["Components"].split(); + 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: @@ -301,17 +290,15 @@ def write_filelists(packages, dislocated_files): if not Options["Architecture"]: architectures = Cnf.ValueList("Suite::%s::Architectures" % (suite)); else: - architectures = Options["Architectures"].split(); + 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)): @@ -322,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 @@ -349,12 +340,27 @@ def stable_dislocation_p(): if not Options["Suite"]: return 1; # Otherwise, look in what suites the user specified - suites = Options["Suite"].split(); - return suites.count("stable"); + suites = utils.split_args(Options["Suite"]); + + if "stable" in suites: + return 1; + else: + return 0; ################################################################################ def do_da_do_da(): + # 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);