Edgewall Software

TracImport: jira2trac.rb

File jira2trac.rb, 2.0 KB (added by jan.szumiec@…, 9 years ago)

JIRA-to-Trac conversion script (uses JIRA's RSS feeds) by Jan Szumiec

Line 
1# jira2trac.rb
2# by Jan Szumiec <jan.szumiec@infiniteloop.eu>
3
4require 'rexml/document'
5require 'date'
6require 'sqlite3'
7
8if ARGV.size < 2
9 puts "Usage: jira2trac.rb <input RSS feed (XML)> <trac sqlite database filename>"
10 exit
11end
12
13class String
14 def quote
15 "'#{gsub(/'/, "''")}'"
16 end
17end
18
19class Numeric
20 alias quote inspect
21end
22
23class NilClass
24 def quote
25 "NULL"
26 end
27end
28
29class JIRAFeedConverter
30 Ticket = Struct.new(:id, :type, :time, :changetime, :component, :severity, :priority, :owner, :reporter, :cc, :version, :milestone, :status, :resolution, :summary, :description, :keywords)
31 class Ticket
32 def to_sql
33 columns = []; values = []
34 each_pair do |k,v|
35 columns << k
36 values << v.quote
37 end
38 "(#{columns.join(',')}) VALUES (#{values.join(',')})"
39 end
40 end
41
42 def initialize(input, output)
43 @document = REXML::Document.new(File.new(input))
44 @database = SQLite3::Database.new(output)
45 end
46
47 def process
48 @database.transaction do
49 @document.elements.each("/rss/channel/item") do |item|
50 t = Ticket.new
51 t.id, t.summary = parse_jira_title(item.elements["title"].text)
52 t.type = item.elements["type"].text
53 t.time = DateTime.parse(item.elements["created"].text).strftime("%s").to_i
54 t.changetime = DateTime.parse(item.elements["updated"].text).strftime("%s").to_i
55 t.component = item.elements["component"].text if item.elements["component"]
56 t.severity = t.priority = item.elements["priority"].text
57 t.reporter = item.elements["reporter"].text
58 t.owner = item.elements["assignee"].text
59 t.status = item.elements["status"].text
60 t.resolution = item.elements["resolution"].text
61 t.description = item.elements["description"].text
62 @database.execute("INSERT INTO ticket #{t.to_sql}")
63 end
64 end
65 end
66
67 def parse_jira_title(title)
68 identifier, title = title.split(/ /, 2)
69 _, identifier = identifier[1..-2].split(/-/, 2)
70 return identifier.to_i, title
71 end
72end
73
74JIRAFeedConverter.new(ARGV[0], ARGV[1]).process