#!/usr/bin/python import os, sys localdir = "/var/lib/pacman/local" directories = os.listdir(localdir) def sortbyvalue(dict): """ Return a list of (key, value) pairs, sorted by value. """ _swap2 = lambda (x,y): (y,x) mdict = map(_swap2, dict.items()) mdict.sort() mdict = map(_swap2, mdict) return mdict def numfmt(value): v = str(float(value)) + '0000' i = v.index('.') if i < 4: return v[:5] else: return v[:i+2] def getHumanSize(bytes): filesize = int(bytes) if filesize >= 1000*1024*1024: filefrmt = "%s GB" % numfmt(filesize/1024.0/1024/1024) elif filesize >= 1000*1024: filefrmt = "%s MB" % numfmt(filesize/1024.0/1024) elif filesize >= 1000: filefrmt = "%s KB" % numfmt(filesize/1024.0) elif filesize == 0: filefrmt = "%i B" % filesize return filefrmt def getpackagesize(dir, currentdir): description = "/".join([currentdir, "desc"]) if not os.path.exists(description): return fd = file(description, 'r') lines = fd.read().split('\n') fd.close() sizeline = size = None pos = 0 for line in lines: if sizeline != None and sizeline == pos: size = eval(line) break if "%SIZE%" in line: sizeline = pos + 1 pos +=1 if size is not None: PackageSizesDict[dir] = size if __name__ == '__main__': reverse = alpha = False if len(sys.argv) > 1: for arg in sys.argv[1:]: if arg in ("--reverse", "-r"): reverse = True if arg in ("--alpha", "-a"): alpha = True PackageSizesDict = {} for dir in directories: currentdir = "/".join([localdir, dir]) if not os.path.isdir(currentdir): continue getpackagesize(dir, currentdir) if not alpha: PackageSizesListOfTuples = sortbyvalue(PackageSizesDict) else: PackageSizesListOfTuples = [(key,value) for key,value in PackageSizesDict.keys()] if reverse: PackageSizesListOfTuples.reverse() totalsize = 0 for thing in PackageSizesListOfTuples: package, size = thing human = getHumanSize(size) string = "%s%s%s%s%s" % (human.rjust(10), " ", package, (45 - len(package)) * " ", "%i bytes".rjust(20-len(str(size))) % size) totalsize += size print string human = getHumanSize(totalsize) print "-"*80 label = "Total size of packages" string = "%s%s%s%s%s" % (human, (10 - len(human)) * " ", label, (45 - len(label)) * " ", "%i bytes".rjust(20-len(str(totalsize))) % totalsize) print string