lib/run_loop/xctools.rb in run_loop-1.0.2 vs lib/run_loop/xctools.rb in run_loop-1.0.3

- old
+ new

@@ -106,10 +106,18 @@ # @raise [ArgumentError] if invalid `cmd` is passed def instruments(cmd=nil) instruments = 'xcrun instruments' return instruments if cmd == nil + # Xcode 6 GM is spamming "WebKit Threading Violations" + stderr_filter = lambda { |stderr| + stderr.read.strip.split("\n").each do |line| + unless line[/WebKit Threading Violation/, 0] + $stderr.puts line + end + end + } case cmd when :version @instruments_version ||= lambda { # Xcode 6 can print out some very strange output, so we have to retry. Retriable.retriable({:tries => 5}) do @@ -119,19 +127,28 @@ end end }.call when :sims @instruments_sims ||= lambda { - devices = `#{instruments} -s devices`.chomp.split("\n") - devices.select { |device| device.downcase.include?('simulator') } + # Instruments 6 spams a lot of error messages. I don't like to + # hide them, but they seem to be around to stay (Xcode 6 GM). + cmd = "#{instruments} -s devices" + Open3.popen3(cmd) do |_, stdout, stderr, _| + stderr_filter.call(stderr) + devices = stdout.read.chomp.split("\n") + devices.select { |device| device.downcase.include?('simulator') } + end }.call when :templates @instruments_templates ||= lambda { cmd = "#{instruments} -s templates" if self.xcode_version >= self.v60 - `#{cmd}`.split("\n").map { |elm| elm.strip.tr('"', '') } + Open3.popen3(cmd) do |_, stdout, stderr, _| + stderr_filter.call(stderr) + stdout.read.chomp.split("\n").map { |elm| elm.strip.tr('"', '') } + end elsif self.xcode_version >= self.v51 `#{cmd}`.split("\n").delete_if do |path| not path =~ /tracetemplate/ end.map { |elm| elm.strip } else @@ -144,16 +161,20 @@ end }.call when :devices @devices ||= lambda { - all = `#{instruments} -s devices`.chomp.split("\n") - valid = all.select { |device| device =~ /[a-f0-9]{40}/ } - valid.map do |device| - udid = device[/[a-f0-9]{40}/, 0] - version = device[/(\d\.\d(\.\d)?)/, 0] - name = device.split('(').first.strip - RunLoop::Device.new(name, version, udid) + cmd = "#{instruments} -s devices" + Open3.popen3(cmd) do |_, stdout, stderr, _| + stderr_filter.call(stderr) + all = stdout.read.chomp.split("\n") + valid = all.select { |device| device =~ /[a-f0-9]{40}/ } + valid.map do |device| + udid = device[/[a-f0-9]{40}/, 0] + version = device[/(\d\.\d(\.\d)?)/, 0] + name = device.split('(').first.strip + RunLoop::Device.new(name, version, udid) + end end }.call else candidates = [:version, :sims, :devices] raise(ArgumentError, "expected '#{cmd}' to be one of '#{candidates}'")