# Check for any binaries which are marked for eventual deletion
# but are now used again.
-
+
q = session.execute("""
SELECT b.file, f.filename FROM binaries b, files f
WHERE f.last_used IS NOT NULL AND f.id = b.file
session.commit()
########################################
-
+
def check_sources(now_date, delete_date, max_delete, session):
print "Checking for orphaned source packages..."
#### reinstate sources because of them
for i in q.fetchall():
- Logger.log(["unset lastused", i[1]])
+ Logger.log(["unset lastused", i[1]])
session.execute("UPDATE files SET last_used = NULL WHERE id = :fileid",
{'fileid': i[0]})
SELECT id, filename FROM files f
WHERE NOT EXISTS (SELECT 1 FROM binaries b WHERE b.file = f.id)
AND NOT EXISTS (SELECT 1 FROM dsc_files df WHERE df.file = f.id)
+ AND NOT EXISTS (SELECT 1 FROM changes_pool_files cpf WHERE cpf.fileid = f.id)
+ AND NOT EXISTS (SELECT 1 FROM queue_files qf WHERE qf.id = f.id)
+ AND last_used IS NULL
ORDER BY filename""")
ql = q.fetchall()
# Delete from source
print "Deleting from source table... "
q = session.execute("""
-SELECT df.id, s.id, f.filename FROM source s, files f, dsc_files df
+SELECT s.id, f.filename FROM source s, files f
WHERE f.last_used <= :deletedate
- AND s.file = f.id AND s.id = df.source""", {'deletedate': delete_date})
+ AND s.file = f.id""", {'deletedate': delete_date})
for s in q.fetchall():
- Logger.log(["delete source", s[2]])
+ Logger.log(["delete source", s[1], s[0]])
if not Options["No-Action"]:
- session.execute("DELETE FROM dsc_files WHERE id = :dsc_id", {"dscid":s[0]})
- session.execute("DELETE FROM source WHERE id = :s_id", {"s_id":s[1]})
+ session.execute("DELETE FROM dsc_files WHERE source = :s_id", {"s_id":s[0]})
+ session.execute("DELETE FROM source WHERE id = :s_id", {"s_id":s[0]})
if not Options["No-Action"]:
session.commit()
# Delete files from the pool
- old_files = session.query(PoolFile).filter(last_used <= delete_date)
+ old_files = session.query(PoolFile).filter(PoolFile.last_used <= delete_date)
if max_delete is not None:
old_files = old_files.limit(max_delete)
print "Limiting removals to %d" % max_delete
if not Options["No-Action"]:
session.delete(pf)
-
+
else:
utils.fubar("%s is neither symlink nor file?!" % (filename))
session.commit()
if count > 0:
+ Logger.log(["total", count, utils.size_type(size)])
print "Cleaned %d files, %s." % (count, utils.size_type(size))
################################################################################
session.commit()
if count > 0:
+ Logger.log(["total", count])
print "Cleared out %d maintainer entries." % (count)
################################################################################
session.commit()
if count > 0:
+ Logger.log(["total", count])
print "Cleared out %d fingerprint entries." % (count)
################################################################################
our_delete_date = now_date - timedelta(seconds = int(cnf["Clean-Suites::QueueBuildStayOfExecution"]))
count = 0
- for qf in session.query(QueueBuild).filter(last_used <= our_delete_date):
+ for qf in session.query(BuildQueueFile).filter(BuildQueueFile.last_used <= our_delete_date):
if not os.path.exists(qf.filename):
utils.warn("%s (from queue_build) doesn't exist." % (qf.filename))
continue
session.commit()
if count:
+ Logger.log(["total", count])
print "Cleaned %d queue_build files." % (count)
################################################################################
+def clean_empty_directories(session):
+ """
+ Removes empty directories from pool directories.
+ """
+
+ count = 0
+
+ cursor = session.execute(
+ "SELECT DISTINCT(path) FROM location WHERE type = :type",
+ {'type': 'pool'},
+ )
+ bases = [x[0] for x in cursor.fetchall()]
+
+ for base in bases:
+ for dirpath, dirnames, filenames in os.walk(base, topdown=False):
+ if not filenames and not dirnames:
+ to_remove = os.path.join(base, dirpath)
+ if not Options["No-Action"]:
+ Logger.log(["removing directory", to_remove])
+ os.removedirs(to_remove)
+ count += 1
+
+ if count:
+ Logger.log(["total removed directories", count])
+
+################################################################################
+
def main():
global Options, Logger
clean_maintainers(now_date, delete_date, max_delete, session)
clean_fingerprints(now_date, delete_date, max_delete, session)
clean_queue_build(now_date, delete_date, max_delete, session)
+ clean_empty_directories(session)
Logger.close()