+ for pkg in pkgs:
+ output.write(files[pkg]+'\n')
+ output.close();
+
+################################################################################
+
+def write_filelists(packages, dislocated_files):
+ # Build up the index to iterate over
+ d = {};
+ for unique_id in packages.keys():
+ suite = packages[unique_id]["suite"];
+ 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[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"]);
+ for suite in map(string.lower, suites):
+ if not d.has_key(suite):
+ d[suite] = {};
+ if not Options["Component"]:
+ components = Cnf.ValueList("Suite::%s::Components" % (suite));
+ else:
+ components = string.split(Options["Components"]);
+ 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] = {};
+ if component in udeb_components:
+ binary_types = [ "deb", "udeb" ];
+ else:
+ binary_types = [ "deb" ];
+ if not Options["Architecture"]:
+ architectures = Cnf.ValueList("Suite::%s::Architectures" % (suite));
+ else:
+ architectures = string.split(Options["Architectures"]);
+ for arch in map(string.lower, architectures):
+ if not d[suite][component].has_key(arch):
+ d[suite][component][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] = [];
+ # Then walk it
+ for suite in d.keys():
+ if Cnf.has_key("Suite::%s::Components" % (suite)):
+ for component in d[suite].keys():
+ for arch in d[suite][component].keys():
+ if arch == "all":
+ continue;
+ 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]);
+ write_filelist(suite, component, arch, type, list,
+ packages, dislocated_files);
+ else: # legacy-mixed suite
+ list = [];
+ for component in d[suite].keys():
+ for arch in d[suite][component].keys():
+ for type in d[suite][component][arch].keys():
+ list.extend(d[suite][component][arch][type]);
+ write_legacy_mixed_filelist(suite, list, packages, dislocated_files);
+
+################################################################################
+
+# Want to use stable dislocation support: True or false?
+def stable_dislocation_p():
+ # If the support is not explicitly enabled, assume it's disabled
+ if not Cnf.FindB("Dinstall::StableDislocationSupport"):
+ return 0;
+ # If we don't have a stable suite, obviously a no-op
+ if not Cnf.has_key("Suite::Stable"):
+ return 0;
+ # If the suite(s) weren't explicitly listed, all suites are done
+ if not Options["Suite"]:
+ return 1;
+ # Otherwise, look in what suites the user specified
+ suites = string.split(Options["Suite"]);
+ return suites.count("stable");
+
+################################################################################
+
+def do_da_do_da():
+ (con_suites, con_architectures, con_components, check_source) = parse_args();
+
+ if stable_dislocation_p():
+ dislocated_files = claire.find_dislocated_stable(Cnf, projectB);
+ else:
+ dislocated_files = {};
+
+ query = """
+SELECT b.id, b.package, a.arch_string, b.version, l.path, f.filename, c.name,
+ f.id, su.suite_name, b.type
+ FROM binaries b, bin_associations ba, architecture a, files f, location l,
+ component c, suite su
+ WHERE b.id = ba.bin AND b.file = f.id AND b.architecture = a.id
+ 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 + """
+UNION
+SELECT s.id, s.source, 'source', s.version, l.path, f.filename, c.name, f.id,
+ su.suite_name, 'dsc'
+ FROM source s, src_associations sa, files f, location l, component c, suite su
+ WHERE s.id = sa.source AND s.file = f.id AND f.location = l.id
+ AND l.component = c.id AND sa.suite = su.id %s %s""" % (con_suites, con_components);
+ q = projectB.query(query);
+ ql = q.getresult();
+ # Build up the main index of packages
+ packages = {};
+ unique_id = 0;
+ 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;
+ packages[unique_id] = Dict(id=id, pkg=pkg, arch=arch, version=version,
+ path=path, filename=filename,
+ component=component, file_id=file_id,
+ suite=suite, type = type);
+ cleanup(packages);
+ write_filelists(packages, dislocated_files);
+
+################################################################################