30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/run_loop/xcrun.rb', line 30
def exec(args, options={})
merged_options = DEFAULT_OPTIONS.merge(options)
timeout = merged_options[:timeout]
unless args.is_a?(Array)
raise ArgumentError,
"Expected args '#{args}' to be an Array, but found '#{args.class}'"
end
args.each do |arg|
unless arg.is_a?(String)
raise ArgumentError,
%Q{Expected arg '#{arg}' to be a String, but found '#{arg.class}'
IO.popen requires all arguments to be Strings.
}
end
end
cmd = "xcrun #{args.join(' ')}"
RunLoop.log_unix_cmd(cmd) if merged_options[:log_cmd]
hash = {}
begin
start_time = Time.now
command_output = CommandRunner.run(['xcrun'] + args, timeout: timeout)
out = encode_utf8_or_raise(command_output[:out], cmd)
process_status = command_output[:status]
hash =
{
:out => out,
:pid => process_status.pid,
:exit_status => process_status.exitstatus
}
rescue UTF8Error => e
raise e
rescue => e
elapsed = "%0.2f" % (Time.now - start_time)
raise Error,
%Q{Xcrun encountered an error after #{elapsed} seconds:
#{e}
executing this command:
#{cmd}
}
end
if hash[:exit_status].nil?
elapsed = "%0.2f" % (Time.now - start_time)
raise TimeoutError,
%Q{Xcrun timed out after #{elapsed} seconds executing
#{cmd}
with a timeout of #{timeout}
}
end
hash
end
|