ghtorrent 0.8.1 → 0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 964930d19ab5d35f6c70cafe72c8abf0e682ac87
4
- data.tar.gz: 7bda9c3d934ab7c3d292587991dedc3f6e762cbc
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzBhZTlkNGYxYTc3ZTg4NzQ3OTQyMWQ3NTMxZGY1YzljYmE0MzIwZg==
5
+ data.tar.gz: !binary |-
6
+ NmE3OGNlNGY4Y2QzMGJkY2E3NWY0MTNhMTU2MDAyYTA3MDUzN2IzZQ==
5
7
  SHA512:
6
- metadata.gz: 591e92ae026990ba6a2f0dddfc32b47df8983b829d1b2d675f6fe9fde977fc063cce322649e7c3b05398bc891568c6ab11117c253a4f19ff7edc6a9aa1045129
7
- data.tar.gz: f4ba04030bdec8a390dc800e676fbb1dfd2c6f0efc26ce4696f8b2e14a0ed3c1a7975f98c1e670fbaa89c8e3b5e0c8e96d171e88cf9a70dea6b99a71a28d351b
8
+ metadata.gz: !binary |-
9
+ MTkwZWQwNmQ2MjE1OTU5ZWQ5NWRmZWFhYjY4ZGM3NTA5ZmY2ZDcyMTI0OGZj
10
+ ZGY0MDczZGFmYTZlZTEyYmMxYWI4YTU5ODQyZGFmM2YwZmNhODljMDZmMWJk
11
+ ZThiYWQ5OGUxMmI3Yjg1Nzk1MjBkZTFiNzkxZmE1NTAzNGFmNzM=
12
+ data.tar.gz: !binary |-
13
+ MmJiODg3NmU2OTdjZTA2Njc0MmFmZWRhM2JkZjA4NjY5OTRiZTJhOTEzZGJk
14
+ NmJhN2JkNGFjODdhZDk0YWY4MDIzY2NkODU5MDhjZDQxNjA4NzU0ZWFkYmMx
15
+ ZDE2Y2U3NzQ0ZDAxN2YxNmNjZDRiZTUzMDQ5OWY5OWY3ZDc3Yjc=
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ = Version 0.9
2
+ * Remove dependency to EventMachine-based AMQP client. We now use bunny.
3
+
1
4
  = Version 0.8.1
2
5
  * New tool to retrieve specific entities and their dependencies
3
6
  * New tool to retrieve repositories en masse
@@ -2,8 +2,8 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  ghtorrent (0.8.1)
5
- amqp (~> 1.1.0)
6
5
  bson_ext (~> 1.9.0)
6
+ bunny (~> 1.0.0)
7
7
  mongo (~> 1.9.0)
8
8
  sequel (~> 4.5.0)
9
9
  trollop (~> 2.0.0)
@@ -12,17 +12,15 @@ GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
14
  addressable (2.3.5)
15
- amq-protocol (1.9.0)
16
- amqp (1.1.7)
17
- amq-protocol (>= 1.9.0)
18
- eventmachine
15
+ amq-protocol (1.9.2)
19
16
  bson (1.9.2)
20
17
  bson_ext (1.9.2)
21
18
  bson (~> 1.9.2)
19
+ bunny (1.0.7)
20
+ amq-protocol (>= 1.9.2)
22
21
  crack (0.4.1)
23
22
  safe_yaml (~> 0.9.0)
24
23
  diff-lcs (1.2.5)
25
- eventmachine (1.0.3)
26
24
  mongo (1.9.2)
27
25
  bson (~> 1.9.2)
28
26
  rspec (2.14.1)
data/README.md CHANGED
@@ -8,7 +8,7 @@ checking out this repository.
8
8
  GHTorrent can be used for a variety of purposes, such as:
9
9
 
10
10
  * Mirror the Github API event stream and follow links from events to actual data
