xcjobs 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/xcjobs/version.rb +1 -1
- data/lib/xcjobs/xcodebuild.rb +96 -66
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfed7f6abb2a79dd85f2b689a1a6c9bbaa82f605
|
4
|
+
data.tar.gz: 44e38c2a7d513135212861088c14b77d4b37bfbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4c9a23d70fab95c73ccce1e6bcb03251b64330fb7c7b9de039960b7c9c7b9cb101285c47fa31bbf8857fd938d81c14671bfe33e918b6847869e1ec6814fa22f
|
7
|
+
data.tar.gz: 00861da56737697a84b98d09b3e602afd3a715dce913fdfa4befe9c8176f1b3a84201ebeb105fea34bc147813b07a0b9036600dea7aa33ab9437588c2bf1ec8e
|
data/lib/xcjobs/version.rb
CHANGED
data/lib/xcjobs/xcodebuild.rb
CHANGED
@@ -146,6 +146,100 @@ module XCJobs
|
|
146
146
|
end
|
147
147
|
|
148
148
|
private
|
149
|
+
|
150
|
+
def show_coverage(profdata_path, target_path)
|
151
|
+
cmd = ['xcrun', 'llvm-cov', 'report']
|
152
|
+
opts = ['-instr-profile', profdata_path, target_path, '-use-color=0']
|
153
|
+
puts (cmd + opts).join(" ")
|
154
|
+
out, status = Open3.capture2(*(cmd + opts))
|
155
|
+
out.lines.each do |line|
|
156
|
+
puts line
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def generate_gcov_file(profdata_path, target_path)
|
161
|
+
puts 'Generage gcov file...'
|
162
|
+
gcov_file = {}
|
163
|
+
source_path = ''
|
164
|
+
|
165
|
+
cmd = ['xcrun', 'llvm-cov', 'show']
|
166
|
+
opts = ['-instr-profile', profdata_path, target_path, '-use-color=0']
|
167
|
+
|
168
|
+
out, status = Open3.capture2(*(cmd + opts))
|
169
|
+
out.lines.each do |line|
|
170
|
+
match = /^(['"]?(?:\/[^\/]+)*['"]?):$/.match(line)
|
171
|
+
if match.to_a.count > 0
|
172
|
+
source_path = match.to_a[1]
|
173
|
+
gcov_file[source_path] = []
|
174
|
+
next
|
175
|
+
end
|
176
|
+
|
177
|
+
match = /^[ ]*([0-9]+|[ ]+)\|[ ]*([0-9]+)\|(.*)$/.match(line)
|
178
|
+
next unless match.to_a.count == 4
|
179
|
+
count, number, text = match.to_a[1..3]
|
180
|
+
|
181
|
+
execution_count = case count.strip
|
182
|
+
when ''
|
183
|
+
'-'.rjust(5)
|
184
|
+
when '0'
|
185
|
+
'#####'
|
186
|
+
else count
|
187
|
+
end
|
188
|
+
gcov_file[source_path] << "#{execution_count.rjust(5)}:#{number.rjust(5)}:#{text}"
|
189
|
+
end
|
190
|
+
|
191
|
+
gcov_file.each do |key, value|
|
192
|
+
gcon_path = File.join(File.dirname(profdata_path), "#{File.basename(target_path)}.gcov")
|
193
|
+
file = File::open(gcon_path, "w")
|
194
|
+
file.puts("#{'-'.rjust(5)}:#{'0'.rjust(5)}:Source:#{key}")
|
195
|
+
file.puts(value)
|
196
|
+
file.flush
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def coverage_report(options)
|
201
|
+
settings = build_settings(options)
|
202
|
+
|
203
|
+
targetSettings = settings.select { |key, _| settings[key]['PRODUCT_TYPE'] != 'com.apple.product-type.bundle.unit-test' }
|
204
|
+
targetSettings.each do |target, settings|
|
205
|
+
if settings['PRODUCT_TYPE'] == 'com.apple.product-type.framework'
|
206
|
+
if sdk.start_with? 'iphone'
|
207
|
+
target_dir = settings['OBJECT_FILE_DIR_normal'].gsub('Build/Intermediates', "Build/Intermediates/CodeCoverage/#{target}/Intermediates")
|
208
|
+
executable_name = settings['EXECUTABLE_NAME']
|
209
|
+
target_path = File.join(File.join(target_dir, settings['CURRENT_ARCH']), executable_name)
|
210
|
+
else
|
211
|
+
target_dir = settings['CODESIGNING_FOLDER_PATH'].gsub('Build/Products', "Build/Intermediates/CodeCoverage/#{target}/Products")
|
212
|
+
executable_name = settings['EXECUTABLE_NAME']
|
213
|
+
target_path = File.join(target_dir, executable_name)
|
214
|
+
end
|
215
|
+
else
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
code_coverage_dir = settings['BUILD_DIR'].gsub('Build/Products', "Build/Intermediates/CodeCoverage/#{target}/")
|
220
|
+
profdata_path = File.join(code_coverage_dir, 'Coverage.profdata')
|
221
|
+
|
222
|
+
show_coverage(profdata_path, target_path)
|
223
|
+
generate_gcov_file(profdata_path, target_path)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def build_settings(options)
|
228
|
+
out, status = Open3.capture2(*(['xcodebuild', 'test'] + options + ['-showBuildSettings']))
|
229
|
+
|
230
|
+
settings, target = {}, nil
|
231
|
+
out.lines.each do |line|
|
232
|
+
case line
|
233
|
+
when /Build settings for action test and target (.+):/
|
234
|
+
target = $1
|
235
|
+
settings[target] = {}
|
236
|
+
else
|
237
|
+
key, value = line.split(/\=/).collect(&:strip)
|
238
|
+
settings[target][key] = value if target
|
239
|
+
end
|
240
|
+
end
|
241
|
+
return settings
|
242
|
+
end
|
149
243
|
|
150
244
|
def define
|
151
245
|
raise 'test action requires specifying a scheme' unless scheme
|
@@ -157,77 +251,13 @@ module XCJobs
|
|
157
251
|
add_build_setting('CODE_SIGN_IDENTITY', '""')
|
158
252
|
add_build_setting('CODE_SIGNING_REQUIRED', 'NO')
|
159
253
|
end
|
160
|
-
|
161
|
-
add_build_setting('CONFIGURATION_BUILD_DIR', File.expand_path(build_dir)) if build_dir
|
162
|
-
end
|
163
|
-
add_build_setting('CONFIGURATION_TEMP_DIR', File.join(build_dir, 'temp')) if build_dir
|
254
|
+
|
164
255
|
add_build_setting('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO')
|
165
256
|
|
166
257
|
run(['xcodebuild', 'test'] + options)
|
167
258
|
|
168
259
|
if coverage_enabled
|
169
|
-
|
170
|
-
|
171
|
-
configuration_build_dir = out.lines.grep(/\bCONFIGURATION_BUILD_DIR\b/).first.split('=').last.strip
|
172
|
-
project_temp_root = out.lines.grep(/\bPROJECT_TEMP_ROOT\b/).first.split('=').last.strip
|
173
|
-
object_file_dir_normal = out.lines.grep(/\bOBJECT_FILE_DIR_normal\b/).first.split('=').last.strip
|
174
|
-
current_arch = out.lines.grep(/\bCURRENT_ARCH\b/).first.split('=').last.strip
|
175
|
-
executable_name = out.lines.grep(/\bEXECUTABLE_NAME\b/).first.split('=').last.strip
|
176
|
-
executable_path = out.lines.grep(/\bEXECUTABLE_PATH\b/).first.split('=').last.strip
|
177
|
-
|
178
|
-
if sdk.start_with? 'iphone'
|
179
|
-
target_path = File.join(File.join(object_file_dir_normal, current_arch), executable_name)
|
180
|
-
elsif sdk == 'macosx'
|
181
|
-
target_path = File.join(configuration_build_dir, executable_path)
|
182
|
-
end
|
183
|
-
|
184
|
-
code_coverage_dir = File.join(project_temp_root, 'CodeCoverage')
|
185
|
-
profdata_dir = File.join(code_coverage_dir, scheme)
|
186
|
-
profdata_path = File.join(profdata_dir, 'Coverage.profdata')
|
187
|
-
|
188
|
-
gcov_file = {}
|
189
|
-
source_path = ''
|
190
|
-
|
191
|
-
cmd = ['xcrun', 'llvm-cov', 'report']
|
192
|
-
opts = ['-instr-profile', profdata_path, target_path, '-use-color=0']
|
193
|
-
puts (cmd + opts).join(" ")
|
194
|
-
out, status = Open3.capture2(*(cmd + opts))
|
195
|
-
out.lines.each do |line|
|
196
|
-
puts line
|
197
|
-
end
|
198
|
-
|
199
|
-
cmd = ['xcrun', 'llvm-cov', 'show']
|
200
|
-
puts (cmd + opts).join(" ")
|
201
|
-
out, status = Open3.capture2(*(cmd + opts))
|
202
|
-
out.lines.each do |line|
|
203
|
-
match = /^(['"]?(?:\/[^\/]+)*['"]?):$/.match(line)
|
204
|
-
if match.to_a.count > 0
|
205
|
-
source_path = match.to_a[1]
|
206
|
-
gcov_file[source_path] = []
|
207
|
-
next
|
208
|
-
end
|
209
|
-
|
210
|
-
match = /^[ ]*([0-9]+|[ ]+)\|[ ]*([0-9]+)\|(.*)$/.match(line)
|
211
|
-
next unless match.to_a.count == 4
|
212
|
-
count, number, text = match.to_a[1..3]
|
213
|
-
|
214
|
-
execution_count = case count.strip
|
215
|
-
when ''
|
216
|
-
'-'.rjust(5)
|
217
|
-
when '0'
|
218
|
-
'#####'
|
219
|
-
else count
|
220
|
-
end
|
221
|
-
gcov_file[source_path] << "#{execution_count.rjust(5)}:#{number.rjust(5)}:#{text}"
|
222
|
-
end
|
223
|
-
|
224
|
-
gcov_file.each do |key, value|
|
225
|
-
gcon_path = File.join(File.dirname(target_path), "#{File.basename(target_path)}.gcov")
|
226
|
-
file = File::open(gcon_path, "w")
|
227
|
-
file.puts("#{'-'.rjust(5)}:#{'0'.rjust(5)}:Source:#{key}")
|
228
|
-
file.puts(value)
|
229
|
-
file.flush
|
230
|
-
end
|
260
|
+
coverage_report(options)
|
231
261
|
end
|
232
262
|
end
|
233
263
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcjobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kishikawa katsumi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|