run_loop 2.1.3 → 2.1.4
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.
- checksums.yaml +4 -4
- data/lib/run_loop.rb +119 -4
- data/lib/run_loop/{host_cache.rb → cache.rb} +8 -3
- data/lib/run_loop/codesign.rb +3 -3
- data/lib/run_loop/core.rb +26 -5
- data/lib/run_loop/core_simulator.rb +14 -13
- data/lib/run_loop/detect_aut/detect.rb +1 -1
- data/lib/run_loop/device.rb +2 -2
- data/lib/run_loop/device_agent/Frameworks.zip +0 -0
- data/lib/run_loop/device_agent/app/CBX-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/bin/iOSDeviceManager +0 -0
- data/lib/run_loop/device_agent/cbxrunner.rb +3 -2
- data/lib/run_loop/device_agent/frameworks.rb +7 -13
- data/lib/run_loop/device_agent/{xctestctl.rb → ios_device_manager.rb} +36 -24
- data/lib/run_loop/device_agent/ipa/CBX-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/launcher.rb +8 -0
- data/lib/run_loop/device_agent/xcodebuild.rb +5 -0
- data/lib/run_loop/dnssd.rb +148 -0
- data/lib/run_loop/dot_dir.rb +1 -1
- data/lib/run_loop/dylib_injector.rb +1 -1
- data/lib/run_loop/encoding.rb +17 -0
- data/lib/run_loop/environment.rb +15 -5
- data/lib/run_loop/instruments.rb +2 -2
- data/lib/run_loop/language.rb +4 -0
- data/lib/run_loop/locale.rb +4 -1
- data/lib/run_loop/otool.rb +1 -1
- data/lib/run_loop/process_terminator.rb +1 -1
- data/lib/run_loop/shell.rb +2 -2
- data/lib/run_loop/sim_control.rb +5 -5
- data/lib/run_loop/simctl.rb +2 -2
- data/lib/run_loop/strings.rb +1 -1
- data/lib/run_loop/version.rb +1 -1
- data/lib/run_loop/xcode.rb +15 -0
- data/lib/run_loop/xcrun.rb +7 -3
- data/lib/run_loop/xcuitest.rb +155 -68
- metadata +41 -21
- data/lib/run_loop/cache/cache.rb +0 -68
- data/lib/run_loop/device_agent/bin/xctestctl +0 -0
- data/lib/run_loop/device_agent/frameworks/Frameworks.zip +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b78530b9096de94687ede2b3747d0c767c32b369
|
4
|
+
data.tar.gz: 146634e680bf39a1ddb834c5ccc0b48baf0878bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b7f41b533a82f4b9602a99f25671b2273d6da50bb7e69f4a2e0f169013d7d042af3b7bf081607c91276aff2c3da9473c6ab31062cbd047d1c482ad159e45b19
|
7
|
+
data.tar.gz: 3d3ed52198cb8cf0c8dc274d384142f5d149c3c00a5b0219c4f49f58798c979b8898e5f5180d96f6bfef716b2229720c751488d042e25c7066d15cecdb155640
|
data/lib/run_loop.rb
CHANGED
@@ -23,7 +23,7 @@ require 'run_loop/ipa'
|
|
23
23
|
require "run_loop/device_agent/cbxrunner"
|
24
24
|
require "run_loop/device_agent/frameworks"
|
25
25
|
require "run_loop/device_agent/launcher"
|
26
|
-
require "run_loop/device_agent/
|
26
|
+
require "run_loop/device_agent/ios_device_manager"
|
27
27
|
require "run_loop/device_agent/xcodebuild"
|
28
28
|
require "run_loop/detect_aut/errors"
|
29
29
|
require "run_loop/detect_aut/xamarin_studio"
|
@@ -35,8 +35,7 @@ require 'run_loop/instruments'
|
|
35
35
|
require 'run_loop/lipo'
|
36
36
|
require "run_loop/otool"
|
37
37
|
require "run_loop/strings"
|
38
|
-
require 'run_loop/cache
|
39
|
-
require 'run_loop/host_cache'
|
38
|
+
require 'run_loop/cache'
|
40
39
|
require 'run_loop/patches/awesome_print'
|
41
40
|
require 'run_loop/core_simulator'
|
42
41
|
require "run_loop/simctl"
|
@@ -49,6 +48,7 @@ require "run_loop/http/server"
|
|
49
48
|
require "run_loop/http/request"
|
50
49
|
require "run_loop/http/retriable_client"
|
51
50
|
require "run_loop/physical_device/life_cycle"
|
51
|
+
require "run_loop/dnssd"
|
52
52
|
|
53
53
|
module RunLoop
|
54
54
|
|
@@ -80,10 +80,20 @@ module RunLoop
|
|
80
80
|
# We want to use the _exact_ objects that were passed.
|
81
81
|
if options[:xcode]
|
82
82
|
cloned_options[:xcode] = options[:xcode]
|
83
|
+
else
|
84
|
+
cloned_options[:xcode] = RunLoop::Xcode.new
|
83
85
|
end
|
84
86
|
|
85
87
|
if options[:simctl]
|
86
88
|
cloned_options[:simctl] = options[:simctl]
|
89
|
+
else
|
90
|
+
cloned_options[:simctl] = RunLoop::Simctl.new
|
91
|
+
end
|
92
|
+
|
93
|
+
if options[:instruments]
|
94
|
+
cloned_options[:instruments] = options[:instruments]
|
95
|
+
else
|
96
|
+
cloned_options[:instruments] = RunLoop::Instruments.new
|
87
97
|
end
|
88
98
|
|
89
99
|
# Soon to be unsupported.
|
@@ -91,7 +101,15 @@ module RunLoop
|
|
91
101
|
cloned_options[:sim_control] = options[:sim_control]
|
92
102
|
end
|
93
103
|
|
94
|
-
|
104
|
+
xcode = cloned_options[:xcode]
|
105
|
+
simctl = cloned_options[:simctl]
|
106
|
+
instruments = cloned_options[:instruments]
|
107
|
+
|
108
|
+
device = Device.detect_device(cloned_options, xcode, simctl, instruments)
|
109
|
+
cloned_options[:device] = device
|
110
|
+
|
111
|
+
gesture_performer = RunLoop.detect_gesture_performer(cloned_options, xcode, device)
|
112
|
+
if gesture_performer == :device_agent
|
95
113
|
RunLoop::XCUITest.run(cloned_options)
|
96
114
|
else
|
97
115
|
if RunLoop::Instruments.new.instruments_app_running?
|
@@ -224,4 +242,101 @@ Please quit the Instruments.app and try again.)
|
|
224
242
|
def self.log_info(*args)
|
225
243
|
RunLoop::Logging.log_info(*args)
|
226
244
|
end
|
245
|
+
|
246
|
+
# @!visibility private
|
247
|
+
#
|
248
|
+
# @param [RunLoop::Xcode] xcode The active Xcode
|
249
|
+
# @param [RunLoop::Device] device The device under test.
|
250
|
+
def self.default_gesture_performer(xcode, device)
|
251
|
+
# TODO XTC support
|
252
|
+
return :instruments if RunLoop::Environment.xtc?
|
253
|
+
|
254
|
+
if xcode.version_gte_8?
|
255
|
+
if device.version >= RunLoop::Version.new("9.0")
|
256
|
+
:device_agent
|
257
|
+
else
|
258
|
+
raise RuntimeError, %Q[
|
259
|
+
Invalid Xcode and iOS combination:
|
260
|
+
|
261
|
+
Xcode version: #{xcode.version.to_s}
|
262
|
+
iOS version: #{device.version.to_s}
|
263
|
+
|
264
|
+
Calabash cannot test iOS < 9.0 using Xcode 8 because XCUITest is not compatible
|
265
|
+
with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
266
|
+
|
267
|
+
You can rerun your test if you have Xcode 7 installed:
|
268
|
+
|
269
|
+
$ DEVELOPER_DIR=/path/to/Xcode/7.3.1/Xcode.app/Contents/Developer cucumber
|
270
|
+
|
271
|
+
]
|
272
|
+
end
|
273
|
+
|
274
|
+
else
|
275
|
+
:instruments
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
# @!visibility private
|
280
|
+
#
|
281
|
+
# First pass at choosing the correct code path.
|
282
|
+
#
|
283
|
+
# We don't know if we can test on iOS 8 with UIAutomation or XCUITest on
|
284
|
+
# Xcode 8.
|
285
|
+
#
|
286
|
+
# @param [Hash] options The options passed by the user
|
287
|
+
# @param [RunLoop::Xcode] xcode The active Xcode
|
288
|
+
# @param [RunLoop::Device] device The device under test
|
289
|
+
def self.detect_gesture_performer(options, xcode, device)
|
290
|
+
# TODO XTC support
|
291
|
+
return :instruments if RunLoop::Environment.xtc?
|
292
|
+
|
293
|
+
gesture_performer = options[:gesture_performer]
|
294
|
+
|
295
|
+
if gesture_performer
|
296
|
+
if xcode.version_gte_8?
|
297
|
+
if gesture_performer == :instruments
|
298
|
+
raise RuntimeError, %Q[
|
299
|
+
Incompatible :gesture_performer option for active Xcode.
|
300
|
+
|
301
|
+
Detected :gesture_performer => :instruments and Xcode #{xcode.version}.
|
302
|
+
|
303
|
+
Don't set the :gesture_performer option unless you are gem maintainer.
|
304
|
+
|
305
|
+
]
|
306
|
+
elsif device.version < RunLoop::Version.new("9.0")
|
307
|
+
raise RuntimeError, %Q[
|
308
|
+
|
309
|
+
Invalid Xcode and iOS combination:
|
310
|
+
|
311
|
+
Xcode version: #{xcode.version.to_s}
|
312
|
+
iOS version: #{device.version.to_s}
|
313
|
+
|
314
|
+
Calabash cannot test iOS < 9.0 using Xcode 8 because XCUITest is not compatible
|
315
|
+
with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
316
|
+
|
317
|
+
You can rerun your test if you have Xcode 7 installed:
|
318
|
+
|
319
|
+
$ DEVELOPER_DIR=/path/to/Xcode/7.3.1/Xcode.app/Contents/Developer cucumber
|
320
|
+
|
321
|
+
Don't set the :gesture_performer option unless you are gem maintainer.
|
322
|
+
|
323
|
+
]
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
if ![:device_agent, :instruments].include?(gesture_performer)
|
328
|
+
raise RuntimeError, %Q[
|
329
|
+
Invalid :gesture_performer option: #{gesture_performer}
|
330
|
+
|
331
|
+
Allowed performers: :device_agent or :instruments.
|
332
|
+
|
333
|
+
Don't set the :gesture_performer option unless you are gem maintainer.
|
334
|
+
|
335
|
+
]
|
336
|
+
end
|
337
|
+
gesture_performer
|
338
|
+
else
|
339
|
+
RunLoop.default_gesture_performer(xcode, device)
|
340
|
+
end
|
341
|
+
end
|
227
342
|
end
|
@@ -12,7 +12,7 @@ module RunLoop
|
|
12
12
|
# Marshal is safe to use here because:
|
13
13
|
# 1. This code is not executed on the XTC.
|
14
14
|
# 2. Users who muck about with this cache can only hurt themselves.
|
15
|
-
class
|
15
|
+
class Cache
|
16
16
|
|
17
17
|
# The path to the cache file.
|
18
18
|
#
|
@@ -40,7 +40,7 @@ RunLoop requires this directory to cache files
|
|
40
40
|
|
41
41
|
# The default cache.
|
42
42
|
def self.default
|
43
|
-
RunLoop::
|
43
|
+
RunLoop::Cache.new(self.default_directory)
|
44
44
|
end
|
45
45
|
|
46
46
|
# Creates a new HostCache that is ready for IO.
|
@@ -50,7 +50,7 @@ RunLoop requires this directory to cache files
|
|
50
50
|
# @options [Hash] options Options to control the state of the new object.
|
51
51
|
# @option [String] filename (host_run_loop.hash) The cache filename.
|
52
52
|
# @option [Boolean] clear (false) If true, the current cache will be cleared.
|
53
|
-
# @return [RunLoop::
|
53
|
+
# @return [RunLoop::Cache] A cache that is ready for IO.
|
54
54
|
def initialize(directory, options = {})
|
55
55
|
sha1 = Digest::SHA1.hexdigest 'host_run_loop.hash'
|
56
56
|
default_opts = {:filename => sha1,
|
@@ -125,4 +125,9 @@ RunLoop requires this directory to cache files
|
|
125
125
|
self.write({})
|
126
126
|
end
|
127
127
|
end
|
128
|
+
|
129
|
+
# @!visibility private
|
130
|
+
# Required for backward compatibility.
|
131
|
+
# The only legitimate caller is in Calabash iOS Launcher#attach.
|
132
|
+
class HostCache < RunLoop::Cache ; end
|
128
133
|
end
|
data/lib/run_loop/codesign.rb
CHANGED
@@ -18,7 +18,7 @@ module RunLoop
|
|
18
18
|
# @!visibility private
|
19
19
|
def self.info(path)
|
20
20
|
self.expect_path_exists(path)
|
21
|
-
self.
|
21
|
+
self.run_codesign_command(["--display", "--verbose=4", path])
|
22
22
|
end
|
23
23
|
|
24
24
|
# @!visibility private
|
@@ -59,7 +59,7 @@ module RunLoop
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
def self.
|
62
|
+
def self.run_codesign_command(args)
|
63
63
|
if !args.is_a?(Array)
|
64
64
|
raise ArgumentError, "Expected args: '#{args}' to be an Array"
|
65
65
|
end
|
@@ -67,7 +67,7 @@ module RunLoop
|
|
67
67
|
xcrun = RunLoop::Xcrun.new
|
68
68
|
cmd = ["codesign"] + args
|
69
69
|
options = {:log_cmd => true}
|
70
|
-
hash = xcrun.
|
70
|
+
hash = xcrun.run_command_in_context(cmd, options)
|
71
71
|
|
72
72
|
hash[:out]
|
73
73
|
end
|
data/lib/run_loop/core.rb
CHANGED
@@ -53,6 +53,8 @@ module RunLoop
|
|
53
53
|
SCRIPTS[key]
|
54
54
|
end
|
55
55
|
|
56
|
+
# @!visibility private
|
57
|
+
# This is the entry point for UIAutomation.
|
56
58
|
def self.run_with_options(options)
|
57
59
|
before = Time.now
|
58
60
|
|
@@ -63,6 +65,22 @@ module RunLoop
|
|
63
65
|
xcode = options[:xcode] || RunLoop::Xcode.new
|
64
66
|
instruments = options[:instruments] || RunLoop::Instruments.new
|
65
67
|
|
68
|
+
if xcode.version_gte_8?
|
69
|
+
raise %Q[
|
70
|
+
UIAutomation is not available on Xcode >= 8.*.
|
71
|
+
|
72
|
+
We are in the process of updating Calabash to use our new tool: DeviceAgent.
|
73
|
+
|
74
|
+
We will track progress in this forum post:
|
75
|
+
|
76
|
+
https://groups.google.com/forum/#!topic/calabash-ios/g34znf0LnE4
|
77
|
+
|
78
|
+
For now, testing with Xcode 8 is not supported.
|
79
|
+
|
80
|
+
Thank you for your patience.
|
81
|
+
]
|
82
|
+
end
|
83
|
+
|
66
84
|
# Device under test: DUT
|
67
85
|
device = RunLoop::Device.detect_device(options, xcode, simctl, instruments)
|
68
86
|
|
@@ -120,7 +138,7 @@ module RunLoop
|
|
120
138
|
FileUtils.touch repl_path
|
121
139
|
end
|
122
140
|
|
123
|
-
RunLoop::
|
141
|
+
RunLoop::Cache.default.clear unless RunLoop::Environment.xtc?
|
124
142
|
|
125
143
|
cal_script = File.join(SCRIPTS_PATH, 'calabash_script_uia.js')
|
126
144
|
File.open(script, 'w') do |file|
|
@@ -202,7 +220,8 @@ means that the APP variable is pointing to a .app that does not exist.
|
|
202
220
|
:app => app_details[:bundle_id],
|
203
221
|
:repl_path => repl_path,
|
204
222
|
:log_file => log_file,
|
205
|
-
:results_dir => results_dir
|
223
|
+
:results_dir => results_dir,
|
224
|
+
:gesture_performer => :instruments
|
206
225
|
}
|
207
226
|
|
208
227
|
uia_timeout = options[:uia_timeout] || RunLoop::Environment.uia_timeout || 10
|
@@ -322,7 +341,9 @@ Logfile: #{log_file}
|
|
322
341
|
# version.
|
323
342
|
def self.default_simulator(xcode=RunLoop::Xcode.new)
|
324
343
|
|
325
|
-
if xcode.
|
344
|
+
if xcode.version_gte_8?
|
345
|
+
"iPhone 6s (10.0)"
|
346
|
+
elsif xcode.version_gte_73?
|
326
347
|
"iPhone 6s (9.3)"
|
327
348
|
elsif xcode.version_gte_72?
|
328
349
|
"iPhone 6s (9.2)"
|
@@ -387,7 +408,7 @@ Logfile: #{log_file}
|
|
387
408
|
raise RunLoop::WriteFailedError.new("Trying write of command #{cmd_str} at index #{index}")
|
388
409
|
end
|
389
410
|
run_loop[:index] = index + 1
|
390
|
-
RunLoop::
|
411
|
+
RunLoop::Cache.default.write(run_loop) unless RunLoop::Environment.xtc?
|
391
412
|
index
|
392
413
|
end
|
393
414
|
|
@@ -503,7 +524,7 @@ Logfile: #{log_file}
|
|
503
524
|
end
|
504
525
|
|
505
526
|
run_loop[:initial_offset] = offset
|
506
|
-
RunLoop::
|
527
|
+
RunLoop::Cache.default.write(run_loop) unless RunLoop::Environment.xtc?
|
507
528
|
result
|
508
529
|
end
|
509
530
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
# A class to manage interactions with CoreSimulators.
|
2
2
|
class RunLoop::CoreSimulator
|
3
3
|
|
4
|
+
require "run_loop/shell"
|
5
|
+
include RunLoop::Shell
|
6
|
+
|
4
7
|
# These options control various aspects of an app's life cycle on the iOS
|
5
8
|
# Simulator.
|
6
9
|
#
|
@@ -61,15 +64,13 @@ class RunLoop::CoreSimulator
|
|
61
64
|
# This process is a daemon, and requires 'KILL' to terminate.
|
62
65
|
# Killing the process is fast, but it takes a long time to
|
63
66
|
# restart.
|
64
|
-
|
67
|
+
"com.apple.CoreSimulator.CoreSimulatorService",
|
65
68
|
|
66
|
-
#
|
67
|
-
#
|
69
|
+
# Not yet.
|
70
|
+
# "com.apple.CoreSimulator.SimVerificationService",
|
68
71
|
|
69
72
|
'SimulatorBridge',
|
70
73
|
'configd_sim',
|
71
|
-
|
72
|
-
# Does not always appear.
|
73
74
|
'CoreSimulatorBridge',
|
74
75
|
|
75
76
|
# Xcode 7
|
@@ -207,7 +208,7 @@ class RunLoop::CoreSimulator
|
|
207
208
|
|
208
209
|
if simulator.update_simulator_state != "Shutdown"
|
209
210
|
args = ["simctl", "shutdown", simulator.udid]
|
210
|
-
xcrun.
|
211
|
+
xcrun.run_command_in_context(args, xcrun_opts)
|
211
212
|
begin
|
212
213
|
self.wait_for_simulator_state(simulator, "Shutdown")
|
213
214
|
rescue RuntimeError => _
|
@@ -226,7 +227,7 @@ $ bundle exec run-loop simctl manage-processes
|
|
226
227
|
end
|
227
228
|
|
228
229
|
args = ["simctl", "erase", simulator.udid]
|
229
|
-
hash = xcrun.
|
230
|
+
hash = xcrun.run_command_in_context(args, xcrun_opts)
|
230
231
|
|
231
232
|
if hash[:exit_status] != 0
|
232
233
|
raise RuntimeError, %Q{
|
@@ -489,7 +490,7 @@ $ bundle exec run-loop simctl manage-processes
|
|
489
490
|
args = ['simctl', 'uninstall', device.udid, app.bundle_identifier]
|
490
491
|
|
491
492
|
timeout = DEFAULT_OPTIONS[:uninstall_app_timeout]
|
492
|
-
xcrun.
|
493
|
+
xcrun.run_command_in_context(args, log_cmd: true, timeout: timeout)
|
493
494
|
|
494
495
|
device.simulator_wait_for_stable_state
|
495
496
|
true
|
@@ -569,8 +570,8 @@ $ bundle exec run-loop simctl manage-processes
|
|
569
570
|
def running_simulator_pid
|
570
571
|
process_name = "MacOS/#{sim_name}"
|
571
572
|
|
572
|
-
args = ["
|
573
|
-
hash =
|
573
|
+
args = ["ps", "x", "-o", "pid,command"]
|
574
|
+
hash = run_shell_command(args)
|
574
575
|
|
575
576
|
exit_status = hash[:exit_status]
|
576
577
|
if exit_status != 0
|
@@ -611,7 +612,7 @@ Command had no output
|
|
611
612
|
|
612
613
|
args = ['simctl', 'install', device.udid, app.path]
|
613
614
|
timeout = DEFAULT_OPTIONS[:install_app_timeout]
|
614
|
-
xcrun.
|
615
|
+
xcrun.run_command_in_context(args, log_cmd: true, timeout: timeout)
|
615
616
|
|
616
617
|
device.simulator_wait_for_stable_state
|
617
618
|
installed_app_bundle_dir
|
@@ -621,7 +622,7 @@ Command had no output
|
|
621
622
|
def launch_app_with_simctl
|
622
623
|
args = ['simctl', 'launch', device.udid, app.bundle_identifier]
|
623
624
|
timeout = DEFAULT_OPTIONS[:launch_app_timeout]
|
624
|
-
xcrun.
|
625
|
+
xcrun.run_command_in_context(args, log_cmd: true, timeout: timeout)
|
625
626
|
end
|
626
627
|
|
627
628
|
# @!visibility private
|
@@ -864,7 +865,7 @@ Command had no output
|
|
864
865
|
target = File.join(directory, bundle_name)
|
865
866
|
|
866
867
|
args = ['ditto', app.path, target]
|
867
|
-
xcrun.
|
868
|
+
xcrun.run_command_in_context(args, log_cmd: true)
|
868
869
|
|
869
870
|
RunLoop.log_debug("Installed #{app} on CoreSimulator #{device.udid}")
|
870
871
|
|
data/lib/run_loop/device.rb
CHANGED
@@ -505,7 +505,7 @@ version: #{version}
|
|
505
505
|
]
|
506
506
|
|
507
507
|
# RunLoop::PlistBuddy cannot add items to arrays.
|
508
|
-
xcrun.
|
508
|
+
xcrun.run_command_in_context(cmd, {:log_cmd => true})
|
509
509
|
|
510
510
|
simulator_languages
|
511
511
|
end
|
@@ -547,7 +547,7 @@ version: #{version}
|
|
547
547
|
end
|
548
548
|
|
549
549
|
args = ['simctl', 'list', 'devices']
|
550
|
-
hash = xcrun.
|
550
|
+
hash = xcrun.run_command_in_context(args)
|
551
551
|
out = hash[:out]
|
552
552
|
|
553
553
|
matched_line = out.split("\n").find do |line|
|
Binary file
|
Binary file
|
Binary file
|
@@ -5,7 +5,6 @@ module RunLoop
|
|
5
5
|
# @!visibility private
|
6
6
|
class CBXRunner
|
7
7
|
|
8
|
-
require "run_loop/shell"
|
9
8
|
|
10
9
|
# @!visibility private
|
11
10
|
@@cbxdevice = nil
|
@@ -87,8 +86,10 @@ but runner does not exist at that path.
|
|
87
86
|
end
|
88
87
|
|
89
88
|
# @!visibility private
|
89
|
+
# TODO move this behavior to shell.rb - should be able to call Shell.run_unix_command
|
90
90
|
def self.expand_runner_archive(archive)
|
91
91
|
shell = Class.new do
|
92
|
+
require "run_loop/shell"
|
92
93
|
include RunLoop::Shell
|
93
94
|
def to_s; "#<CBXRunner Shell>"; end
|
94
95
|
def inspect; to_s; end
|
@@ -98,7 +99,7 @@ but runner does not exist at that path.
|
|
98
99
|
options = { :log_cmd => true }
|
99
100
|
Dir.chdir(dir) do
|
100
101
|
RunLoop.log_unix_cmd("cd #{dir}")
|
101
|
-
shell.
|
102
|
+
shell.run_shell_command(["ditto", "-xk", File.basename(archive), "."], options)
|
102
103
|
end
|
103
104
|
File.join(dir, "CBX-Runner.app")
|
104
105
|
end
|