which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.0.0.236/trunk@220027 18797224-902f-48f8-a5cc-f745e15eee43
86 lines
3.1 KiB
Python
Executable File
86 lines
3.1 KiB
Python
Executable File
#! /usr/bin/python
|
|
|
|
"""Based on the fakechanges.py contrib script"""
|
|
|
|
import sys
|
|
from twisted.spread import pb
|
|
from twisted.cred import credentials
|
|
from twisted.internet import reactor, task
|
|
from twisted.python import log
|
|
import commands, random, os.path, time, MySQLdb
|
|
|
|
class ViewCvsPoller:
|
|
|
|
def __init__(self):
|
|
def _load_rc():
|
|
import user
|
|
ret = {}
|
|
for line in open(os.path.join(user.home,".cvsblamerc")).readlines():
|
|
if line.find("=") != -1:
|
|
key, val = line.split("=")
|
|
ret[key.strip()] = val.strip()
|
|
return ret
|
|
# maybe add your own keys here db=xxx, user=xxx, passwd=xxx
|
|
self.cvsdb = MySQLdb.connect("cvs", **_load_rc())
|
|
#self.last_checkin = "2005-05-11" # for testing
|
|
self.last_checkin = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
|
|
|
|
def get_changes(self):
|
|
changes = []
|
|
|
|
def empty_change():
|
|
return {'who': None, 'files': [], 'comments': None }
|
|
change = empty_change()
|
|
|
|
cursor = self.cvsdb.cursor()
|
|
cursor.execute("""SELECT whoid, descid, fileid, dirid, branchid, ci_when
|
|
FROM checkins WHERE ci_when>='%s'""" % self.last_checkin)
|
|
last_checkin = None
|
|
for whoid, descid, fileid, dirid, branchid, ci_when in cursor.fetchall():
|
|
if branchid != 1: # only head
|
|
continue
|
|
cursor.execute("""SELECT who from people where id=%s""" % whoid)
|
|
who = cursor.fetchone()[0]
|
|
cursor.execute("""SELECT description from descs where id=%s""" % descid)
|
|
desc = cursor.fetchone()[0]
|
|
cursor.execute("""SELECT file from files where id=%s""" % fileid)
|
|
filename = cursor.fetchone()[0]
|
|
cursor.execute("""SELECT dir from dirs where id=%s""" % dirid)
|
|
dirname = cursor.fetchone()[0]
|
|
if who == change["who"] and desc == change["comments"]:
|
|
change["files"].append( "%s/%s" % (dirname, filename) )
|
|
elif change["who"]:
|
|
changes.append(change)
|
|
change = empty_change()
|
|
else:
|
|
change["who"] = who
|
|
change["files"].append( "%s/%s" % (dirname, filename) )
|
|
change["comments"] = desc
|
|
if last_checkin == None or ci_when > last_checkin:
|
|
last_checkin = ci_when
|
|
if last_checkin:
|
|
self.last_checkin = last_checkin
|
|
return changes
|
|
|
|
poller = ViewCvsPoller()
|
|
|
|
def error(*args):
|
|
log.err()
|
|
reactor.stop()
|
|
|
|
def poll_changes(remote):
|
|
print "GET CHANGES SINCE", poller.last_checkin,
|
|
changes = poller.get_changes()
|
|
for change in changes:
|
|
print change["who"], "\n *", "\n * ".join(change["files"])
|
|
remote.callRemote('addChange', change).addErrback(error)
|
|
print
|
|
reactor.callLater(60, poll_changes, remote)
|
|
|
|
factory = pb.PBClientFactory()
|
|
reactor.connectTCP("localhost", 9999, factory )
|
|
deferred = factory.login(credentials.UsernamePassword("change", "changepw"))
|
|
deferred.addCallback(poll_changes).addErrback(error)
|
|
|
|
reactor.run()
|