3 """ Manage build queues
5 @contact: Debian FTPMaster <ftpmaster@debian.org>
6 @copyright: 2000, 2001, 2002, 2006 James Troup <james@nocrew.org>
7 @copyright: 2009 Mark Hymers <mhy@debian.org>
8 @copyright: 2012, Ansgar Burchardt <ansgar@debian.org>
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2 of the License, or
15 # (at your option) any later version.
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 ################################################################################
29 from datetime import datetime, timedelta
32 from daklib import daklog
33 from daklib.archive import ArchiveTransaction
34 from daklib.dbconn import *
35 from daklib.config import Config
37 ################################################################################
42 ################################################################################
44 def usage (exit_code=0):
45 print """Usage: dak manage-build-queues [OPTIONS] buildqueue1 buildqueue2
46 Manage the contents of one or more build queues
48 -a, --all run on all known build queues
49 -n, --no-action don't do anything
50 -h, --help show this help and exit"""
54 ################################################################################
56 def clean(build_queue, transaction, now=None):
57 session = transaction.session
61 delete_before = now - timedelta(seconds=build_queue.stay_of_execution)
62 suite = build_queue.suite
68 JOIN bin_associations ba ON b.id = ba.bin
69 WHERE ba.suite = :suite_id
70 AND ba.created < :delete_before"""
71 binaries = session.query(DBBinary).from_statement(query) \
72 .params({'suite_id': suite.suite_id, 'delete_before': delete_before})
73 for binary in binaries:
74 Logger.log(["removed binary from build queue", build_queue.queue_name, binary.package, binary.version])
75 transaction.remove_binary(binary, suite)
81 JOIN src_associations sa ON s.id = sa.source
82 WHERE sa.suite = :suite_id
83 AND sa.created < :delete_before
84 AND NOT EXISTS (SELECT 1 FROM bin_associations ba
85 JOIN binaries b ON ba.bin = b.id
86 WHERE ba.suite = :suite_id
87 AND b.source = s.id)"""
88 sources = session.query(DBSource).from_statement(query) \
89 .params({'suite_id': suite.suite_id, 'delete_before': delete_before})
90 for source in sources:
91 Logger.log(["removed source from build queue", build_queue.queue_name, source.source, source.version])
92 transaction.remove_source(source, suite)
95 global Options, Logger
99 for i in ["Help", "No-Action", "All"]:
100 if not cnf.has_key("Manage-Build-Queues::Options::%s" % (i)):
101 cnf["Manage-Build-Queues::Options::%s" % (i)] = ""
103 Arguments = [('h',"help","Manage-Build-Queues::Options::Help"),
104 ('n',"no-action","Manage-Build-Queues::Options::No-Action"),
105 ('a',"all","Manage-Build-Queues::Options::All")]
107 queue_names = apt_pkg.parse_commandline(cnf.Cnf, Arguments, sys.argv)
108 Options = cnf.subtree("Manage-Build-Queues::Options")
113 Logger = daklog.Logger('manage-build-queues', Options['No-Action'])
115 starttime = datetime.now()
117 session = DBConn().session()
119 with ArchiveTransaction() as transaction:
120 session = transaction.session
122 if len(queue_names) != 0:
123 print "E: Cannot use both -a and a queue name"
125 queues = session.query(BuildQueue)
127 queues = session.query(BuildQueue).filter(BuildQueue.queue_name.in_(queue_names))
130 Logger.log(['cleaning queue %s using datetime %s' % (q.queue_name, starttime)])
131 clean(q, transaction, now=starttime)
132 if not Options['No-Action']:
135 transaction.rollback()
139 #######################################################################################
141 if __name__ == '__main__':