-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathredmine_to_unfuddle.rb
135 lines (127 loc) · 3.6 KB
/
redmine_to_unfuddle.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env ruby
require 'fastercsv'
require 'yaml'
require 'curb'
require 'active_support'
class String
def xml_escape
gsub(/[&<>'"]/) do |char|
case char
when '&' then '&'
when '<' then '<'
when '>' then '>'
when "'" then '''
when '"' then '"e;'
end
end
end
end
class UnfuddleTicket
def initialize(redmine_ticket)
@config = YAML.load_file "unfuddle.yml"
@redmine = redmine_ticket.to_hash
@unfuddle = {}
@redmine.map do |k,v|
self[k] = v
end
@curl = Curl::Easy.new
@curl.userpwd = "#{@config[:username]}:#{@config[:password]}"
end
def post
@curl.headers['Content-type'] = @curl.headers['Accept'] = 'application/xml'
@curl.url = "http#{@config[:ssl?] ? 's' : ''}://#{@config[:subdomain]}.unfuddle.com/api/v1/projects/#{@config[:project_id]}/tickets"
@curl.http_post self.to_xml
if @curl.response_code == 201
puts "Created ticket #{self['summary']}"
else
warn "Failed to create ticket #{self['summary']}"
end
end
def [](key)
@unfuddle[key]
end
def []=(key,value)
case key
when '#'
@unfuddle["field1-value"] = value
# I added "RedMine #" as a custom field due to http://unfuddle.com/community/forums/6/topics/624
when 'Status'
case value
when "New"
@unfuddle['status'], @unfuddle['resolution'] = 'new',''
when "Blocked"
@unfuddle['status'], @unfuddle['resolution'] = 'resolved','postponed'
when "Duplicate"
@unfuddle['status'], @unfuddle['resolution'] = 'resolved','duplicate'
when "Won't Fix"
@unfuddle['status'], @unfuddle['resolution'] = 'resolved','duplicate'
when "Works For Me"
@unfuddle['status'], @unfuddle['resolution'] = 'resolved','works_for_me'
when "Resolved"
@unfuddle['status'], @unfuddle['resolution'] = 'resolved','fixed'
when "Delivered"
@unfuddle['status'], @unfuddle['resolution'] = 'closed','fixed'
when "In Progress"
@unfuddle['status'], @unfuddle['resolution'] = 'accepted',''
else
raise UnrecognizedRedmineStatus, "Unrecognized redmine status: #{value}"
end
when 'Project'
nil # Do nothing
when 'Tracker'
nil
when 'Priority'
case value
when "Urgent"
@unfuddle['priority'] = '4'
when "High"
@unfuddle['priority'] = '3'
when "Normal"
@unfuddle['priority'] = '2'
when "Immediate"
@unfuddle['priority'] = '5'
when "Low"
@unfuddle['priority'] = '1'
else
raise UnrecognizedRedminePriority, "Unrecognized redmine priority: #{value}"
end
when 'Subject'
@unfuddle['summary'] = value.xml_escape
when 'Assigned to'
nil # Unfuddle is looking for assignee-ids, too much effort and it no longer matters
when 'Category'
nil # No data in dump
when 'Target version'
nil
when 'Author'
nil
when 'Start'
nil
when 'Due date'
@unfuddle['due-on'] = value
when '% Done'
nil
when 'Estimated time'
nil
when 'Created'
nil # Read-only field in unfuddle
when 'Updated'
nil # Don't care
when 'Description'
@unfuddle['description'] = value.xml_escape
else
raise UnrecognizedRedmineField, "Unrecognized redmine field: #{key}"
end
end
def to_xml
@unfuddle.to_xml(:root => :ticket, :skip_instruct => true)
end
end
if ARGV.empty?
puts "USAGE: #{__FILE__} redmine_dump.csv"
exit
else
FCSV.foreach("#{ARGV.shift}", :headers => true) do |ticket|
UnfuddleTicket.new(ticket).post
end
end