# # Copyright (c) 2010, Sebastian Sdorra # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # 3. Neither the name of SCM-Manager; nor the names of its # contributors may be used to endorse or promote products derived from this # software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # http://bitbucket.org/sdorra/scm-manager # # import sys, os pythonPath = os.environ['SCM_PYTHON_PATH'] if len(pythonPath) > 0: pathParts = pythonPath.split(os.pathsep) for i in range(len(pathParts)): sys.path.insert(i, pathParts[i]) from mercurial import hg, ui, commands from mercurial.node import hex from xml.sax.saxutils import escape import datetime, time repositoryPath = os.environ['SCM_REPOSITORY_PATH'] repo = hg.repository(ui.ui(), path = repositoryPath) startNode = os.environ['SCM_REVISION_START'] endNode = os.environ['SCM_REVISION_END'] total = len(repo) if len(startNode) > 0 and len(endNode) > 0: # start and end revision startRev = repo[startNode].rev() -1 endRev = repo[endNode].rev() else: # paging start = os.environ['SCM_PAGE_START'] limit = os.environ['SCM_PAGE_LIMIT'] limit = int(limit) end = int(start) endRev = total - end - 1 startRev = endRev - limit # fix negative start revisions if startRev < -1: startRev = -1 # header print '' print '' print ' ' + str(total) + '' print ' ' # changesets for i in range(endRev, startRev, -1): ctx = repo[i] time = int(ctx.date()[0]) * 1000 branch = ctx.branch() tags = ctx.tags() status = repo.status(ctx.p1().node(), ctx.node()) mods = status[0] added = status[1] deleted = status[2] authorName = ctx.user(); authorMail = None if authorName: s = authorName.find('<') e = authorName.find('>') if s > 0 and e > 0: authorMail = authorName[s + 1:e].strip() authorName = authorName[0:s].strip() print ' ' print ' ' + str(i) + ':' + hex(ctx.node()[:6]) + '' print ' ' + escape(ctx.user()) + '' print ' ' + escape(ctx.description()) + '' print ' ' + str(time).split('.')[0] + '' # author if authorName: print ' ' print ' ' + authorName + '' if authorMail: print ' ' + authorMail + '' print ' ' # branches if branch != 'default': print ' ' + branch + '' # tags if tags: for t in tags: print ' ' + t + '' # modifications print ' ' # files added if added: print ' ' for add in added: print ' ' + add + '' print ' ' # files modified if mods: print ' ' for mod in mods: print ' ' + mod + '' print ' ' # files deleted if deleted: print ' ' for dele in deleted: print ' ' + dele + '' print ' ' print ' ' print ' ' # footer print ' ' print ''