openMSX-builder 1.4.2 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -60,7 +60,6 @@ Current list of tasks is:
60
60
 
61
61
  + Integrate with CIA.vc / Ruby-Rbot
62
62
  + Add tests
63
- + Refactor `#archive_for_revision` and `#dmg_for_revision` into a single method
64
63
  + Create a simple Sinatra App for [openMSX.FiXato.net][5]
65
64
  + Allow for automatic setup of the oAuth tokens.
66
65
  + Add documentation on the YAML configuration files.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.4.2
1
+ 1.5.1
@@ -38,12 +38,10 @@ class OpenmsxBuilder
38
38
  },
39
39
  }
40
40
 
41
- attr_accessor :type
41
+ attr_accessor :type,:build_outputs
42
42
  def initialize(options,type=:openmsx)
43
- @type = type
44
- @current_revision = `svnversion -n #{setting(:source_dir)}`.to_i
45
43
  @options = options
46
- @fails = 0
44
+ @type = type
47
45
  @log = Logger.new(STDOUT)
48
46
  @log.level = Logger::FATAL
49
47
  @log.level = Logger::ERROR if @options.include?('--log-errors')
@@ -51,6 +49,9 @@ class OpenmsxBuilder
51
49
  @log.level = Logger::INFO if @options.include?('--verbose')
52
50
  @log.level = Logger::DEBUG if @options.include?('--debug')
53
51
  @log.debug("Logger created with level #{@log.level}")
52
+ @current_revision = `svnversion -n #{setting(:source_dir)}`.to_i
53
+ @fails = 0
54
+ @build_outputs = []
54
55
  config
55
56
  rescue NotConfigured => e
56
57
  @log.fatal e.message
@@ -71,186 +72,176 @@ class OpenmsxBuilder
71
72
  end
72
73
  end
73
74
 
75
+ def publish_all
76
+ @log.info "Publishing all #{@type} builds found"
77
+ if openmsx?
78
+ regexp = /openmsx-.+-(\d+)-mac-univ-bin.dmg$/
79
+ elsif openmsx_debugger?
80
+ regexp = /openMSX-debugger-(\d+)-mac-x86.tbz$/
81
+ end
82
+ Dir.glob(filemask_for_revision('*')).sort.each do |file|
83
+ publish_revision($1,file) if file =~ regexp
84
+ end
85
+ nil
86
+ end
87
+
88
+ def publish_revision(revision,archive_name=nil)
89
+ if archive_name.nil?
90
+ if openmsx?
91
+ archive_name = Dir.glob(filemask_for_revision(revision)).first
92
+ elsif openmsx_debugger?
93
+ archive_name = filemask_for_revision(revision)
94
+ archive(File.join(setting(:source_dir),setting(:builds_subdir),'openMSX_Debugger.app'),File.basename(archive_name))
95
+ end
96
+ end
97
+
98
+ destination = File.join(setting(:publish_location),File.basename(archive_name))
99
+ @log.info "Publishing '#{archive_name}' to '#{destination}'."
100
+ @log.debug `scp -p "#{archive_name}" #{destination}`
101
+
102
+ return nil unless @options.include?('--tweet')
103
+ url = File.join(setting(:site_path),File.basename(archive_name))
104
+ message = "[#{setting(:nice_name)}] Revision #{revision} is now available:\r\n #{url}"
105
+ tweetmsx.update(message)
106
+ rescue TweetMsx::NotConfigured => e
107
+ @log.error e.message
108
+ end
109
+
74
110
  def setting(key)
75
111
  config[:projects][type][key]
76
112
  end
77
113
 
78
114
  def run
79
- if @options.include?('--publish-all')
80
- publish_all
81
- return
82
- end
83
- if @options.include?('--publish-current')
84
- publish_current
115
+ return publish_all if @options.include?('--publish-all')
116
+ return publish_revision(@current_revision) if @options.include?('--publish-current')
117
+ if @options.include?('--dont-update')
118
+ @new_revision = @current_revision
119
+ @log.info "Update skipped. Still at revision #{@new_revision}"
85
120
  return
121
+ else
122
+ update_svn
86
123
  end
87
- @log.info "openMSX is currently at #{@current_revision}."
88
- update_svn
124
+
89
125
  if @new_revision >= @current_revision
