using python dom implementation for hglog

This commit is contained in:
Sebastian Sdorra
2012-02-09 21:47:14 +01:00
parent f1ab1a70d7
commit b25d876f4e

View File

@@ -29,7 +29,8 @@
# #
# #
# import basic packages
# import basic modules
import sys, os import sys, os
# create python path # create python path
@@ -40,139 +41,148 @@ if len(pythonPath) > 0:
for i in range(len(pathParts)): for i in range(len(pathParts)):
sys.path.insert(i, pathParts[i]) sys.path.insert(i, pathParts[i])
# import mercurial packages # import mercurial modules
from mercurial import hg, ui, commands from mercurial import hg, ui, commands
from mercurial.node import hex from mercurial.node import hex
from xml.sax.saxutils import escape from xml.dom.minidom import Document
import datetime, time
# header # util methods
def printHeader(total): def openRepository():
print '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' repositoryPath = os.environ['SCM_REPOSITORY_PATH']
print '<changeset-paging>' return hg.repository(ui.ui(), path = repositoryPath)
print ' <total>' + str(total) + '</total>'
print ' <changesets>'
# changeset def writeXml(doc):
def printChangeset(repo, ctx): # print doc.toprettyxml(indent=" ")
print doc.toxml()
def createChildNode(doc, parentNode, name):
node = doc.createElement(name)
parentNode.appendChild(node)
return node
def appendValue(doc, node, value):
textNode = doc.createTextNode(value)
node.appendChild(textNode)
def appendTextNode(doc, parentNode, name, value):
node = createChildNode(doc, parentNode, name)
appendValue(doc, node, value)
def appendListNodes(doc, parentNode, name, values):
if values:
for value in values:
appendTextNode(doc, parentNode, name, value)
def appendWrappedListNodes(doc, parentNode, wrapperName, name, values):
if values:
wrapperNode = createChildNode(doc, parentNode, wrapperName)
appendListNodes(doc, wrapperNode, name, values)
# changeset methods
def getId(ctx):
return str(ctx.rev()) + ':' + hex(ctx.node()[:6])
def appendIdNode(doc, parentNode, ctx):
id = getId(ctx)
appendTextNode(doc, parentNode, 'id', id)
def appendParentNodes(doc, parentNode, ctx):
parents = ctx.parents()
if parents:
for parent in parents:
parentId = getId(parent)
appendTextNode(doc, parentNode, 'parents', parentId)
def appendDateNode(doc, parentNode, ctx):
time = int(ctx.date()[0]) * 1000 time = int(ctx.date()[0]) * 1000
branch = ctx.branch() date = str(time).split('.')[0]
tags = ctx.tags() appendTextNode(doc, parentNode, 'date', date)
status = repo.status(ctx.p1().node(), ctx.node())
mods = status[0] def appendAuthorNodes(doc, parentNode, ctx):
added = status[1]
deleted = status[2]
authorName = ctx.user() authorName = ctx.user()
authorMail = None authorMail = None
parents = ctx.parents()
if authorName: if authorName:
authorNode = createChildNode(doc, parentNode, 'author')
s = authorName.find('<') s = authorName.find('<')
e = authorName.find('>') e = authorName.find('>')
if s > 0 and e > 0: if s > 0 and e > 0:
authorMail = authorName[s + 1:e].strip() authorMail = authorName[s + 1:e].strip()
authorName = authorName[0:s].strip() authorName = authorName[0:s].strip()
appendTextNode(doc, authorNode, 'mail', authorMail)
print ' <changeset>' appendTextNode(doc, authorNode, 'name', authorName)
print ' <id>' + str(ctx.rev()) + ':' + hex(ctx.node()[:6]) + '</id>'
if parents:
for parent in parents:
print ' <parents>' + str(parent.rev()) + ':' + hex(parent.node()[:6]) + '</parents>'
print ' <author>' + escape(ctx.user()) + '</author>'
print ' <description>' + escape(ctx.description().encode('UTF-8')) + '</description>'
print ' <date>' + str(time).split('.')[0] + '</date>'
# author def appendBranchesNode(doc, parentNode, ctx):
if authorName: branch = ctx.branch()
print ' <author>'
print ' <name>' + authorName + '</name>'
if authorMail:
print ' <mail>' + authorMail + '</mail>'
print ' </author>'
# branches
if branch != 'default': if branch != 'default':
print ' <branches>' + branch + '</branches>' appendTextNode(doc, parentNode, 'branches', branch)
# tags def appendModifications(doc, parentNode, ctx):
if tags: status = repo.status(ctx.p1().node(), ctx.node())
for t in tags: if status:
print ' <tags>' + t + '</tags>' modificationsNode = createChildNode(doc, parentNode, 'modifications')
appendWrappedListNodes(doc, modificationsNode, 'added', 'file', status[1])
appendWrappedListNodes(doc, modificationsNode, 'modified', 'file', status[0])
appendWrappedListNodes(doc, modificationsNode, 'removed', 'file', status[2])
# modifications def appendChangesetNode(doc, parentNode, ctx):
print ' <modifications>' changesetNode = createChildNode(doc, parentNode, 'changeset')
appendIdNode(doc, changesetNode, ctx)
appendParentNodes(doc, changesetNode, ctx)
appendTextNode(doc, changesetNode, 'description', ctx.description())
appendDateNode(doc, changesetNode, ctx)
appendAuthorNodes(doc, changesetNode, ctx)
appendBranchesNode(doc, changesetNode, ctx)
appendListNodes(doc, changesetNode, 'tags', ctx.tags())
appendModifications(doc, changesetNode, ctx)
# files added # changeset methods end
if added:
print ' <added>'
for add in added:
print ' <file>' + add + '</file>'
print ' </added>'
# files modified # change log methods
if mods:
print ' <modified>'
for mod in mods:
print ' <file>' + mod + '</file>'
print ' </modified>'
# files deleted def createBasicNodes(doc, ctxs):
if deleted: rootNode = doc.createElement('changeset-paging')
print ' <removed>' doc.appendChild(rootNode)
for dele in deleted: total = str(len(repo))
print ' <file>' + dele + '</file>' appendTextNode(doc, rootNode, 'total', total)
print ' </removed>' return createChildNode(doc, rootNode, 'changesets')
print ' </modifications>' def appendChangesetsForPath(doc, repo, rev, path):
print ' </changeset>'
# footer
def printFooter():
print ' </changesets>'
print '</changeset-paging>'
def printChangesetsForPath(repo, rev, path):
if len(rev) <= 0: if len(rev) <= 0:
rev = "tip" rev = "tip"
fctxs = repo[rev].filectx(path) fctxs = repo[rev].filectx(path)
maxRev = fctxs.rev() maxRev = fctxs.rev()
revs = [] revs = []
for i in fctxs.filelog(): for i in fctxs.filelog():
fctx = fctxs.filectx(i) fctx = fctxs.filectx(i)
if fctx.rev() <= maxRev: if fctx.rev() <= maxRev:
revs.append(fctx.changectx()) revs.append(fctx.changectx())
# reverse changesets # reverse changesets
revs.reverse() revs.reverse()
total = len(revs)
# handle paging # handle paging
start = os.environ['SCM_PAGE_START'] start = os.environ['SCM_PAGE_START']
limit = os.environ['SCM_PAGE_LIMIT'] limit = os.environ['SCM_PAGE_LIMIT']
if len(start) > 0: if len(start) > 0:
revs = revs[int(start):] revs = revs[int(start):]
if len(limit) > 0: if len(limit) > 0:
revs = revs[:int(limit)] revs = revs[:int(limit)]
# output # output
printHeader(total) changesets = createBasicNodes(doc, revs)
for ctx in revs: for ctx in revs:
printChangeset(repo, ctx) appendChangesetNode(doc, changesets, ctx)
printFooter()
def printChangesetsForStartAndEnd(repo, startRev, endRev): def appendChangesetsForStartAndEnd(doc, repo, startRev, endRev):
printHeader(len(repo)) changesets = createBasicNodes(doc, repo)
for i in range(endRev, startRev, -1): for i in range(endRev, startRev, -1):
printChangeset(repo, repo[i]) appendChangesetNode(doc, changesets, repo[i])
printFooter()
repositoryPath = os.environ['SCM_REPOSITORY_PATH'] # change log methods
repo = hg.repository(ui.ui(), path = repositoryPath)
# main method
repo = openRepository()
doc = Document()
path = os.environ['SCM_PATH'] path = os.environ['SCM_PATH']
startNode = os.environ['SCM_REVISION_START'] startNode = os.environ['SCM_REVISION_START']
@@ -180,11 +190,11 @@ endNode = os.environ['SCM_REVISION_END']
rev = os.environ['SCM_REVISION'] rev = os.environ['SCM_REVISION']
if len(path) > 0: if len(path) > 0:
printChangesetsForPath(repo, rev, path) appendChangesetsForPath(doc, repo, rev, path)
elif len(rev) > 0: elif len(rev) > 0:
ctx = repo[rev] ctx = repo[rev]
print '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' changesets = createBasicNodes(doc, repo)
printChangeset(repo, ctx) appendChangesetNode(doc, changesets, repo, ctx)
else: else:
if len(startNode) > 0 and len(endNode) > 0: if len(startNode) > 0 and len(endNode) > 0:
# start and end revision # start and end revision
@@ -194,18 +204,15 @@ else:
# paging # paging
start = os.environ['SCM_PAGE_START'] start = os.environ['SCM_PAGE_START']
limit = os.environ['SCM_PAGE_LIMIT'] limit = os.environ['SCM_PAGE_LIMIT']
limit = int(limit) limit = int(limit)
end = int(start) end = int(start)
endRev = len(repo) - end - 1 endRev = len(repo) - end - 1
startRev = endRev - limit startRev = endRev - limit
# fix negative start revisions # fix negative start revisions
if startRev < -1: if startRev < -1:
startRev = -1 startRev = -1
# print # print
printChangesetsForStartAndEnd(repo, startRev, endRev) appendChangesetsForStartAndEnd(doc, repo, startRev, endRev)
# write document
writeXml(doc)