#!/usr/bin/env python # distclean.py - remove source files for Gentoo # packages that are no longer installed # Fredrik Arnerup (e97_far@e.kth.se), 2003 # Use with '-p' (pretend) flag to just get a list of files # that would be removed import sys, os, os.path, getopt, portage opt_p = 0 try: if len(sys.argv) > 1: opt_p = getopt.getopt(sys.argv[1:], "p")[0][0][0] == '-p' except getopt.GetoptError: pass distdir = portage.config().environ()['DISTDIR'] print 'DISTDIR =', distdir vartree = portage.db["/"]["vartree"] packages = [] for name in vartree.getallnodes(): packages.extend(vartree.dep_match(name)) files = {} for package in packages: try: package_files = portage.portdb.aux_get(package, ['SRC_URI'])[0].split() package_files = [(url.split('/')[-1]) for url in package_files] for filename in package_files: files[filename] = 1 except: print "Failed to get file list for", package if not files: sys.exit("No package files found. This can't be right.\n") try: list = portage.listdir(distdir) except os.OSError: sys.exit("Failed to read " + distdir) size = 0; count = 0 for file in list: abs_file = distdir + '/' + file if (os.path.isfile(abs_file) and (not os.path.islink(abs_file)) and (not file in files)): size += os.stat(abs_file).st_size count += 1 if opt_p: print 'Would remove', abs_file else: try: os.remove(abs_file) print 'Removed', abs_file except OSError: print 'Failed to remove', abs_file size /= 1024 ## KB print "%i files, total size: %i KB" % (count, size)