11
- to gradually build a [Github index](http://ghtorrent.org/dblite/)
11
+ to gradually build a [Github index](http://ghtorrent.org/)
12
12
  * Create a queriable metadata index for a specific repository
13
13
  * Query the Github API using intelligent caching to avoid duplicate queries
14
14
 
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'trollop'
3
- require 'daemons'
3
+ require 'bunny'
4
4
  require 'etc'
5
5
 
6
6
  require 'ghtorrent/settings'
@@ -135,6 +135,67 @@ Standard options:
135
135
  def go
136
136
  end
137
137
 
138
+ # Specify a handler to incoming messages from a connection to
139
+ # a queue.
140
+ # [queue]: The queue name to bind to
141
+ # [ack]: :before or :after when should acks be send, before or after
142
+ # the block returns
143
+ # [block]: A block with one argument (the message)
144
+ def queue_client(queue, ack = :after, block)
145
+
146
+ stopped = false
147
+ while not stopped
148
+ begin
149
+ conn = Bunny.new(:host => config(:amqp_host),
150
+ :port => config(:amqp_port),
151
+ :username => config(:amqp_username),
152
+ :password => config(:amqp_password))
153
+ conn.start
154
+
155
+ ch = conn.create_channel
156
+ debug "Setting prefetch to #{config(:amqp_prefetch)}"
157
+ ch.prefetch(config(:amqp_prefetch))
158
+ debug "Connection to #{config(:amqp_host)} succeded"
159
+
160
+ x = ch.topic(config(:amqp_exchange), :durable => true,
161
+ :auto_delete => false)
162
+ q = ch.queue(queue, :durable => true)
163
+ q.bind(x)
164
+
165
+ q.subscribe(:block => true,
166
+ :ack => true) do |delivery_info, properties, msg|
167
+
168
+ if ack == :before
169
+ ch.acknowledge(delivery_info.delivery_tag, false)
170
+ end
171
+
172
+ begin
173
+ block.call(msg)
174
+ ensure
175
+ ch.acknowledge(delivery_info.delivery_tag, false)
176
+ end
177
+ end
178
+
179
+ rescue Bunny::TCPConnectionFailed => e
180
+ warn "Connection to #{config(:amqp_host)} failed. Retrying in 1 sec"
181
+ sleep(1)
182
+ rescue Bunny::PossibleAuthenticationFailureError => e
183
+ warn "Could not authenticate as #{conn.username}"
184
+ rescue Bunny::NotFound, Bunny::AccessRefused, Bunny::PreconditionFailed => e
185
+ warn "Channel error: #{e}. Retrying in 1 sec"
186
+ sleep(1)
187
+ rescue Interrupt => _
188
+ stopped = true
189
+ rescue Exception => e
190
+ raise e
191
+ end
192
+ end
193
+
194
+ ch.close unless ch.nil?
195
+ conn.close unless conn.nil?
196
+
197
+ end
198
+
138
199
  def override_config(config_file, setting, new_value)
139
200
  puts "Overriding configuration #{setting}=#{config(setting)} with cmd line #{new_value}"
140
201
  merge_config_values(config_file, {setting => new_value})
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
- require 'amqp'
2
+ require 'bunny'
3
3
  require 'json'
4
- require 'pp'
5
4
 
6
5
  require 'ghtorrent/ghtorrent'
7
6
  require 'ghtorrent/settings'
@@ -158,67 +157,75 @@ Retrieves events from queues and processes them through GHTorrent
158
157
  }
159
158
  end
160
159
 
161
- # Graceful exit
162
- Signal.trap('INT') {
163
- info "GHTDataRetrieval: Received SIGINT, exiting"
164
- AMQP.stop { EM.stop }
165
- }
166
-
167
- Signal.trap('TERM') {
168
- info "GHTDataRetrieval: Received SIGTERM, exiting"
169
- AMQP.stop { EM.stop }
170
- }
171
-
172
- AMQP.start(:host => config(:amqp_host),
173
- :port => config(:amqp_port),
174
- :username => config(:amqp_username),
175
- :password => config(:amqp_password)) do |connection|
176
-
177
- channel = AMQP::Channel.new(connection)
178
- channel.prefetch(config(:amqp_prefetch))
179
- exchange = channel.topic(config(:amqp_exchange), :durable => true,
180
- :auto_delete => false)
181
-
182
- handlers.each { |h|
183
- queue = channel.queue("#{h}s", {:durable => true})\
184
- .bind(exchange, :routing_key => "evt.#{h}")
185
-
186
- info "GHTDataRetrieval: Binding handler #{h} to routing key evt.#{h}"
187
-
188
- queue.subscribe(:ack => true) do |headers, msg|
189
- begin
190
-
191
- event = persister.get_underlying_connection[:events].find_one('id' => msg)
192
- event.delete '_id'
193
- data = parse(event.to_json)
194
- info "GHTDataRetrieval: Processing event: #{data['type']}-#{data['id']}"
195
-
196
- unless options[:filter].nil?
197
- if filter.include?(data['repo']['name'])
198
- send(h, data)
199
- else
200
- info "GHTDataRetrieval: Repo #{data['repo']['name']} not in process list. Ignoring event #{data['type']}-#{data['id']}"
201
- end
202
- else
160
+
161
+ conn = Bunny.new(:host => config(:amqp_host),
162
+ :port => config(:amqp_port),
163
+ :username => config(:amqp_username),
164
+ :password => config(:amqp_password))
165
+ conn.start
166
+
167
+ channel = conn.create_channel
168
+ debug "Setting prefetch to #{config(:amqp_prefetch)}"
169
+ channel.prefetch(config(:amqp_prefetch))
170
+ debug "Connection to #{config(:amqp_host)} succeded"
171
+
172
+ exchange = channel.topic(config(:amqp_exchange), :durable => true,
173
+ :auto_delete => false)
174
+
175
+ handlers.each do |h|
176
+ queue = channel.queue("#{h}s", {:durable => true})\
177
+ .bind(exchange, :routing_key => "evt.#{h}")
178
+
179
+ info "GHTDataRetrieval: Binding handler #{h} to routing key evt.#{h}"
180
+
181
+ queue.subscribe(:ack => true) do |headers, properties, msg|
182
+ begin
183
+
184
+ event = persister.get_underlying_connection[:events].find_one('id' => msg)
185
+ event.delete '_id'
186
+ data = parse(event.to_json)
187
+ info "GHTDataRetrieval: Processing event: #{data['type']}-#{data['id']}"
188
+
189
+ unless options[:filter].nil?
190
+ if filter.include?(data['repo']['name'])
203
191
  send(h, data)
204
- end
205
- headers.ack
206
- info "GHTDataRetrieval: Processed event: #{data['type']}-#{data['id']}"
207
- rescue Exception => e
208
- # Give a message a chance to be reprocessed
209
- if headers.redelivered?
210
- warn "GHTDataRetrieval: Could not process event: #{msg}"
211
- headers.reject(:requeue => false)
212
192
  else
213
- headers.reject(:requeue => true)
193
+ info "GHTDataRetrieval: Repo #{data['repo']['name']} not in process list. Ignoring event #{data['type']}-#{data['id']}"
214
194
  end
215
-
216
- STDERR.puts e
217
- STDERR.puts e.backtrace.join("\n")
195
+ else
196
+ send(h, data)
197
+ end
198
+ channel.acknowledge(headers.delivery_tag, false)
199
+ info "GHTDataRetrieval: Processed event: #{data['type']}-#{data['id']}"
200
+ rescue Exception => e
201
+ # Give a message a chance to be reprocessed
202
+ if headers.redelivered?
203
+ warn "GHTDataRetrieval: Could not process event: #{msg}"
204
+ channel.reject(headers.delivery_tag, false)
205
+ else
206
+ channel.reject(headers.delivery_tag, true)
218
207
  end
208
+
209
+ STDERR.puts e
210
+ STDERR.puts e.backtrace.join("\n")
219
211
  end
220
- }
212
+ end
221
213
  end
214
+
215
+ stopped = false
216
+ while not stopped
217
+ begin
218
+ sleep(1)
219
+ rescue Interrupt => _
220
+ debug 'Exit requested'
221
+ stopped = true
222
+ end
223
+ end
224
+
225
+ debug 'Closing AMQP connection'
226
+ channel.close unless channel.nil?
227
+ conn.close unless conn.nil?
228
+
222
229
  end
223
230
  end
224
231
 
@@ -1,8 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'mongo'
3
- require 'amqp'
4
- require 'eventmachine'
5
3
  require 'pp'
4
+ require 'bunny'
6
5
 
7
6
  require 'ghtorrent/settings'
8
7
  require 'ghtorrent/logging'
@@ -36,8 +35,6 @@ Loads object ids from a collection to a queue for further processing.
36
35
  :type => :int
37
36
  options.opt :number, 'Total number of items to load',
38
37
  :short => 'n', :type => :int, :default => 2**48
39
- options.opt :batch, 'Number of items to process in a batch',
40
- :short => 'b', :type => :int, :default => 10000
41
38
  options.opt :filter,
42
39
  'Filter items by regexp on item attributes: item.attr=regexp',
43
40
  :short => 'f', :type => String, :multi => true
@@ -62,16 +59,10 @@ Loads object ids from a collection to a queue for further processing.
62
59
  # Num events read
63
60
  total_read = 0
64
61
 
65
- puts "Loading items after #{Time.at(options[:earliest])}" if options[:verbose]
66
- puts "Loading items before #{Time.at(options[:latest])}" if options[:verbose]
67
- puts "Loading #{options[:batch]} items per batch" if options[:batch]
62
+ puts "Loading events after #{Time.at(options[:earliest])}" if options[:verbose]
63
+ puts "Loading events before #{Time.at(options[:latest])}" if options[:verbose]
68
64
  puts "Loading #{options[:number]} items" if options[:verbose]
69
65
 
70
- if options[:batch] >= options[:number]
71
- puts "Batch > number of items, setting batch to #{options[:number]}"
72
- options[:batch] = options[:number]
73
- end
74
-
75
66
  what = case
76
67
  when options[:filter].is_a?(Array)
77
68
  options[:filter].reduce({}) { |acc,x|
@@ -90,60 +81,43 @@ Loads object ids from a collection to a queue for further processing.
90
81
 
91
82
  (puts 'Mongo filter:'; pp what.merge(from)) if options[:verbose]
92
83
 
93
- AMQP.start(:host => config(:amqp_host),
94
- :port => config(:amqp_port),
95
- :username => config(:amqp_username),
96
- :password => config(:amqp_password)) do |connection|
84
+ conn = Bunny.new(:host => config(:amqp_host),
85
+ :port => config(:amqp_port),
86
+ :username => config(:amqp_username),
87
+ :password => config(:amqp_password))
88
+ conn.start
97
89
 
98
- channel = AMQP::Channel.new(connection)
99
- exchange = channel.topic(config(:amqp_exchange),
100
- :durable => true, :auto_delete => false)
90
+ channel = conn.create_channel
91
+ puts "Connection to #{config(:amqp_host)} succeded"
101
92
 
102
- # What to do when the user hits Ctrl+c
103
- show_stopper = Proc.new {
104
- puts('Closing connection')
105
- connection.close { EventMachine.stop }
106
- }
93
+ exchange = channel.topic(config(:amqp_exchange),
94
+ :durable => true, :auto_delete => false)
107
95
 
108
- # Read next options[:batch] items and queue them
109
- read_and_publish = Proc.new {
110
- num_read = 0
96
+ stopped = false
97
+ while not stopped
98
+ begin
111
99
  persister.get_underlying_connection[:events].find(what.merge(from),
112
- :snapshot => true,
113
- :skip => total_read,
114
- :limit => options[:batch]).each do |e|
100
+ :snapshot => true).each do |e|
115
101
  unq = read_value(e, 'type')
116
102
  if unq.class != String or unq.nil? then
117
- throw Exception.new('Unique value can only be a String')
103
+ raise Exception.new('Unique value can only be a String')
118
104
  end
119
105
 
120
106
  exchange.publish e['id'], :persistent => false,
121
107
  :routing_key => "evt.#{e['type']}"
122
108
 
123
- num_read += 1
124
109
  total_read += 1
125
- puts "Publish id = #{e['id']} (#{num_read} read, #{total_read} total)" if options.verbose
126
- end
110
+ puts "Publish id = #{e['id']} (#{total_read} read)" if options.verbose
127
111
 
128
- if total_read >= options[:number] or num_read == 0
129
- puts 'Finished reading, exiting'
130
- show_stopper.call
131
- else
132
- # Schedule new event processing cycle
133
- EventMachine.next_tick do
134
- read_and_publish.call
112
+ if total_read >= options[:number]
113
+ puts 'Finished reading, exiting'
114
+ break
135
115
  end
136
116
  end
137
- }
138
-
139
- # Signal handlers
140
- Signal.trap('INT', show_stopper)
141
- Signal.trap('TERM', show_stopper)
142
-
143
- EventMachine.add_timer(0.1) do
144
- read_and_publish.call
117
+ rescue Interrupt
118
+ puts 'Interrupted'
119
+ stopped = true
145
120
  end
146
-
147
121
  end
148
122
  end
149
123
 
@@ -1,9 +1,7 @@
1
- require 'rubygems'
2
1
  require 'yaml'
3
- require 'amqp'
4
- require 'eventmachine'
5
2
  require 'json'
6
3
  require 'logger'
4
+ require 'bunny'
7
5
 
8
6
  require 'ghtorrent/api_client'
9
7
  require 'ghtorrent/settings'
@@ -53,11 +51,10 @@ class GHTMirrorEvents < GHTorrent::Command
53
51
  (new1, dupl1, stored1) = store_count events
54
52
  stored = stored | stored1
55
53
  new = new + new1
56
- new
57
54
  end
58
55
 
59
56
  stored.each do |e|
60
- key = "evt.%s" % e['type']
57
+ key = "evt.#{e['type']}"
61
58
  exchange.publish e['id'], :persistent => true, :routing_key => key
62
59
  end
63
60
  return new, dupl
@@ -71,46 +68,37 @@ class GHTMirrorEvents < GHTorrent::Command
71
68
  @persister = connect(:mongo, @settings)
72
69
  @logger = Logger.new(STDOUT)
73
70
 
74
- # Graceful exit
75
- Signal.trap('INT') {
76
- info "Received SIGINT, exiting"
77
- AMQP.stop { EM.stop }
78
- }
79
- Signal.trap('TERM') {
80
- info "Received SIGTERM, exiting"
81
- AMQP.stop { EM.stop }
82
- }
71
+ conn = Bunny.new(:host => config(:amqp_host),
72
+ :port => config(:amqp_port),
73
+ :username => config(:amqp_username),
74
+ :password => config(:amqp_password))
75
+ conn.start
83
76
 
84
- # The event loop
85
- AMQP.start(:host => config(:amqp_host),
86
- :port => config(:amqp_port),
87
- :username => config(:amqp_username),
88
- :password => config(:amqp_password)) do |connection|
77
+ ch = conn.create_channel
78
+ @logger.debug "Connection to #{config(:amqp_host)} succeded"
89
79
 
90
- # Statistics used to recalibrate event delays
91
- dupl_msgs = new_msgs = 1
80
+ exchange = ch.topic(config(:amqp_exchange), :durable => true,
81
+ :auto_delete => false)
92
82
 
93
- debug "connected to rabbit"
94
-
95
- channel = AMQP::Channel.new(connection)
96
- exchange = channel.topic(config(:amqp_exchange), :durable => true,
97
- :auto_delete => false)
98
-
99
- # Retrieve events
100
- EventMachine.add_periodic_timer(5) do
83
+ dupl_msgs = new_msgs = loops = 0
84
+ stopped = false
85
+ while not stopped
86
+ begin
101
87
  (new, dupl) = retrieve exchange
102
88
  dupl_msgs += dupl
103
89
  new_msgs += new
104
- end
105
-
106
- # Adjust event retrieval delay time to reduce load to Github
107
- EventMachine.add_periodic_timer(12) do
108
- ratio = (dupl_msgs.to_f / (dupl_msgs + new_msgs).to_f)
109
-
110
- info("Stats: #{new_msgs} new, #{dupl_msgs} duplicate, ratio: #{ratio}")
111
-
112
- # Reset counters for new loop
113
- dupl_msgs = new_msgs = 0
90
+ loops += 1
91
+ sleep(5)
92
+
93
+ if loops >= 12 # One minute
94
+ ratio = (dupl_msgs.to_f / (dupl_msgs + new_msgs).to_f)
95
+ info("Stats: #{new_msgs} new, #{dupl_msgs} duplicate, ratio: #{ratio}")
96
+ dupl_msgs = new_msgs = loops = 0
97
+ end
98
+ rescue Interrupt
99
+ stopped = true
100
+ rescue Exception => e
101
+ @logger.error e
114
102
  end
115
103
  end
116
104
  end
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'amqp'
3
2
  require 'json'
4
3
  require 'pp'
5
4
 
@@ -3,6 +3,8 @@ require 'ghtorrent/settings'
3
3
  require 'ghtorrent/logging'
4
4
  require 'ghtorrent/command'
5
5
  require 'ghtorrent/retriever'
6
+ require "bunny"
7
+
6
8
 
7
9
  class GHTRetrieveRepos < GHTorrent::Command
8
10
 
@@ -67,7 +69,7 @@ Values in the config.yaml file set with the -c command are overriden.
67
69
  retriever.stop
68
70
  }