90
126
  @log.info "Revision #{@new_revision} is not older than #{@current_revision}. Proceeding with build."
91
- build
127
+ build unless already_built?(@new_revision)
92
128
  end
93
129
  end
94
130
 
131
+ def update_svn
132
+ @log.info "openMSX is currently at #{@current_revision}. Proceeding with `svn update`"
133
+ @log.debug `cd #{setting(:source_dir)} && svn up`
134
+ @new_revision = `svnversion -n #{setting(:source_dir)}`.to_i
135
+ @log.info "Now at revision #{@new_revision}"
136
+ nil
137
+ end
138
+
95
139
  private
140
+ def already_built?(revision)
141
+ if openmsx?
142
+ files = Dir.glob(filemask_for_revision(revision))
143
+ if files.size == 0
144
+ @log.debug "Revision #{revision} has not yet been built."
145
+ return false
146
+ end
147
+ @log.debug "The following file(s) were found for revision #{revision}: #{files.join(",")}"
148
+ filename = files.first
149
+ elsif openmsx_debugger?
150
+ filename = filemask_for_revision(revision)
151
+ return false unless File.exist?(filename)
152
+ else
153
+ @log.fatal "Unsupported config type #{@type}."
154
+ exit
155
+ end
156
+ @log.info "Revision #{revision} already built as: #{filename}"
157
+ filename
158
+ end
159
+
96
160
  def archive(infile,outfile)
97
161
  `cd #{File.dirname(infile)} && tar --bzip2 -cf #{outfile} #{File.basename(infile)}`
98
162
  end
99
163
 
100
- def dmg_for_revision?(revision)
101
- return false unless openmsx?
102
- files = Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-#{revision}-mac-univ-bin.dmg"))
103
- @log.debug files.to_yaml unless files.size == 0
104
- files.size > 0
164
+ def build
165
+ cleanup_dmg_locks if openmsx?
166
+ @log.info("Will attempt to build revision #{@new_revision}.")
167
+ @build_outputs << `cd #{setting(:source_dir)} && make clean OPENMSX_TARGET_CPU=univ && make #{'staticbindist OPENMSX_TARGET_CPU=univ' if openmsx?} 2>&1`
168
+ if $?.success?
169
+ handle_build_success
170
+ return nil
171
+ end
172
+ handle_build_error
173
+ nil
105
174
  end
106
175
 
107
- def archive_for_revision?(revision)
108
- return false unless openmsx_debugger?
109
- filename = File.join(setting(:source_dir),setting(:builds_subdir),"openMSX-debugger-#{revision}-mac-x86.tbz")
110
- @log.debug filename
111
- File.exist?(filename)
176
+ def build_output
177
+ build_outputs.last
112
178
  end
113
179
 
114
- def publish_build(revision,infile,outfile='',location=setting(:publish_location))
115
- @log.debug "\n#publish_build"
116
- outfile = File.basename(infile) if outfile == ''
117
- destination = File.join(location,outfile)
118
- @log.info "Will publish #{infile} to #{setting(:publish_location)} now."
119
- publish_output = `scp -p "#{infile}" #{destination}`
120
- @log.debug publish_output unless publish_output.nil? || publish_output.strip == ''
121
- url = File.join(setting(:site_path),File.basename(destination))
122
- twitter_update = tweetmsx.update("[#{setting(:nice_name)}] Revision #{revision} is now available:\r\n #{url}") if @options.include?('--tweet')
123
- @log.info(twitter_update) unless twitter_update.nil?
124
- nil
125
- rescue TweetMsx::NotConfigured => e
126
- @log.error e.message
180
+ def cleanup_dmg_locks
181
+ @log.info("Checking for existing filelocks on DMGs.")
182
+ locks = `/usr/sbin/lsof | grep #{@new_revision}-mac-univ-bin.dmg`
183
+ @log.debug locks
184
+ locks.each_line do |lock_line|
185
+ pid = lock_line.split[1].to_i
186
+ @log.info "Killing pid #{pid} from lock '#{lock_line}'"
187
+ kill_output = `kill -9 #{pid}`
188
+ @log.debug kill_output
189
+ end
127
190
  end
128
191
 
129
- def publish
192
+ def filemask_for_revision(revision)
130
193
  if openmsx?
