Mercurial > moztree-vis
changeset 2:e282ed20b426
include file change info in moztree.json
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Sat, 12 Dec 2009 22:40:39 -0800 |
parents | ef88131dbd73 |
children | 8db61508af10 |
files | build-moztree-json.py |
diffstat | 1 files changed, 62 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/build-moztree-json.py Sat Dec 12 15:18:01 2009 -0800 +++ b/build-moztree-json.py Sat Dec 12 22:40:39 2009 -0800 @@ -1,10 +1,17 @@ import os import re import fnmatch +import datetime + import simplejson as json +import mercurial +import mercurial.ui +import mercurial.localrepo +import mercurial.context class Directory(object): - def __init__(self, name, parent=None, pattern=re.compile('.*')): + def __init__(self, name='', parent=None, pattern=re.compile('.*'), + file_changesets=None): if isinstance(pattern, basestring): pattern = re.compile(fnmatch.translate(pattern)) @@ -13,33 +20,49 @@ self.path = os.path.join(parent.path, name) else: self.path = name + + if self.path: + rawfiles = os.listdir(self.path) + else: + rawfiles = os.listdir('.') + self.parent = parent self.files = [] self.subdirs = [] - files = [filename for filename in os.listdir(self.path) + files = [filename for filename in rawfiles if filename[0] != '.'] for filename in files: file_path = os.path.join(self.path, filename) if (pattern.match(filename) and os.path.isfile(file_path)): - self.files.append(File(filename, self)) + self.files.append(File(filename, self, file_changesets)) elif (os.path.isdir(file_path) and 'test' not in file_path): - self.subdirs.append(Directory(filename, self, - pattern)) + self.subdirs.append(Directory(filename, + self, + pattern, + file_changesets)) file_sizes = [file.size for file in self.files] subdir_sizes = [subdir.size for subdir in self.subdirs] self.size = sum(file_sizes) + sum(subdir_sizes) + file_changes = [file.changes for file in self.files] + subdir_changes = [subdir.changes for subdir in self.subdirs] + self.changes = sum(file_changes) + sum(subdir_changes) + def __repr__(self): return "<Directory '%s'>" % self.path class File(object): - def __init__(self, filename, parent): + def __init__(self, filename, parent, file_changesets): self.parent = parent self.name = filename self.path = os.path.join(parent.path, filename) self.size = os.stat(self.path).st_size + if self.path in file_changesets: + self.changes = file_changesets[self.path] + else: + self.changes = 0 def __repr__(self): return "<File '%s'>" % self.name @@ -70,6 +93,7 @@ obj = {'name': directory.name, 'size': directory.size, + 'changes': directory.changes, 'subdirs': []} for subdir in subdirs: @@ -77,6 +101,30 @@ return obj +def get_file_changesets(path): + a_year_ago = datetime.datetime.now() - datetime.timedelta(days=365) + ui = mercurial.ui.ui() + repo = mercurial.localrepo.localrepository(ui, path) + ctx = mercurial.context.changectx(repo) + to_visit = [ctx] + files = {} + + while to_visit: + ctx = to_visit.pop() + date = datetime.datetime.fromtimestamp(ctx.date()[0]) + if date < a_year_ago: + break + for filename in ctx.files(): + if 'test' in filename: + continue + if filename not in files: + files[filename] = 0 + files[filename] += 1 + for anc in ctx.parents(): + to_visit.append(anc) + + return files + if __name__ == '__main__': import sys @@ -90,7 +138,14 @@ else: pattern = "*.*" - directory = Directory(sys.argv[1], pattern=pattern) + file_changesets = get_file_changesets(sys.argv[1]) + + curdir = os.getcwd() + os.chdir(sys.argv[1]) + directory = Directory(pattern=pattern, + file_changesets=file_changesets) + os.chdir(curdir) + filename = 'moztree.json' open(filename, 'w').write(json.dumps(get_json(directory))) print "Wrote '%s'." % filename