69
71
 
70
- retriever.run
72
+ retriever.run(self)
71
73
  exit
72
74
  else
73
75
  debug "Parent #{Process.pid} forked child #{pid}"
@@ -122,80 +124,45 @@ class GHTRepoRetriever
122
124
  @config
123
125
  end
124
126
 
125
- def run
126
- AMQP.start(:host => config(:amqp_host),
127
- :port => config(:amqp_port),
128
- :username => config(:amqp_username),
129
- :password => config(:amqp_password)) do |connection|
127
+ def run(command)
128
+
129
+ processor = Proc.new do |msg|
130
+ owner, repo = msg.split(/ /)
131
+ user_entry = ght.transaction { ght.ensure_user(owner, false, false) }
130
132
 
131
- connection.on_tcp_connection_loss do |conn, settings|
132
- warn 'AMQP: Network failure. Trying to reconnect...'
133
- conn.reconnect(false, 2)
133
+ if user_entry.nil?
134
+ warn("Cannot find user #{owner}")
135
+ next
134
136
  end
135
137
 
136
- channel = AMQP::Channel.new(connection)
137
- channel.auto_recovery = true
138
- channel.prefetch(1)
138
+ repo_entry = ght.transaction { ght.ensure_repo(owner, repo) }
139
139
 
140
- channel.on_error do |ch, channel_close|
141
- warn 'AMQP: Channel closed. Should reconnect by itself'
142
- raise channel_close.reply_text
140
+ if repo_entry.nil?
141
+ warn("Cannot find repository #{owner}/#{repo}")
142
+ next
143
143
  end
