import py import re import datetime from dateutil import parser logrex = re.compile( r'(?P.*:\d\d \d\d\d\d) (?P\(\d*\)) (?P.*)') newrex = re.compile( r'(?P.*): new (\(digest\) )?"?(?P[^ ]*)"? [<\(](?P.*)[>/)](, (?P.*))?') deleterex = re.compile( r'(?P.*): deleted (?P[^ ;]*)(; (?P.*))?') def extract_date(date): date = parser.parse(date) return "%02d/%02d/%02d" % (date.year, date.month, date.day) displaylists = "pypy-dev pypy-svn".split() if __name__ == '__main__': subscribed = {} lines = py.path.local(py.std.sys.argv[1]).readlines() lastdate = '' for line in lines: m = logrex.match(line) if m is None: pass #print "did not match", line else: gdict = m.groupdict() msg = gdict['msg'] date = extract_date(gdict['date']) if lastdate == '': lastdate = date if lastdate != date: pattern = "%s" + ", %s" * len(displaylists) print pattern % ( (lastdate, ) + tuple([len(subscribed.get(dl, [])) for dl in displaylists])) lastdate = date m2 = newrex.match(msg) if m2 is not None: gdict = m2.groupdict() if gdict['list'] not in subscribed: subscribed[gdict['list']] = set() subscribed[gdict['list']].add(gdict['email']) # print date, "add", len(subscribed), gdict['list'], len(subscribed[gdict['list']]) continue m2 = deleterex.match(msg) if m2 is not None: gdict = m2.groupdict() if gdict['list'] not in subscribed: # print "missing!" continue subscribed[gdict['list']].discard(gdict['email']) continue