You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by hd...@apache.org on 2012/12/11 18:18:59 UTC

svn commit: r1420292 - /openoffice/devtools/scripts/svnlog2info.py

Author: hdu
Date: Tue Dec 11 17:18:58 2012
New Revision: 1420292

URL: http://svn.apache.org/viewvc?rev=1420292&view=rev
Log:
added a verbose title attribute to commit links

Write the html output file in the UTF-8 encoding.

Simplify svn-log parsing using its xml-formatted output.

Modified:
    openoffice/devtools/scripts/svnlog2info.py

Modified: openoffice/devtools/scripts/svnlog2info.py
URL: http://svn.apache.org/viewvc/openoffice/devtools/scripts/svnlog2info.py?rev=1420292&r1=1420291&r2=1420292&view=diff
==============================================================================
--- openoffice/devtools/scripts/svnlog2info.py (original)
+++ openoffice/devtools/scripts/svnlog2info.py Tue Dec 11 17:18:58 2012
@@ -23,24 +23,25 @@
 
 import sys
 import re
+import codecs
 import xmlrpclib
 from subprocess import Popen, PIPE
-
+from xml.dom.minidom import parseString
+from xml.sax.saxutils import escape, quoteattr
 
 # string constants to get the info for the Apache OpenOffice project
-bzsoap = "https://issues.apache.org/ooo/xmlrpc.cgi"
 issue_pattern = "^\s*(?:re)?(?:fix)?\s*(?:for)?\s*(?:bug|issue|problem)?\s*#?i?([1-9][0-9][0-9][0-9]+)[#: ]"
+bzsoap = "https://issues.apache.org/ooo/xmlrpc.cgi"
 bugref_url = "https://issues.apache.org/ooo/show_bug.cgi?id="
 infoout_name = "izlist.htm"
 
 
 class Revision(object):
 	"""Constructor for a Revision object"""
-	def __init__( self, revnum, author, revlog, dirs_changed):
+	def __init__( self, revnum, author, revlog):
 		self.revnum = revnum
 		self.author = author
 		self.log    = revlog
-		self.dirs_changed = dirs_changed
 		self.issue  = get_issue( revlog)
 
 
@@ -70,82 +71,32 @@ def get_svn_log( svnurl, revmin, revmax)
 		print "revision %d is out of range" % (revmax)
 		return None
 
-	svncmd = "svn log -v -r%d:%d %s" % (revmin, revmax, svnurl)
+	svncmd = "svn log --xml -r%d:%d %s" % (revmin, revmax, svnurl)
 	svnout = Popen( svncmd, shell=True, stdout=PIPE).communicate()[0]
 	return svnout
 
 
-def parse_svn_log( svnout):
-	"""Parse the output of the svn log command"""
+def parse_svn_log_xml( svnout):
+	"""Parse the output of the xml-formatted svn log command"""
 	all_revs = []
-	s = svnout
-	while True:
-		(s,rev) = parse_svn_rev( s)
-		if not rev:
-			break
-		all_revs.append( rev)
-	return all_revs
 
+	dom = parseString( svnout)
+	for log in dom.getElementsByTagName('logentry'):
+		revnum = int(log.getAttribute("revision"))
+		author = log.getElementsByTagName("author")[0].firstChild.nodeValue
+		comment = log.getElementsByTagName("msg")[0].firstChild.nodeValue
+		all_revs.append( Revision( revnum, author, comment))
 
