X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fgenerate_packages_sources2.py;h=8908e3cffc669665a67e2649ced042c195c4c858;hb=99749f86a3ca945f6f9f322f5694255e47ee7809;hp=5a1008c424286473ccb943e8012b717b340d9393;hpb=c8f5ceb0d998bd7bfe54744731a26b9762acb389;p=dak.git diff --git a/dak/generate_packages_sources2.py b/dak/generate_packages_sources2.py index 5a1008c4..8908e3cf 100755 --- a/dak/generate_packages_sources2.py +++ b/dak/generate_packages_sources2.py @@ -31,10 +31,10 @@ Generate Packages/Sources files from daklib.dbconn import * from daklib.config import Config from daklib import utils, daklog -from multiprocessing import Pool -import apt_pkg, os, stat, sys +from daklib.dakmultiprocessing import DakProcessPool, PROC_STATUS_SUCCESS, PROC_STATUS_SIGNALRAISED +from daklib.filewriter import PackagesFileWriter, SourcesFileWriter -from daklib.lists import getSources, getBinaries, getArchAll +import apt_pkg, os, stat, sys def usage(): print """Usage: dak generate-packages-sources2 [OPTIONS] @@ -65,7 +65,7 @@ SELECT WHEN key = 'Checksums-Sha1' THEN E'Checksums-Sha1\:\n ' || f.sha1sum || ' ' || f.size || ' ' || SUBSTRING(f.filename FROM E'/([^/]*)\\Z') WHEN key = 'Checksums-Sha256' THEN E'Checksums-Sha256\:\n ' || f.sha256sum || ' ' || f.size || ' ' || SUBSTRING(f.filename FROM E'/([^/]*)\\Z') ELSE key || '\: ' - END || value, E'\n' ORDER BY mk.order) + END || value, E'\n' ORDER BY mk.ordering, mk.key) FROM source_metadata sm JOIN metadata_keys mk ON mk.key_id = sm.key_id @@ -81,35 +81,20 @@ SELECT FROM source s +JOIN src_associations sa ON s.id = sa.source JOIN files f ON s.file=f.id JOIN override o ON o.package = s.source JOIN section sec ON o.section = sec.id JOIN priority pri ON o.priority = pri.id WHERE -o.suite = :suite AND o.component = :component AND o.type = :dsc_type + sa.suite = :suite + AND o.suite = :overridesuite AND o.component = :component AND o.type = :dsc_type ORDER BY s.source, s.version """ -def open_sources(suite, component): - cnf = Config() - dest = os.path.join(cnf['Dir::Root'], 'dists', suite.suite_name, component.component_name, 'source', 'Sources') - - # create queue if it does not exist yet - if os.path.exists(dest) and os.path.isdir(dest): - dest_dir = dest - else: - dest_dir = os.path.dirname(dest) - if not os.path.exists(dest_dir): - umask = os.umask(00000) - os.makedirs(dest_dir, 02775) - os.umask(umask) - - f = open(dest, 'w') - return f - def generate_sources(suite_id, component_id): global _sources_query @@ -119,15 +104,22 @@ def generate_sources(suite_id, component_id): suite = session.query(Suite).get(suite_id) component = session.query(Component).get(component_id) - output = open_sources(suite, component) + overridesuite_id = suite.get_overridesuite().suite_id + + writer = SourcesFileWriter(suite=suite.suite_name, component=component.component_name) + output = writer.open() # run query and write Sources - r = session.execute(_sources_query, {"suite": suite_id, "component": component_id, "dsc_type": dsc_type}) + r = session.execute(_sources_query, {"suite": suite_id, "component": component_id, "dsc_type": dsc_type, "overridesuite": overridesuite_id}) for (stanza,) in r: print >>output, stanza print >>output, "" - return ["generate sources", suite.suite_name, component.component_name] + writer.close() + + message = ["generate sources", suite.suite_name, component.component_name] + session.rollback() + return (PROC_STATUS_SUCCESS, message) ############################################################################# @@ -155,14 +147,14 @@ WITH JOIN location l ON l.id = f.location JOIN source s ON b.source = s.id WHERE - (b.architecture = :arch_all OR b.architecture = :all) AND b.type = :type_name + (b.architecture = :arch_all OR b.architecture = :arch) AND b.type = :type_name AND ba.suite = :suite AND l.component = :component ) SELECT (SELECT - STRING_AGG(key || '\: ' || value, E'\n' ORDER BY mk.order) + STRING_AGG(key || '\: ' || value, E'\n' ORDER BY mk.ordering, mk.key) FROM binaries_metadata bm JOIN metadata_keys mk ON mk.key_id = bm.key_id @@ -170,9 +162,16 @@ SELECT bm.bin_id = tmp.binary_id AND key != 'Section' AND key != 'Priority' ) + || COALESCE(E'\n' || (SELECT + STRING_AGG(key || '\: ' || value, E'\n' ORDER BY key) + FROM external_overrides eo + WHERE + eo.package = tmp.package + AND eo.suite = :overridesuite AND eo.component = :component + ), '') || E'\nSection\: ' || sec.section || E'\nPriority\: ' || pri.priority - || E'\nFilename\: ' || tmp.filename + || E'\nFilename\: pool/' || tmp.filename || E'\nSize\: ' || tmp.size || E'\nMD5sum\: ' || tmp.md5sum || E'\nSHA1\: ' || tmp.sha1sum @@ -193,28 +192,10 @@ WHERE (architecture = :arch_all AND source NOT IN (SELECT DISTINCT source FROM tmp WHERE architecture <> :arch_all)) ) AND - o.type = :type_id AND o.suite = :suite AND o.component = :component -""" + o.type = :type_id AND o.suite = :overridesuite AND o.component = :component -def open_packages(suite, component, architecture, type_name): - cnf = Config() - if type_name == 'udeb': - dest = os.path.join(cnf['Dir::Root'], 'dists', suite.suite_name, component.component_name, 'debian-installer', 'binary-%s' % architecture.arch_string, 'Packages') - else: - dest = os.path.join(cnf['Dir::Root'], 'dists', suite.suite_name, component.component_name, 'binary-%s' % architecture.arch_string, 'Packages') - - # create queue if it does not exist yet - if os.path.exists(dest) and os.path.isdir(dest): - dest_dir = dest - else: - dest_dir = os.path.dirname(dest) - if not os.path.exists(dest_dir): - umask = os.umask(00000) - os.makedirs(dest_dir, 02775) - os.umask(umask) - - f = open(dest, 'w') - return f +ORDER BY tmp.source, tmp.package, tmp.version +""" def generate_packages(suite_id, component_id, architecture_id, type_name): global _packages_query @@ -227,16 +208,24 @@ def generate_packages(suite_id, component_id, architecture_id, type_name): component = session.query(Component).get(component_id) architecture = session.query(Architecture).get(architecture_id) - output = open_packages(suite, component, architecture, type_name) + overridesuite_id = suite.get_overridesuite().suite_id + + writer = PackagesFileWriter(suite=suite.suite_name, component=component.component_name, + architecture=architecture.arch_string, debtype=type_name) + output = writer.open() r = session.execute(_packages_query, {"suite": suite_id, "component": component_id, - "type_id": type_id, "type_name": type_name, "arch_all": arch_all_id}) + "arch": architecture_id, "type_id": type_id, "type_name": type_name, "arch_all": arch_all_id, + "overridesuite": overridesuite_id}) for (stanza,) in r: print >>output, stanza + print >>output, "" - session.close() + writer.close() - return ["generate-packages", suite.suite_name, component.component_name, architecture.arch_string] + message = ["generate-packages", suite.suite_name, component.component_name, architecture.arch_string] + session.rollback() + return (PROC_STATUS_SUCCESS, message) ############################################################################# @@ -272,24 +261,41 @@ def main(): else: suites = session.query(Suite).filter(Suite.untouchable == False).all() - component_ids = [ c.component_id for c in session.query(Component).all() ] + force = Options.has_key("Force") and Options["Force"] - def log(details): - logger.log(details) + component_ids = [ c.component_id for c in session.query(Component).all() ] - pool = Pool() + def parse_results(message): + # Split out into (code, msg) + code, msg = message + if code == PROC_STATUS_SUCCESS: + logger.log([msg]) + elif code == PROC_STATUS_SIGNALRAISED: + logger.log(['E: Subprocess recieved signal ', msg]) + else: + logger.log(['E: ', msg]) + + pool = DakProcessPool() for s in suites: + if s.untouchable and not force: + utils.fubar("Refusing to touch %s (untouchable and not forced)" % s.suite_name) for c in component_ids: - pool.apply_async(generate_sources, [s.suite_id, c], callback=log) + pool.apply_async(generate_sources, [s.suite_id, c], callback=parse_results) for a in s.architectures: - #pool.apply_async(generate_packages, [s.suite_id, c, a.arch_id, 'deb'], callback=log) - apply(generate_packages, [s.suite_id, c, a.arch_id, 'deb']) - #pool.apply_async(generate_packages, [s.suite_id, c, a.arch_id, 'udeb'], callback=log) + if a == 'source': + continue + pool.apply_async(generate_packages, [s.suite_id, c, a.arch_id, 'deb'], callback=parse_results) + pool.apply_async(generate_packages, [s.suite_id, c, a.arch_id, 'udeb'], callback=parse_results) pool.close() pool.join() + # this script doesn't change the database session.close() + logger.close() + + sys.exit(pool.overall_status()) + if __name__ == '__main__': main()