#!/usr/bin/python # vim: set fileencoding=utf-8 : """ * Copyright (c) 2007 by Paweł Niewiadomski (Atlassian Pty Ltd) * Copyright (c) 2009 by Tobias Richter (Diamond Light Source Ltd) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of the names of the contributors nor their * organisations may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPY RIGHT HOLDERS ''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 COPY RIGHT HOLDERS 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. """ import sys import re import time import commands import urllib from trac.env import open_environment from trac.ticket.model import * from trac.ticket.query import Query from trac.web.href import Href reload(sys) sys.setdefaultencoding( "utf-8" ) usermap = { 'randomguy' : 'newname', } components=[] milestones=[] class DummyHref: def ticket(self, id): return id class DummyRef: def __init__(self): self.href=DummyHref() def mapUser(user, default=""): # here you have to specify your own code to map between Trac user and Jira user (maybe it can be transfered intact or using LDAP, AD, etc.) # .... if user == "": return default if (user == None): return default if user.find("@") > 0: user = user[0:user.find("@")] if usermap.has_key(user): user = usermap[user] return user def escape(str): str = str.replace("&", "&").replace('"', '"').replace("<", "<").replace(">", ">").replace("$", "$").replace("*", "*") str = str.replace("{","[").replace("}", "]").replace("[[[", "{noformat}").replace("]]]", "{noformat}").replace("+", "+").replace("", " ").replace(" ", "\n").replace("", " ") return str.encode('iso8859-1', 'xmlcharrefreplace') def mapIssueType(type): type = type.capitalize(); if type == "Enhancement": return "Improvement" elif type == "Defect": return "Bug" elif type == "Task": return "Task" sys.stderr.write("Fallback to Bug for "+type+"\n") return "Bug" def mapPriority(p): #if p == "major" or p == "minor" or p == "normal" or p == "trivial" or p == "critical": #return p.capitalize(); p = p.capitalize(); if p == "Highest": return "Critical" if p == "Blocker": return "Critical" if p == "High": return "Major" if p == "Critical": return "Major" if p == "Medium": return "Normal" if p == "Normal": return "Normal" if p == "Major": return "Normal" if p == "Minor": return "Minor" if p == "Low": return "Minor" if p == "Trivial": return "Trivial" if p == "Lowest": return "Trivial" sys.stderr.write("Fallback to normal priority for "+p+"\n") return "Normal" def mapResolution(r): if r == "wontfix": return "Won't Fix" elif r == "duplicate": return "Duplicate" elif r == "invalid": return "Incomplete" elif r == "worksforme": return "Cannot Reproduce" return "Fixed" summaries = {} def processTicket(env,id,owner): global summaries ticket = Ticket(env, id) # safeguard against deleted Milestones/Components that still exist in old Tickets # these are safe to use even if they exist createMilestone(ticket["milestone"]) createComponent(ticket["component"],"",owner) print '' state = "open" if ticket["status"] == "closed": state = "closed" print '' for ch in ticket.get_changelog(): if ch[2] == "comment" and ch[4] != "": print '' elif ch[2] == "resolution": if state == "closed": print '' print '' state = "closed" elif ch[2] == "attachment": try: print '' except KeyError: print '' def createComponent(name, desc, user): if name in components: return if name != "": print '' components.append(name) def createMilestone(name): if name in milestones: return if name != "": print '' milestones.append(name) def main(): sys.stderr.write("Running "+sys.argv[0]+"..\n") env = open_environment(sys.argv[1]) env.projkey=sys.argv[2] owner = sys.argv[3] ref = DummyRef() print '' print '' print '' print ''' ''' for c in Component(env).select(env): createComponent(c.name,c.description,c.owner) for v in Version(env).select(env): createMilestone(v.name) tickets=[] query = Query(env) query.max = sys.maxint for t in query.execute(ref): tickets.append(int(t["id"])) tickets.sort() for t in tickets: processTicket(env, t, owner) print '' print '' if __name__ == "__main__": main()