131
- archive_name = Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-#{@new_revision}-mac-univ-bin.dmg")).first
194
+ File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-#{revision}-mac-univ-bin.dmg")
132
195
  elsif openmsx_debugger?
133
- archive_name = File.join(setting(:source_dir),setting(:builds_subdir),"openMSX-debugger-#{@new_revision}-mac-x86.tbz")
134
- archive(File.join(setting(:source_dir),setting(:builds_subdir),'openMSX_Debugger.app'),File.basename(archive_name))
196
+ File.join(setting(:source_dir),setting(:builds_subdir),"openMSX-debugger-#{revision}-mac-x86.tbz")
135
197
  end
136
- publish_build(@new_revision, archive_name)
137
- nil
138
198
  end
139
199
 
140
- def publish_all
141
- @log.info "Publishing all #{@type} builds found"
142
- if openmsx?
143
- files = Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-mac-univ-bin.dmg")).sort.map do |f|
144
- if f =~ /openmsx-.+-(\d+)-mac-x86-bin.dmg$/
145
- rev = $1
146
- else
147
- rev = 'unknown'
148
- end
149
- [rev,f]
150
- end
151
- elsif openmsx_debugger?
152
- files = Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),'openMSX-debugger-*-mac-x86.tbz')).sort.map do |f|
153
- if f =~ /openMSX-debugger-(\d+)-mac-x86.tbz$/
154
- rev = $1
155
- else
156
- rev = 'unknown'
157
- end
158
- [rev,f]
159
- end
160
- end
161
- files.each do |rev,file|
162
- publish_build(rev,file)
200
+ def handle_build_error
201
+ if handle_build_hdiutil_error?
202
+ build
203
+ return nil
163
204
  end
164
- nil
165
- end
166
-
167
- def publish_current
168
- if openmsx?
169
- archive_name = Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-#{@current_revision}-mac-univ-bin.dmg")).first
170
- elsif openmsx_debugger?
171
- archive_name = File.join(setting(:source_dir),setting(:builds_subdir),"openMSX-debugger-#{@current_revision}-mac-x86.tbz")
172
- archive(File.join(setting(:source_dir),setting(:builds_subdir),'openMSX_Debugger.app'),File.basename(archive_name))
205
+ @log.error "!!!!!!FAILED!!!!!!"
206
+ build_output.each_line do |line|
207
+ @log.error " %s" % line
173
208
  end
174
- publish_build(@current_revision, archive_name)
175
- nil
176
- end
177
-
178
- def update_svn
179
- if @options.include?('--dont-update')
180
- update = 'Update skipped'
181
- else
182
- @log.info "Proceeding with update."
183
- update = `cd #{setting(:source_dir)} && svn up`
209
+ if @options.include?('--report-build-failure')
210
+ report_build_failure
184
211
  end
185
- @new_revision = `svnversion -n #{setting(:source_dir)}`.to_i
186
- @log.debug update
187
- @log.info "Now at revision #{@new_revision}"
188
- nil
189
212
  end
190
213
 
191
- def tweetmsx
192
- @tweetmsx ||= TweetMsx.new(@log.level)
214
+ #Capture the weird random build error that seems to be more OSX related than openMSX related.
215
+ def handle_build_hdiutil_error?
216
+ return false unless build_output.include?('hdiutil: create failed - error 49168')
217
+ @fails += 1
218
+ @log.error build_output
219
+ @log.error "Weird bug (attempt #{@fails}/3)"
220
+ return true if @fails < 3
221
+ @log.fatal "Encountered the weird 'hdiutil error 49168'-bug #{@fails} times; failing."
222
+ exit
193
223
  end
194
224
 
195
- def build
196
- if openmsx?
197
- if dmg_for_revision?(@new_revision)
198
- @log.info "Revision already build as #{Dir.glob(File.join(setting(:source_dir),setting(:builds_subdir),"openmsx-*-#{@new_revision}-mac-univ-bin.dmg")).first}"
199
- return nil
200
- end
201
- cleanup_dmg_locks
202
- elsif openmsx_debugger?
203
- if archive_for_revision?(@new_revision)
204
- @log.info "Revision already build as #{File.join(setting(:source_dir),setting(:builds_subdir),"openMSX-debugger-#{@new_revision}-mac-x86.tbz")}"
205
- return nil
206
- end
207
- end
208
- @log.info("Will attempt to build revision #{@new_revision}.")
209
- build_output = `cd #{setting(:source_dir)} && make clean OPENMSX_TARGET_CPU=univ && make #{'staticbindist OPENMSX_TARGET_CPU=univ' if openmsx?} 2>&1`
210
- if $?.success?
211
- @log.info "++++++SUCCESS++++++"
225
+ def handle_build_success
226
+ @log.info "++++++SUCCESS++++++"
227
+ if @log.debug?
212
228
  build_output.each_line do |line|
