gitlab-fogbugz 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,105 @@
1
+ require "uri"
2
+ require "rexml/document"
3
+ require "rexml/xpath"
4
+ require "cgi"
5
+
6
+ class FogbugzService
7
+ class FogbugzError < RuntimeError; end
8
+ class ClientOutOfDate < FogbugzError; end
9
+ class BadXml < FogbugzError; end
10
+ class BadCredentials < FogbugzError; end
11
+
12
+ attr_reader :root_uri, :api_uri
13
+
14
+ def initialize(root, curl, token=nil)
15
+ @root_uri = root.respond_to?(:scheme) ? root : URI.parse(root)
16
+ @curl = curl
17
+ @token = token
18
+ end
19
+
20
+ def validate!
21
+ document = get(@root_uri.merge("api.xml"))
22
+ raise BadXml, "Did not find the expected root response element. Instead, I found:\n#{document.root}" unless document.root.name == "response"
23
+
24
+ minversion = REXML::XPath.first(document.root, "//minversion/text()").to_s
25
+ raise ClientOutOfDate, "This client expected to find a minversion <= 3 in the api.xml file. Instead it found #{minversion.inspect}" unless minversion.to_i <= 3
26
+
27
+ relative_path = REXML::XPath.first(document.root, "//url/text()")
28
+ @api_uri = @root_uri.merge(relative_path.to_s)
29
+ end
30
+
31
+ def connect
32
+ validate!
33
+ yield self
34
+ end
35
+
36
+ def logon(email, password)
37
+ params = {"cmd" => "logon", "email" => email, "password" => password}
38
+ document = get(@api_uri, params)
39
+ bad_logon = REXML::XPath.first(document.root, "//error")
40
+ raise BadCredentials, "Bad credentials supplied to Fogbugz: #{bad_logon}" if bad_logon
41
+ REXML::XPath.first(document.root, "//token/text()").to_s
42
+ end
43
+
44
+ def implement(data)
45
+ tell_fogbugz(:resolve, data, STATES[:implemented])
46
+ end
47
+
48
+ def fix(data)
49
+ tell_fogbugz(:resolve, data, STATES[:fixed])
50
+ end
51
+
52
+ def complete(data)
53
+ tell_fogbugz(:resolve, data, STATES[:completed])
54
+ end
55
+
56
+ def close(data)
57
+ tell_fogbugz(:close, data)
58
+ end
59
+
60
+ def append_message(data)
61
+ tell_fogbugz(:edit, data)
62
+ end
63
+
64
+ def invalid(data)
65
+ # TODO: This silently ignores any bug id reference (#1234) without a
66
+ # predicate; however I currently don't consider it a good idea to treat this
67
+ # transparently as :reference
68
+ end
69
+
70
+ def reopen(data)
71
+ tell_fogbugz(:reopen, data)
72
+ end
73
+
74
+ def resolve(data)
75
+ tell_fogbugz(:resolve, data)
76
+ end
77
+
78
+ protected
79
+ # Returns an REXML::Document to the specified URI
80
+ def get(uri, params=nil)
81
+ cmd = if params then
82
+ query = params.map {|k, v| "#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}"}.join("&")
83
+ "#{@curl} --data '#{query}' --silent '#{uri.to_s}'"
84
+ else
85
+ "#{@curl} --silent '#{uri.to_s}'"
86
+ end
87
+
88
+ puts cmd
89
+ data = `#{cmd}`
90
+ begin
91
+ REXML::Document.new(data)
92
+ rescue REXML::ParseException
93
+ raise BadXml, "Could not parse response data:\n#{data}"
94
+ end
95
+ end
96
+
97
+ def tell_fogbugz(operation, data, status=nil)
98
+ params = {"cmd" => operation.to_s, "ixBug" => data[:case], "sEvent" => data[:message],
99
+ "token" => @token}
100
+ params["ixStatus"] = status if status
101
+ get(@api_uri, params)
102
+ end
103
+
104
+ STATES = {:fixed => 2, :completed => 15, :implemented => 8}
105
+ end
@@ -0,0 +1,513 @@
1
+
2
+ # line 1 "lib/message_parser_machine.rb"
3
+ class MessageParser
4
+
5
+ # line 28 "lib/message_parser_machine.rb"
6
+
7
+
8
+
9
+ # line 10 "lib/message_parser.rb"
10
+ class << self
11
+ attr_accessor :_message_parser_machine_actions
12
+ private :_message_parser_machine_actions, :_message_parser_machine_actions=
13
+ end
14
+ self._message_parser_machine_actions = [
15
+ 0, 1, 0, 1, 1, 1, 2, 1,
16
+ 3, 1, 4, 1, 5, 1, 6, 1,
17
+ 7, 1, 8, 1, 9, 1, 10, 1,
18
+ 11, 1, 12, 1, 13, 1, 14, 1,
19
+ 15, 1, 16, 1, 17, 1, 18, 1,
20
+ 19, 1, 20, 1, 21
21
+ ]
22
+
23
+ class << self
24
+ attr_accessor :_message_parser_machine_key_offsets
25
+ private :_message_parser_machine_key_offsets, :_message_parser_machine_key_offsets=
26
+ end
27
+ self._message_parser_machine_key_offsets = [
28
+ 0, 2, 8, 10, 12, 14, 16, 18,
29
+ 20, 22, 24, 26, 28, 30, 32, 36,
30
+ 38, 40, 42, 44, 46, 48, 50, 58,
31
+ 64, 66, 68, 70, 72, 74, 76, 78,
32
+ 80, 82, 84, 86, 88, 90, 103, 105,
33
+ 107, 109, 110, 114, 116, 118, 120, 122,
34
+ 124, 126, 128, 130, 132, 134
35
+ ]
36
+
37
+ class << self
38
+ attr_accessor :_message_parser_machine_trans_keys
39
+ private :_message_parser_machine_trans_keys, :_message_parser_machine_trans_keys=
40
+ end
41
+ self._message_parser_machine_trans_keys = [
42
+ 71, 103, 73, 83, 90, 105, 115, 122,
43
+ 68, 100, 73, 105, 79, 111, 83, 115,
44
+ 69, 101, 77, 109, 80, 112, 76, 108,
45
+ 69, 101, 84, 116, 69, 101, 88, 120,
46
+ 68, 83, 100, 115, 80, 112, 76, 108,
47
+ 69, 101, 77, 109, 69, 101, 78, 110,
48
+ 84, 116, 70, 73, 79, 83, 102, 105,
49
+ 111, 115, 69, 73, 83, 101, 105, 115,
50
+ 82, 114, 69, 101, 78, 110, 67, 99,
51
+ 69, 101, 77, 109, 80, 112, 69, 101,
52
+ 78, 110, 79, 111, 76, 108, 86, 118,
53
+ 69, 101, 35, 66, 67, 70, 73, 82,
54
+ 83, 98, 99, 102, 105, 114, 115, 49,
55
+ 57, 48, 57, 85, 117, 58, 76, 79,
56
+ 108, 111, 83, 115, 83, 115, 73, 105,
57
+ 69, 101, 77, 109, 83, 115, 69, 101,
58
+ 83, 115, 83, 115, 83, 115, 79, 111,
59
+ 0
60
+ ]
61
+
62
+ class << self
63
+ attr_accessor :_message_parser_machine_single_lengths
64
+ private :_message_parser_machine_single_lengths, :_message_parser_machine_single_lengths=
65
+ end
66
+ self._message_parser_machine_single_lengths = [
67
+ 2, 6, 2, 2, 2, 2, 2, 2,
68
+ 2, 2, 2, 2, 2, 2, 4, 2,
69
+ 2, 2, 2, 2, 2, 2, 8, 6,
70
+ 2, 2, 2, 2, 2, 2, 2, 2,
71
+ 2, 2, 2, 2, 2, 13, 0, 0,
72
+ 2, 1, 4, 2, 2, 2, 2, 2,
73
+ 2, 2, 2, 2, 2, 2
74
+ ]
75
+
76
+ class << self
77
+ attr_accessor :_message_parser_machine_range_lengths
78
+ private :_message_parser_machine_range_lengths, :_message_parser_machine_range_lengths=
79
+ end
80
+ self._message_parser_machine_range_lengths = [
81
+ 0, 0, 0, 0, 0, 0, 0, 0,
82
+ 0, 0, 0, 0, 0, 0, 0, 0,
83
+ 0, 0, 0, 0, 0, 0, 0, 0,
84
+ 0, 0, 0, 0, 0, 0, 0, 0,
85
+ 0, 0, 0, 0, 0, 0, 1, 1,
86
+ 0, 0, 0, 0, 0, 0, 0, 0,
87
+ 0, 0, 0, 0, 0, 0
88
+ ]
89
+
90
+ class << self
91
+ attr_accessor :_message_parser_machine_index_offsets
92
+ private :_message_parser_machine_index_offsets, :_message_parser_machine_index_offsets=
93
+ end
94
+ self._message_parser_machine_index_offsets = [
95
+ 0, 3, 10, 13, 16, 19, 22, 25,
96
+ 28, 31, 34, 37, 40, 43, 46, 51,
97
+ 54, 57, 60, 63, 66, 69, 72, 81,
98
+ 88, 91, 94, 97, 100, 103, 106, 109,
99
+ 112, 115, 118, 121, 124, 127, 141, 143,
100
+ 145, 148, 150, 155, 158, 161, 164, 167,
101
+ 170, 173, 176, 179, 182, 185
102
+ ]
103
+
104
+ class << self
105
+ attr_accessor :_message_parser_machine_indicies
106
+ private :_message_parser_machine_indicies, :_message_parser_machine_indicies=
107
+ end
108
+ self._message_parser_machine_indicies = [
109
+ 1, 1, 0, 2, 3, 3, 2, 3,
110
+ 3, 0, 4, 4, 0, 2, 2, 0,
111
+ 5, 5, 0, 6, 6, 0, 7, 7,
112
+ 0, 8, 8, 0, 9, 9, 0, 10,
113
+ 10, 0, 11, 11, 0, 12, 12, 0,
114
+ 13, 13, 0, 14, 14, 0, 16, 16,
115
+ 16, 16, 15, 17, 17, 0, 18, 18,
116
+ 0, 19, 19, 0, 20, 20, 0, 21,
117
+ 21, 0, 22, 22, 0, 23, 23, 0,
118
+ 24, 25, 26, 27, 24, 25, 26, 27,
119
+ 0, 28, 29, 30, 28, 29, 30, 0,
120
+ 31, 31, 0, 32, 32, 0, 33, 33,
121
+ 0, 34, 34, 0, 35, 35, 0, 36,
122
+ 36, 0, 37, 37, 0, 38, 38, 0,
123
+ 39, 39, 0, 40, 40, 0, 41, 41,
124
+ 0, 42, 42, 0, 43, 43, 0, 45,
125
+ 46, 47, 48, 49, 50, 51, 46, 47,
126
+ 48, 49, 50, 51, 44, 53, 52, 53,
127
+ 54, 55, 55, 52, 30, 56, 57, 58,
128
+ 57, 58, 52, 60, 60, 59, 62, 62,
129
+ 61, 29, 29, 52, 64, 64, 63, 36,
130
+ 36, 52, 66, 66, 65, 67, 67, 52,
131
+ 30, 30, 56, 69, 69, 68, 71, 71,
132
+ 70, 40, 40, 52, 0
133
+ ]
134
+
135
+ class << self
136
+ attr_accessor :_message_parser_machine_trans_targs
137
+ private :_message_parser_machine_trans_targs, :_message_parser_machine_trans_targs=
138
+ end
139
+ self._message_parser_machine_trans_targs = [
140
+ 37, 1, 2, 3, 41, 5, 6, 43,
141
+ 8, 9, 10, 11, 12, 44, 46, 37,
142
+ 37, 16, 17, 18, 19, 20, 21, 48,
143
+ 23, 29, 30, 33, 24, 13, 37, 25,
144
+ 26, 27, 28, 50, 15, 31, 32, 51,
145
+ 34, 35, 36, 52, 37, 38, 40, 42,
146
+ 45, 47, 49, 53, 37, 39, 37, 0,
147
+ 37, 4, 7, 37, 37, 37, 37, 37,
148
+ 14, 37, 37, 22, 37, 37, 37, 37
149
+ ]
150
+
151
+ class << self
152
+ attr_accessor :_message_parser_machine_trans_actions
153
+ private :_message_parser_machine_trans_actions, :_message_parser_machine_trans_actions=
154
+ end
155
+ self._message_parser_machine_trans_actions = [
156
+ 43, 0, 0, 0, 0, 0, 0, 0,
157
+ 0, 0, 0, 0, 0, 0, 5, 41,
158
+ 13, 0, 0, 0, 0, 0, 0, 0,
159
+ 0, 0, 0, 0, 0, 0, 11, 0,
160
+ 0, 0, 0, 0, 0, 0, 0, 0,
161
+ 0, 0, 0, 0, 21, 0, 5, 5,
162
+ 5, 5, 5, 5, 39, 0, 37, 0,
163
+ 27, 0, 0, 23, 7, 25, 9, 29,
164
+ 0, 33, 17, 0, 31, 15, 35, 19
165
+ ]
166
+
167
+ class << self
168
+ attr_accessor :_message_parser_machine_to_state_actions
169
+ private :_message_parser_machine_to_state_actions, :_message_parser_machine_to_state_actions=
170
+ end
171
+ self._message_parser_machine_to_state_actions = [
172
+ 0, 0, 0, 0, 0, 0, 0, 0,
173
+ 0, 0, 0, 0, 0, 0, 0, 0,
174
+ 0, 0, 0, 0, 0, 0, 0, 0,
175
+ 0, 0, 0, 0, 0, 0, 0, 0,
176
+ 0, 0, 0, 0, 0, 1, 0, 0,
177
+ 0, 0, 0, 0, 0, 0, 0, 0,
178
+ 0, 0, 0, 0, 0, 0
179
+ ]
180
+
181
+ class << self
182
+ attr_accessor :_message_parser_machine_from_state_actions
183
+ private :_message_parser_machine_from_state_actions, :_message_parser_machine_from_state_actions=
184
+ end
185
+ self._message_parser_machine_from_state_actions = [
186
+ 0, 0, 0, 0, 0, 0, 0, 0,
187
+ 0, 0, 0, 0, 0, 0, 0, 0,
188
+ 0, 0, 0, 0, 0, 0, 0, 0,
189
+ 0, 0, 0, 0, 0, 0, 0, 0,
190
+ 0, 0, 0, 0, 0, 3, 0, 0,
191
+ 0, 0, 0, 0, 0, 0, 0, 0,
192
+ 0, 0, 0, 0, 0, 0
193
+ ]
194
+
195
+ class << self
196
+ attr_accessor :_message_parser_machine_eof_trans
197
+ private :_message_parser_machine_eof_trans, :_message_parser_machine_eof_trans=
198
+ end
199
+ self._message_parser_machine_eof_trans = [
200
+ 1, 1, 1, 1, 1, 1, 1, 1,
201
+ 1, 1, 1, 1, 1, 1, 16, 1,
202
+ 1, 1, 1, 1, 1, 1, 1, 1,
203
+ 1, 1, 1, 1, 1, 1, 1, 1,
204
+ 1, 1, 1, 1, 1, 0, 53, 55,
205
+ 53, 57, 53, 60, 62, 53, 64, 53,
206
+ 66, 53, 57, 69, 71, 53
207
+ ]
208
+
209
+ class << self
210
+ attr_accessor :message_parser_machine_start
211
+ end
212
+ self.message_parser_machine_start = 37;
213
+ class << self
214
+ attr_accessor :message_parser_machine_first_final
215
+ end
216
+ self.message_parser_machine_first_final = 37;
217
+ class << self
218
+ attr_accessor :message_parser_machine_error
219
+ end
220
+ self.message_parser_machine_error = -1;
221
+
222
+ class << self
223
+ attr_accessor :message_parser_machine_en_main
224
+ end
225
+ self.message_parser_machine_en_main = 37;
226
+
227
+
228
+ # line 31 "lib/message_parser_machine.rb"
229
+
230
+ class << self
231
+ def parse(msg, listener)
232
+ data = msg.unpack("C*")
233
+ eof = data.length
234
+
235
+ bugid, action, name = nil
236
+
237
+
238
+ # line 239 "lib/message_parser.rb"
239
+ begin
240
+ p ||= 0
241
+ pe ||= data.length
242
+ cs = message_parser_machine_start
243
+ ts = nil
244
+ te = nil
245
+ act = 0
246
+ end
247
+
248
+ # line 40 "lib/message_parser_machine.rb"
249
+
250
+ # line 251 "lib/message_parser.rb"
251
+ begin
252
+ _klen, _trans, _keys, _acts, _nacts = nil
253
+ _goto_level = 0
254
+ _resume = 10
255
+ _eof_trans = 15
256
+ _again = 20
257
+ _test_eof = 30
258
+ _out = 40
259
+ while true
260
+ _trigger_goto = false
261
+ if _goto_level <= 0
262
+ if p == pe
263
+ _goto_level = _test_eof
264
+ next
265
+ end
266
+ end
267
+ if _goto_level <= _resume
268
+ _acts = _message_parser_machine_from_state_actions[cs]
269
+ _nacts = _message_parser_machine_actions[_acts]
270
+ _acts += 1
271
+ while _nacts > 0
272
+ _nacts -= 1
273
+ _acts += 1
274
+ case _message_parser_machine_actions[_acts - 1]
275
+ when 1 then
276
+ # line 1 "NONE"
277
+ begin
278
+ ts = p
279
+ end
280
+ # line 281 "lib/message_parser.rb"
281
+ end # from state action switch
282
+ end
283
+ if _trigger_goto
284
+ next
285
+ end
286
+ _keys = _message_parser_machine_key_offsets[cs]
287
+ _trans = _message_parser_machine_index_offsets[cs]
288
+ _klen = _message_parser_machine_single_lengths[cs]
289
+ _break_match = false
290
+
291
+ begin
292
+ if _klen > 0
293
+ _lower = _keys
294
+ _upper = _keys + _klen - 1
295
+
296
+ loop do
297
+ break if _upper < _lower
298
+ _mid = _lower + ( (_upper - _lower) >> 1 )
299
+
300
+ if data[p] < _message_parser_machine_trans_keys[_mid]
301
+ _upper = _mid - 1
302
+ elsif data[p] > _message_parser_machine_trans_keys[_mid]
303
+ _lower = _mid + 1
304
+ else
305
+ _trans += (_mid - _keys)
306
+ _break_match = true
307
+ break
308
+ end
309
+ end # loop
310
+ break if _break_match
311
+ _keys += _klen
312
+ _trans += _klen
313
+ end
314
+ _klen = _message_parser_machine_range_lengths[cs]
315
+ if _klen > 0
316
+ _lower = _keys
317
+ _upper = _keys + (_klen << 1) - 2
318
+ loop do
319
+ break if _upper < _lower
320
+ _mid = _lower + (((_upper-_lower) >> 1) & ~1)
321
+ if data[p] < _message_parser_machine_trans_keys[_mid]
322
+ _upper = _mid - 2
323
+ elsif data[p] > _message_parser_machine_trans_keys[_mid+1]
324
+ _lower = _mid + 2
325
+ else
326
+ _trans += ((_mid - _keys) >> 1)
327
+ _break_match = true
328
+ break
329
+ end
330
+ end # loop
331
+ break if _break_match
332
+ _trans += _klen
333
+ end
334
+ end while false
335
+ _trans = _message_parser_machine_indicies[_trans]
336
+ end
337
+ if _goto_level <= _eof_trans
338
+ cs = _message_parser_machine_trans_targs[_trans]
339
+ if _message_parser_machine_trans_actions[_trans] != 0
340
+ _acts = _message_parser_machine_trans_actions[_trans]
341
+ _nacts = _message_parser_machine_actions[_acts]
342
+ _acts += 1
343
+ while _nacts > 0
344
+ _nacts -= 1
345
+ _acts += 1
346
+ case _message_parser_machine_actions[_acts - 1]
347
+ when 2 then
348
+ # line 1 "NONE"
349
+ begin
350
+ te = p+1
351
+ end
352
+ when 3 then
353
+ # line 18 "lib/message_parser_machine.rb"
354
+ begin
355
+ te = p+1
356
+ begin listener.close end
357
+ end
358
+ when 4 then
359
+ # line 19 "lib/message_parser_machine.rb"
360
+ begin
361
+ te = p+1
362
+ begin listener.complete end
363
+ end
364
+ when 5 then
365
+ # line 20 "lib/message_parser_machine.rb"
366
+ begin
367
+ te = p+1
368
+ begin listener.reference end
369
+ end
370
+ when 6 then
371
+ # line 21 "lib/message_parser_machine.rb"
372
+ begin
373
+ te = p+1
374
+ begin listener.fix end
375
+ end
376
+ when 7 then
377
+ # line 22 "lib/message_parser_machine.rb"
378
+ begin
379
+ te = p+1
380
+ begin listener.reopen end
381
+ end
382
+ when 8 then
383
+ # line 23 "lib/message_parser_machine.rb"
384
+ begin
385
+ te = p+1
386
+ begin listener.implement end
387
+ end
388
+ when 9 then
389
+ # line 24 "lib/message_parser_machine.rb"
390
+ begin
391
+ te = p+1
392
+ begin listener.resolve end
393
+ end
394
+ when 10 then
395
+ # line 26 "lib/message_parser_machine.rb"
396
+ begin
397
+ te = p+1
398
+ end
399
+ when 11 then
400
+ # line 18 "lib/message_parser_machine.rb"
401
+ begin
402
+ te = p
403
+ p = p - 1; begin listener.close end
404
+ end
405
+ when 12 then
406
+ # line 19 "lib/message_parser_machine.rb"
407
+ begin
408
+ te = p
409
+ p = p - 1; begin listener.complete end
410
+ end
411
+ when 13 then
412
+ # line 20 "lib/message_parser_machine.rb"
413
+ begin
414
+ te = p
415
+ p = p - 1; begin listener.reference end
416
+ end
417
+ when 14 then
418
+ # line 21 "lib/message_parser_machine.rb"
419
+ begin
420
+ te = p
421
+ p = p - 1; begin listener.fix end
422
+ end
423
+ when 15 then
424
+ # line 22 "lib/message_parser_machine.rb"
425
+ begin
426
+ te = p
427
+ p = p - 1; begin listener.reopen end
428
+ end
429
+ when 16 then
430
+ # line 23 "lib/message_parser_machine.rb"
431
+ begin
432
+ te = p
433
+ p = p - 1; begin listener.implement end
434
+ end
435
+ when 17 then
436
+ # line 24 "lib/message_parser_machine.rb"
437
+ begin
438
+ te = p
439
+ p = p - 1; begin listener.resolve end
440
+ end
441
+ when 18 then
442
+ # line 25 "lib/message_parser_machine.rb"
443
+ begin
444
+ te = p
445
+ p = p - 1; begin listener.case(data[ts+1...te].pack("C*")) end
446
+ end
447
+ when 19 then
448
+ # line 26 "lib/message_parser_machine.rb"
449
+ begin
450
+ te = p
451
+ p = p - 1; end
452
+ when 20 then
453
+ # line 21 "lib/message_parser_machine.rb"
454
+ begin
455
+ begin p = ((te))-1; end
456
+ begin listener.fix end
457
+ end
458
+ when 21 then
459
+ # line 26 "lib/message_parser_machine.rb"
460
+ begin
461
+ begin p = ((te))-1; end
462
+ end
463
+ # line 464 "lib/message_parser.rb"
464
+ end # action switch
465
+ end
466
+ end
467
+ if _trigger_goto
468
+ next
469
+ end
470
+ end
471
+ if _goto_level <= _again
472
+ _acts = _message_parser_machine_to_state_actions[cs]
473
+ _nacts = _message_parser_machine_actions[_acts]
474
+ _acts += 1
475
+ while _nacts > 0
476
+ _nacts -= 1
477
+ _acts += 1
478
+ case _message_parser_machine_actions[_acts - 1]
479
+ when 0 then
480
+ # line 1 "NONE"
481
+ begin
482
+ ts = nil; end
483
+ # line 484 "lib/message_parser.rb"
484
+ end # to state action switch
485
+ end
486
+ if _trigger_goto
487
+ next
488
+ end
489
+ p += 1
490
+ if p != pe
491
+ _goto_level = _resume
492
+ next
493
+ end
494
+ end
495
+ if _goto_level <= _test_eof
496
+ if p == eof
497
+ if _message_parser_machine_eof_trans[cs] > 0
498
+ _trans = _message_parser_machine_eof_trans[cs] - 1;
499
+ _goto_level = _eof_trans
500
+ next;
501
+ end
502
+ end
503
+ end
504
+ if _goto_level <= _out
505
+ break
506
+ end
507
+ end
508
+ end
509
+
510
+ # line 41 "lib/message_parser_machine.rb"
511
+ end
512
+ end
513
+ end
@@ -0,0 +1,43 @@
1
+ class MessageParser
2
+ %%{
3
+ machine message_parser_machine;
4
+
5
+ bugid = ('#' [1-9] [0-9]*);
6
+
7
+ closes = (/close/i ([sS])?);
8
+ completes = (/complete/i ([sS])?);
9
+ references = (/reference/i ([sS])?);
10
+ refs = (/refs/i);
11
+ bugzid = (/bug/i ([zZsS])? /id/i ([:])?);
12
+ fixes = ((/re/i)? /fix/i (/ed/i | (/es/i))?);
13
+ reopens = (/reopen/i ([sS])?);
14
+ implements = ((/re/i)? /implement/i ([sS])?);
15
+ resolves = ((/re/i)? /solve/i ([sS])?);
16
+ keywords = (closes | completes | references | refs | fixes | reopens | implements | bugzid | resolves);
17
+ main := |*
18
+ (closes) => { listener.close };
19
+ (completes) => { listener.complete };
20
+ (references|bugzid|refs) => { listener.reference };
21
+ (fixes) => { listener.fix };
22
+ (reopens) => { listener.reopen };
23
+ (implements) => { listener.implement };
24
+ (resolves) => { listener.resolve };
25
+ (bugid) => { listener.case(data[ts+1...te].pack("C*")) };
26
+ (any - (bugid | keywords));
27
+ *|;
28
+ }%%
29
+
30
+ %%write data;
31
+
32
+ class << self
33
+ def parse(msg, listener)
34
+ data = msg.unpack("C*")
35
+ eof = data.length
36
+
37
+ bugid, action, name = nil
38
+
39
+ %%write init;
40
+ %%write exec;
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+ require 'net/http'
2
+ require 'cgi'
3
+
4
+
5
+ url = URI.parse('http://localhost:4567/repo_url')
6
+ req = Net::HTTP::Get.new(url.path)
7
+ req.set_form_data(:type => "diff", :repo => "cvs", :file => "filename.rb", :r1 => "123", :r2 => "124")
8
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
9
+
10
+
11
+ req.set_form_data(:type => "log", :repo => "gitlab-fbtest", :file => "4.7/filename.rb", :r1 => "123", :r2 => "124")
12
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
@@ -0,0 +1,33 @@
1
+ require 'net/http'
2
+
3
+ payload = %Q{
4
+ {"commits":
5
+ { "a72c48d7335486b50b29ef31bb3f694febb9cc62":
6
+ { "removed":["ghook.rb"],
7
+ "author":{"name":"John Reilly","email":"jr@trms.com"},
8
+ "added":[".gitignore","config.yml.example","github-fogbugz.rb"],
9
+ "timestamp":"2008-04-23T12:46:10-07:00",
10
+ "modified":[],
11
+ "message":"bugzid: 3083 slight refactoring",
12
+ "url":"http:\/\/github.com\/johnreilly\/fbtest\/commit\/a72c48d7335486b50b29ef31bb3f694febb9cc62"},
13
+ "ae0b864ad73325c4e8f5c195cd9a9a33cd73e46b":
14
+ { "removed":[],
15
+ "author":{"name":"John Reilly","email":"jr@trms.com"},
16
+ "added":["github-fogbugz-test.rb"],
17
+ "timestamp":"2008-04-23T13:30:12-07:00",
18
+ "modified":["github-fogbugz.rb"],
19
+ "message":"bugzid: 3083 adding some tests",
20
+ "url":"http:\/\/github.com\/johnreilly\/fbtest\/commit\/ae0b864ad73325c4e8f5c195cd9a9a33cd73e46b"}},
21
+ "after":"ae0b864ad73325c4e8f5c195cd9a9a33cd73e46b",
22
+ "before":"6254706d8facde1191f2a96e27200f6057ccc14e",
23
+ "ref":"refs\/heads\/master",
24
+ "repository":
25
+ { "name":"fbtest",
26
+ "owner":{"name":"johnreilly","email":"jr@trms.com"},
27
+ "url":"http:\/\/github.com\/johnreilly\/fbtest"}}}
28
+
29
+ url = URI.parse('http://localhost:4567/')
30
+ req = Net::HTTP::Post.new(url.path)
31
+ req.set_form_data({'payload' => payload})
32
+ res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
33
+ puts res