-def parse_svn_rev( s):
-	"""Parse a revision from the svn log output"""
-	# parse the seperator line
-	sep_re = re.compile( "-----+")
-	sep_line = sep_re.match( s)
-	if not sep_line:
-		print "SVN revision log separator line not found: \"%s\"" % (s[0:80])
-		return (s, None)
-	s = s[ sep_line.end()+1:]
-	if len(s) == 0:
-		return (s, None)
-	# parse the revision line
-	# :r1418023 | jani | 2012-12-06 19:30:45 +0100 (Thu, 06 Dec 2012) | 2 lines
-	rev_pattern = "r(\d+) \| (\w+) \| .* \| (\d+) lines?\n"
-	rev_re = re.compile( rev_pattern, re.MULTILINE)
-	m_rev = rev_re.match( s)
-	if m_rev == None:
-		print( "SVN revision header line not found: \"%s\" !!!" % (s[:200]))
-		return (s, None)
-	revnum = int(m_rev.group(1))
-	author = m_rev.group(2)
-	linecnt = int(m_rev.group(3))
-	s = s[ m_rev.end():]
-
-	# parse changed dirs
-	cdirs = []
-	cpath_re = re.compile( "Changed paths?:\n", re.MULTILINE)
-	cpath_match = cpath_re.match( s)
-	if cpath_match:
-		s = s[ cpath_match.end():]
-		dir_re = re.compile( "\s+([MAD])\s+/?(.*?)$", re.MULTILINE)
-		while True:
-			m_dir = dir_re.match( s)
-			if m_dir == None:
-				break
-			cdirs.append( m_dir.group(2))
-			s = s[ m_dir.end(2):]
-		s = s[2:]
-
-	# parse commit comment
-	line_re = re.compile( ".*?$", re.MULTILINE)
-	idx = 0
-	while linecnt > 0:
-		linecnt -= 1
-		m_line = line_re.match(s,idx+1)
-		if m_line == None:
-			break
-		idx = m_line.end()
-	comment = s[:idx]
-	s = s[idx+2:]
-	return (s,Revision( revnum, author, comment, cdirs))
+	return all_revs
 
 
 def revs2info( htmlname, all_revs, svnurl, revmin, revmax):
 	"""Create a HTML file with infos about revision range and its referenced issues"""
 	# emit html header to the info file
-	htmlfile = open( htmlname, "wb")
+	htmlfile = codecs.open( htmlname, "wb", encoding='utf-8')
 	branchname = svnurl.split("/")[-1]
-	header = "<html><title>Annotated Log for r%d..r%d</title>\n" % (revmin, revmax)
+	header = "<html><head><meta charset=\"utf-8\"></head>\n"
+	header += "<title>Annotated Log for r%d..r%d</title>\n" % (revmin, revmax)
 	header += "<body><h1>Revisions %d..%d from <a href=\"%s\">%s</a></h1>\n" % (revmin, revmax, svnurl, branchname)
 	htmlfile.write( header)
 
@@ -156,7 +107,7 @@ def revs2info( htmlname, all_revs, svnur
 		if rev.issue:
 			if not rev.issue in bugid_map:
 				bugid_map[ rev.issue] = []
-			bugid_map[ rev.issue].append( rev.revnum)
+			bugid_map[ rev.issue].append( rev)
 		else:
 			other_revs.append( rev.revnum)
 
@@ -197,15 +148,16 @@ def revs2info( htmlname, all_revs, svnur
 			line += "<td>%s</td>" % (bug_type)
 			line += "<td>"
 			for r in bugid_map[ idnum]:
-				revurl = revurl_base % (r)
-				line += "<a href=\"%s\">c</a>" % (revurl)
+				revurl = revurl_base % (r.revnum)
+				revtitle = r.log.splitlines()[0]
+				line += "<a href=%s title=\"%s\">c</a>" % (revurl, quoteattr(revtitle))
 			line += "</td>"
 			line += "<td>%s</td>" % (bug_target)
 			line += "<td>%s</td>" % (bug_status)
 			line += "<td>"
 			if color:
 				line += "<font color=\"%s\">" % (color)
-			line += "%s" % (bug_desc.encode('utf-8', 'xmlcharrefreplace'))
+			line += escape( bug_desc)
 			if color:
 				line += "</font>"
 			line += "<td>"
@@ -224,7 +176,7 @@ def revs2info( htmlname, all_revs, svnur
 			revurl = revurl_base % (rev.revnum)
 			line += "<td><a href=\"%s\">r%d</a></td>" % (revurl, rev.revnum)
 			summary = rev.log.splitlines()[0]
-			line += "<td>%s</td>" % (summary.encode('utf-8'))
+			line += "<td>%s</td>" % (escape(summary))
 			line += "</tr>\n"
 			htmlfile.write( line)
 
@@ -248,7 +200,7 @@ def main(args):
 
 	svnurl = "http://svn.apache.org/repos/asf/openoffice/%s" % (branchname)
 	svnout = get_svn_log( svnurl, revmin, revmax)
-	revlist = parse_svn_log( svnout)
+	revlist = parse_svn_log_xml( svnout)
 	revs2info( infoout_name, revlist, svnurl, revmin, revmax)