213
229
  @log.debug " %s" % line
214
230
  end
215
- publish if @options.include?('--publish')
216
- nil
217
- else
218
- #Capture the weird random build error that seems to be more OSX related than openMSX related.
219
- if build_output.include?('hdiutil: create failed - error 49168')
220
- @fails += 1
221
- @log.error build_output
222
- @log.error "Weird bug (attempt #{@fails}/3)"
223
- if @fails == 3
224
- @log.fatal "Encountered the weird 'hdiutil error 49168'-bug #{@fails} times; failing."
225
- exit
226
- else
227
- return build
228
- end
229
- end
230
- @log.error "!!!!!!FAILED!!!!!!"
231
- build_output.each_line do |line|
232
- @log.error " %s" % line
233
- end
234
- if @options.include?('--report-build-failure')
235
- report_build_failure(build_output)
236
- end
237
231
  end
232
+ publish_revision(@new_revision) if @options.include?('--publish')
238
233
  nil
239
234
  end
240
235
 
241
- def cleanup_dmg_locks
242
- @log.info("Checking for existing filelocks on DMGs.")
243
- locks = `/usr/sbin/lsof | grep #{@new_revision}-mac-univ-bin.dmg`
244
- @log.debug locks
245
- locks.each_line do |lock_line|
246
- pid = lock_line.split[1].to_i
247
- @log.info "Killing pid #{pid} from lock '#{lock_line}'"
248
- kill_output = `kill -9 #{pid}`
249
- @log.debug kill_output
250
- end
236
+ def openmsx?
237
+ @type == :openmsx
238
+ end
239
+
240
+ def openmsx_debugger?
241
+ @type == :openmsx_debugger
251
242
  end
252
243
 
253
- def report_build_failure(build_output)
244
+ def report_build_failure
254
245
  #TODO: Find out why I have to set these local vars due to problems with scope within Mail
255
246
  revision = @new_revision
256
247
  project_name = setting(:nice_name)
@@ -267,15 +258,15 @@ private
267
258
  subject "[FAIL] #{project_name} revision #{revision} failed to build"
268
259
  content_type 'text/plain; charset=UTF-8'
269
260
  content_transfer_encoding '8bit'
270
- body "While trying to build revision #{revision} of #{project_name}, the daily auto-builder encountered an error. Below you will find the entire build report:\r\n\r\n" << build_output
261
+ body <<-EOS
262
+ While trying to build revision #{revision} of #{project_name}, the daily auto-builder encountered an error.
263
+ Below you will find the entire build report:\r\n
264
+ #{build_output}
265
+ EOS
271
266
  end
272
267
  end
273
-
274
- def openmsx?
275
- @type == :openmsx
276
- end
277
268
 
278
- def openmsx_debugger?
279
- @type == :openmsx_debugger
269
+ def tweetmsx
270
+ @tweetmsx ||= TweetMsx.new(@log.level)
280
271
  end
281
272
  end
data/lib/tweet_msx.rb CHANGED
@@ -55,7 +55,8 @@ class TweetMsx
55
55
  @log.error "You've exceeded your rate limit"
56
56
  return nil
57
57
  end
58
- @client.update(message.to_s)
58
+ ret = @client.update(message.to_s)
59
+ @log.info(ret.to_yaml) unless ret.nil?
59
60
  nil
60
61
  rescue SocketError
61
62
  @log.error "Could not send '#{message}'. Twitter or your connection might be down."
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{openMSX-builder}
8
- s.version = "1.4.2"
8
+ s.version = "1.5.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Filip H.F. \"FiXato\" Slagter"]
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 4
8
- - 2
9
- version: 1.4.2
7
+ - 5
8
+ - 1
9
+ version: 1.5.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Filip H.F. "FiXato" Slagter