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