from urllib import urlopen from xml.dom import minidom, Node class BonsaiResult: nodes = [] class CiNode: log = "" who = "" date = "" files = [] class FileNode: revision = "" filename = "" class BonsaiParser: def __init__(self, bonsaiURL): self.dom = minidom.parse(urlopen(bonsaiURL)) self.nodes = [] self.currentCiNode = None self.currentFileNode = None def getData(self): data = BonsaiResult() while self._nextCiNode(): ci = CiNode() ci.log = self._getLog() ci.who = self._getWho() ci.date = self._getDate() while self._nextFileNode(): fn = FileNode() fn.revision = self._getRevision() fn.filename = self._getFilename() ci.files.append(fn) data.nodes.append(ci) return data def _nextCiNode(self): try: # first node? if not self.currentCiNode: # every other sibling is a , so jump 2 ahead self.currentCiNode = self.dom.getElementsByTagName("ci")[0] else: self.currentCiNode = self.currentCiNode.nextSibling.nextSibling except AttributeError: self.currentCiNode = None if self.currentCiNode: return True else: return False def _getLog(self): log = "" for child in self.currentCiNode.childNodes: if child.nodeType == Node.ELEMENT_NODE and child.tagName == "log": log = child.firstChild.data return log def _getWho(self): """Returns the e-mail address of the commit'er""" return str(self.currentCiNode.getAttribute("who").replace("%", "@")) def _getDate(self): """Returns the date (unix time) of the commit""" return int(self.currentCiNode.getAttribute("date")) def _firstFileNode(self): for child in self.currentCiNode.childNodes: if child.nodeType == Node.ELEMENT_NODE and child.tagName == "files": # child is now the element for c in child.childNodes: if c.nodeType == Node.ELEMENT_NODE and c.tagName == "f": return c def _nextFileNode(self): # every other sibling is a , so go two past the current one try: # first node? if not self.currentFileNode: self.currentFileNode = self._firstFileNode() else: self.currentFileNode = self.currentFileNode.nextSibling.nextSibling except AttributeError: self.currentFileNode = None if self.currentFileNode: return True else: return False def _getFilename(self): return str(self.currentFileNode.firstChild.data) def _getRevision(self): return float(self.currentFileNode.getAttribute("rev")) bp = BonsaiParser("http://bonsai.mozilla.org/cvsquery.cgi?treeid=default&module=all&branch=HEAD&sortby=Date&date=hours&hours=2&cvsroot=%2Fcvsroot&xml=1") data = bp.getData() for cinode in data.nodes: print "Who: ", cinode.who print "Log: \n", cinode.log print "Date:", cinode.date for file in cinode.files: print "Revision: ", file.revision print "Filename: ", file.filename print "\n\n\n\n"