144
144
 
145
- exchange = channel.topic(config(:amqp_exchange), :durable => true,
146
- :auto_delete => false)
145
+ debug("Retrieving repo #{owner}/#{repo}")
147
146
 
148
- queue = channel.queue(@queue, {:durable => true}).bind(exchange)
149
-
150
- queue.subscribe(:ack => true) do |headers, msg|
151
- owner,repo = msg.split(/ /)
152
- user_entry = ght.transaction { ght.ensure_user(owner, false, false) }
147
+ def send_message(function, user, repo)
148
+ ght.send(function, user, repo, refresh = false)
149
+ end
153
150
 
154
- if user_entry.nil?
155
- warn("Cannot find user #{owner}")
156
- headers.ack
157
- next
158
- end
151
+ functions = %w(ensure_commits ensure_forks ensure_pull_requests
152
+ ensure_issues ensure_project_members ensure_watchers ensure_labels)
159
153
 
160
- repo_entry = ght.transaction { ght.ensure_repo(owner, repo) }
154
+ functions.each do |x|
161
155
 
162
- if repo_entry.nil?
163
- warn("Cannot find repository #{owner}/#{repo}")
164
- headers.ack
156
+ begin
157
+ send_message(x, owner, repo)
158
+ rescue Exception
159
+ warn("Error processing #{x} for #{owner}/#{repo}")
165
160
  next
