#!/usr/bin/env python
-# Cleans up unassociated binary and source packages
+""" Cleans up unassociated binary and source packages """
# Copyright (C) 2000, 2001, 2002, 2003, 2006 James Troup <james@nocrew.org>
# This program is free software; you can redistribute it and/or modify
import os, pg, stat, sys, time
import apt_pkg
-import daklib.utils
+from daklib import utils
################################################################################
Options = None
now_date = None; # mark newly "deleted" things as deleted "now"
delete_date = None; # delete things marked "deleted" earler than this
+max_delete = None
################################################################################
Clean old packages from suites.
-n, --no-action don't do anything
- -h, --help show this help and exit"""
+ -h, --help show this help and exit
+ -m, --maximum maximum number of files to remove"""
sys.exit(exit_code)
################################################################################
########################################
def clean():
- global delete_date, now_date
+ global delete_date, now_date, max_delete
count = 0
size = 0
before = time.time()
sys.stdout.write("[Deleting from source table... ")
projectB.query("DELETE FROM dsc_files WHERE EXISTS (SELECT 1 FROM source s, files f, dsc_files df WHERE f.last_used <= '%s' AND s.file = f.id AND s.id = df.source AND df.id = dsc_files.id)" % (delete_date))
- projectB.query("DELETE FROM src_uploaders WHERE EXISTS (SELECT 1 FROM source s, files f WHERE f.last_used <= '%s' AND s.file = f.id AND s.id = src_uploaders.source)" % (delete_date))
projectB.query("DELETE FROM source WHERE EXISTS (SELECT 1 FROM files WHERE source.file = files.id AND files.last_used <= '%s')" % (delete_date))
sys.stdout.write("done. (%d seconds)]\n" % (int(time.time()-before)))
# Delete files from the pool
- q = projectB.query("SELECT l.path, f.filename FROM location l, files f WHERE f.last_used <= '%s' AND l.id = f.location" % (delete_date))
+ query = "SELECT l.path, f.filename FROM location l, files f WHERE f.last_used <= '%s' AND l.id = f.location" % (delete_date)
+ if max_delete is not None:
+ query += " LIMIT %d" % max_delete
+ sys.stdout.write("Limiting removals to %d\n" % max_delete)
+
+ q=projectB.query(query)
for i in q.getresult():
filename = i[0] + i[1]
if not os.path.exists(filename):
- daklib.utils.warn("can not find '%s'." % (filename))
+ utils.warn("can not find '%s'." % (filename))
continue
if os.path.isfile(filename):
if os.path.islink(filename):
dest_filename = dest + '/' + os.path.basename(filename)
# If the destination file exists; try to find another filename to use
if os.path.exists(dest_filename):
- dest_filename = daklib.utils.find_next_free(dest_filename)
+ dest_filename = utils.find_next_free(dest_filename)
if Options["No-Action"]:
print "Cleaning %s -> %s ..." % (filename, dest_filename)
else:
- daklib.utils.move(filename, dest_filename)
+ utils.move(filename, dest_filename)
else:
- daklib.utils.fubar("%s is neither symlink nor file?!" % (filename))
+ utils.fubar("%s is neither symlink nor file?!" % (filename))
# Delete from the 'files' table
if not Options["No-Action"]:
projectB.query("DELETE FROM files WHERE last_used <= '%s'" % (delete_date))
sys.stdout.write("done. (%d seconds)]\n" % (int(time.time()-before)))
if count > 0:
- sys.stderr.write("Cleaned %d files, %s.\n" % (count, daklib.utils.size_type(size)))
+ sys.stderr.write("Cleaned %d files, %s.\n" % (count, utils.size_type(size)))
################################################################################
q = projectB.query("""
SELECT m.id FROM maintainer m
WHERE NOT EXISTS (SELECT 1 FROM binaries b WHERE b.maintainer = m.id)
- AND NOT EXISTS (SELECT 1 FROM source s WHERE s.maintainer = m.id)
+ AND NOT EXISTS (SELECT 1 FROM source s WHERE s.maintainer = m.id OR s.changedby = m.id)
AND NOT EXISTS (SELECT 1 FROM src_uploaders u WHERE u.maintainer = m.id)""")
ql = q.getresult()
for i in q.getresult():
filename = i[0]
if not os.path.exists(filename):
- daklib.utils.warn("%s (from queue_build) doesn't exist." % (filename))
+ utils.warn("%s (from queue_build) doesn't exist." % (filename))
continue
if not Cnf.FindB("Dinstall::SecurityQueueBuild") and not os.path.islink(filename):
- daklib.utils.fubar("%s (from queue_build) should be a symlink but isn't." % (filename))
+ utils.fubar("%s (from queue_build) should be a symlink but isn't." % (filename))
os.unlink(filename)
count += 1
projectB.query("DELETE FROM queue_build WHERE last_used <= '%s'" % (our_delete_date))
################################################################################
def main():
- global Cnf, Options, projectB, delete_date, now_date
+ global Cnf, Options, projectB, delete_date, now_date, max_delete
- Cnf = daklib.utils.get_conf()
- for i in ["Help", "No-Action" ]:
- if not Cnf.has_key("Clean-Suites::Options::%s" % (i)):
- Cnf["Clean-Suites::Options::%s" % (i)] = ""
+ Cnf = utils.get_conf()
+ for i in ["Help", "No-Action", "Maximum" ]:
+ if not Cnf.has_key("Clean-Suites::Options::%s" % (i)):
+ Cnf["Clean-Suites::Options::%s" % (i)] = ""
Arguments = [('h',"help","Clean-Suites::Options::Help"),
- ('n',"no-action","Clean-Suites::Options::No-Action")]
+ ('n',"no-action","Clean-Suites::Options::No-Action"),
+ ('m',"maximum","Clean-Suites::Options::Maximum", "HasArg")]
apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv)
Options = Cnf.SubTree("Clean-Suites::Options")
+ if Cnf["Clean-Suites::Options::Maximum"] != "":
+ try:
+ # Only use Maximum if it's an integer
+ max_delete = int(Cnf["Clean-Suites::Options::Maximum"])
+ if max_delete < 1:
+ utils.fubar("If given, Maximum must be at least 1")
+ except ValueError, e:
+ utils.fubar("If given, Maximum must be an integer")
+ else:
+ max_delete = None
+
if Options["Help"]:
usage()
if __name__ == '__main__':
main()
-