#!/usr/bin/env python3 import P4 import sys import argparse class DirectorySizes: def __init__(self, path, depth, revisions): self.range = revisions self.depth = depth self.p4 = P4.P4() self.p4.prog = "DirectorySizes" self.p4.connect() pattern = path + "/*" * depth dirs = self.find_directories(pattern) self.dir_sizes = self.find_sizes(dirs, revisions) def find_directories(self, pattern): dirs = [ x['dir'] for x in self.p4.run_dirs(pattern) ] return dirs def find_sizes(self, dirs, range): result = {} for d in dirs: size = int(self.p4.run_sizes('-sa', "{dir}/...{range}".format(dir=d, range=range))[0]['fileSize']) result[d] = size self.print_size(d, size) return result def print_size(self, directory, size): print("{dir:50} : {size:16} ({human})".format(dir=directory, size=size, human=self.human(size))) def human(self, size): units = [" B", " KB", " MB", " GB", " TB"] factor = 1024 current = size for u in units: if current < factor: return str(current) + u else: current = round(current / factor, 2) return str(current) + " PB" if __name__ == "__main__": parser = argparse.ArgumentParser(description="Directory sizes") parser.add_argument("-d","--depth", default=1, type=int) parser.add_argument("-p","--path") parser.add_argument("-r","--range") args = parser.parse_args() tool = DirectorySizes(args.path, args.depth, args.range)