166
161
  end
167
-
168
- debug("Retrieving repo #{owner}/#{repo}")
169
- def send_message(function, user, repo)
170
- ght.send(function, user, repo, refresh = false)
171
- end
172
-
173
- functions = %w(ensure_commits ensure_forks ensure_pull_requests
174
- ensure_issues ensure_project_members ensure_watchers ensure_labels)
175
-
176
- functions.each do |x|
177
-
178
- begin
179
- send_message(x, owner, repo)
180
- rescue Interrupt
181
- stop
182
- rescue Exception
183
- warn("Error processing #{x} for #{owner}/#{repo}")
184
- next
185
- end
186
-
187
- if @stop
188
- break
189
- end
190
- end
191
-
192
- headers.ack
193
- debug("Finished processing #{owner}/#{repo}")
194
- if @stop
195
- connection.disconnect{AMQP.stop { EM.stop }}
196
- end
197
162
  end
198
163
  end
164
+
165
+ command.queue_client(@queue, :before, processor)
199
166
  end
200
167
 
201
168
  def stop
@@ -1,5 +1,5 @@
1
1
  module GHTorrent
2
2
 
3
- VERSION = '0.8.1'
3
+ VERSION = '0.9'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghtorrent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: '0.9'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georgios Gousios
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-17 00:00:00.000000000 Z
12
+ date: 2014-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: amqp
15
+ name: mongo
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - ~>
19
19
  - !ruby/object:Gem::Version
