X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fgenerate_filelist.py;h=e6a2ba57c3b53e21b8e83c90c8ad74e3c46a4b06;hb=317c4c7f173540de71907f1e527437d88f48a3b9;hp=02f5f18518b7985e31ddcb2e0099837e6db54b6f;hpb=9a14adff2ca4e7a5346c0c3b5723d9959022291a;p=dak.git diff --git a/dak/generate_filelist.py b/dak/generate_filelist.py index 02f5f185..e6a2ba57 100755 --- a/dak/generate_filelist.py +++ b/dak/generate_filelist.py @@ -22,8 +22,22 @@ Generate file lists for apt-ftparchive. # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +################################################################################ + +# Ganneff> Please go and try to lock mhy now. After than try to lock NEW. +# twerner> !lock mhy +# dak> twerner: You suck, this is already locked by Ganneff +# Ganneff> now try with NEW +# twerner> !lock NEW +# dak> twerner: also locked NEW +# mhy> Ganneff: oy, stop using me for locks and highlighting me you tall muppet +# Ganneff> hehe :) + +################################################################################ + from daklib.dbconn import * from daklib.config import Config +from daklib.threadpool import ThreadPool from daklib import utils import apt_pkg, os, sys @@ -36,6 +50,7 @@ def getSources(suite, component, session): SELECT path, filename FROM srcfiles_suite_component WHERE suite = :suite AND component = :component + ORDER BY filename """ args = { 'suite': suite.suite_id, 'component': component.component_id } @@ -43,10 +58,46 @@ def getSources(suite, component, session): def getBinaries(suite, component, architecture, type, session): query = """ - SELECT path, filename - FROM binfiles_suite_component_arch - WHERE suite = :suite AND component = :component AND type = :type AND - (architecture = :architecture OR architecture = 2) +CREATE TEMP TABLE gf_candidates ( + filename text, + path text, + architecture integer, + src integer, + source text); + +INSERT INTO gf_candidates (filename, path, architecture, src, source) + SELECT f.filename, l.path, b.architecture, b.source as src, s.source + FROM binaries b + JOIN bin_associations ba ON b.id = ba.bin + JOIN source s ON b.source = s.id + JOIN files f ON b.file = f.id + JOIN location l ON f.location = l.id + WHERE ba.suite = :suite AND b.type = :type AND + l.component = :component AND b.architecture IN (2, :architecture); + +WITH arch_any AS + + (SELECT path, filename FROM gf_candidates + WHERE architecture > 2), + + arch_all_with_any AS + (SELECT path, filename FROM gf_candidates + WHERE architecture = 2 AND + src IN (SELECT src FROM gf_candidates WHERE architecture > 2)), + + arch_all_without_any AS + (SELECT path, filename FROM gf_candidates + WHERE architecture = 2 AND + source NOT IN (SELECT DISTINCT source FROM gf_candidates WHERE architecture > 2)), + + filelist AS + (SELECT * FROM arch_any + UNION + SELECT * FROM arch_all_with_any + UNION + SELECT * FROM arch_all_without_any) + + SELECT * FROM filelist ORDER BY filename """ args = { 'suite': suite.suite_id, 'component': component.component_id, @@ -67,26 +118,32 @@ def listPath(suite, component, architecture = None, type = None): pathname = os.path.join(Config()["Dir::Lists"], filename) return utils.open_file(pathname, "w") -def writeSourceList(suite, component, session): +def writeSourceList(args): + (suite, component) = args file = listPath(suite, component) + session = DBConn().session() for filename in getSources(suite, component, session): file.write(filename + '\n') + session.close() file.close() -def writeBinaryList(suite, component, architecture, type, session): +def writeBinaryList(args): + (suite, component, architecture, type) = args file = listPath(suite, component, architecture, type) + session = DBConn().session() for filename in getBinaries(suite, component, architecture, type, session): file.write(filename + '\n') + session.close() file.close() def usage(): print """Usage: dak generate_filelist [OPTIONS] Create filename lists for apt-ftparchive. - -s, --suite=SUITE act on this suite + -s, --suite=SUITE act on this suite -c, --component=COMPONENT act on this component - -a, --architecture=ARCH act on this architecture - -h, --help show this help and exit + -a, --architecture=ARCH act on this architecture + -h, --help show this help and exit ARCH, COMPONENT and SUITE can be comma (or space) separated list, e.g. --suite=testing,unstable""" @@ -117,6 +174,7 @@ def main(): usage() session = DBConn().session() suite_arch = session.query(SuiteArchitecture) + threadpool = ThreadPool() for suite_name in utils.split_args(Options['Suite']): suite = query_suites.filter_by(suite_name = suite_name).one() join = suite_arch.filter_by(suite_id = suite.suite_id) @@ -129,14 +187,17 @@ def main(): try: join.filter_by(arch_id = architecture.arch_id).one() if architecture_name == 'source': - writeSourceList(suite, component, session) + threadpool.queueTask(writeSourceList, (suite, component)) elif architecture_name != 'all': - writeBinaryList(suite, component, architecture, 'deb', session) - writeBinaryList(suite, component, architecture, 'udeb', session) + threadpool.queueTask(writeBinaryList, + (suite, component, architecture, 'deb')) + threadpool.queueTask(writeBinaryList, + (suite, component, architecture, 'udeb')) except: pass + threadpool.joinAll() # this script doesn't change the database - session.rollback() + session.close() if __name__ == '__main__': main()