20
- version: 1.1.0
20
+ version: 1.9.0
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ~>
26
26
  - !ruby/object:Gem::Version
27
- version: 1.1.0
27
+ version: 1.9.0
28
28
  - !ruby/object:Gem::Dependency
29
- name: mongo
29
+ name: bson_ext
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ~>
@@ -40,47 +40,47 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  version: 1.9.0
42
42
  - !ruby/object:Gem::Dependency
43
- name: bson_ext
43
+ name: trollop
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ~>
47
47
  - !ruby/object:Gem::Version
48
- version: 1.9.0
48
+ version: 2.0.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - ~>
54
54
  - !ruby/object:Gem::Version
55
- version: 1.9.0
55
+ version: 2.0.0
56
56
  - !ruby/object:Gem::Dependency
57
- name: trollop
57
+ name: sequel
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 2.0.0
62
+ version: 4.5.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 2.0.0
69
+ version: 4.5.0
70
70
  - !ruby/object:Gem::Dependency
71
- name: sequel
71
+ name: bunny
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ~>
75
75
  - !ruby/object:Gem::Version
76
- version: 4.5.0
76
+ version: 1.0.0
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - ~>
82
82
  - !ruby/object:Gem::Version
83
- version: 4.5.0
83
+ version: 1.0.0
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rspec
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -109,9 +109,8 @@ dependencies:
109
109
  - - ~>
110
110
  - !ruby/object:Gem::Version
111
111
  version: '1.16'
112
- description: |-
113
- A library and a collection of associated programs
114
- to mirror and process Github data
112
+ description: ! "A library and a collection of associated programs\n to
113
+ mirror and process Github data"
115
114
  email: gousiosg@gmail.com
116
115
  executables:
117
116
  - ght-data-retrieval
@@ -125,7 +124,6 @@ executables:
125
124
  extensions: []
126
125
  extra_rdoc_files: []
127
126
  files:
128
- - lib/ghtorrent.rb
129
127
  - lib/ghtorrent/adapters/base_adapter.rb
130
128
  - lib/ghtorrent/adapters/mongo_persister.rb
131
129
  - lib/ghtorrent/adapters/noop_persister.rb
@@ -169,6 +167,7 @@ files:
169
167
  - lib/ghtorrent/time.rb
170
168
  - lib/ghtorrent/transacted_ghtorrent.rb
171
169
  - lib/ghtorrent/utils.rb
170
+ - lib/ghtorrent.rb
172
171
  - lib/version.rb
173
172
  - bin/ght-data-retrieval
174
173
  - bin/ght-get-more-commits
@@ -184,8 +183,8 @@ files:
184
183
  - Gemfile
185
184
  - Gemfile.lock
186
185
  - LICENSE
187
- - README.md
188
186
  - Rakefile
187
+ - README.md
189
188
  - spec/api_client_spec.rb
190
189
  - spec/spec_helper.rb
191
190
  homepage: https://github.com/gousiosg/github-mirror
@@ -198,17 +197,17 @@ require_paths:
198
197
  - lib
199
198
  required_ruby_version: !ruby/object:Gem::Requirement
200
199
  requirements:
201
- - - '>='
200
+ - - ! '>='
202
201
  - !ruby/object:Gem::Version
203
202
  version: '0'
204
203
  required_rubygems_version: !ruby/object:Gem::Requirement
205
204
  requirements:
206
- - - '>='
205
+ - - ! '>='
207
206
  - !ruby/object:Gem::Version
208
207
  version: '0'
209
208
  requirements: []
210
209
  rubyforge_project:
211
- rubygems_version: 2.0.3
210
+ rubygems_version: 2.1.3
212
211
  signing_key:
213
212
  specification_version: 4
214
213
  summary: Mirror and process Github data