blob: f40bce4e217e65e8f510cb8edc4df630202e5e0f [file] [log] [blame] [edit]
# frozen_string_literal: true
require 'English'
require 'open3'
require 'rake'
require 'io/wait'
require_relative 'selenium_rake/checks'
module Bazel
def self.execute(kind, args, target, verbose: Rake::FileUtilsExt.verbose_flag, log_file: nil, &block)
if target.end_with?(':run')
kind = 'run'
target = target[0, target.length - 4]
end
cmd = %w[bazel] + [kind, target] + (args || [])
cmd_out = ''
cmd_exit_code = 0
puts "Executing:\n#{cmd.join(' ')}" if verbose
if SeleniumRake::Checks.windows?
cmd_line = cmd.join(' ')
begin
cmd_out = `#{cmd_line} 2>&1`.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
puts cmd_out if verbose
File.write(log_file, cmd_out) if log_file
cmd_exit_code = $CHILD_STATUS.exitstatus
rescue => e
raise "Windows command execution failed: #{e.message}"
end
else
begin
Open3.popen2e(*cmd) do |stdin, stdouts, wait|
stdin.close
log = log_file ? File.open(log_file, 'a') : nil
while (line = stdouts.gets)
cmd_out += line
$stdout.print line if verbose
log&.write(line)
log&.flush
end
log&.close
cmd_exit_code = wait.value.exitstatus
end
rescue => e
raise "Command execution failed: #{e.message}"
end
end
raise "#{cmd.join(' ')} failed with exit code: #{cmd_exit_code}\nOutput: #{cmd_out}" if cmd_exit_code != 0
block&.call(cmd_out)
return unless cmd_out =~ %r{\s+(bazel-bin/\S+)}
out_artifact = Regexp.last_match(1)
puts "#{target} -> #{out_artifact}" if out_artifact
out_artifact
end
end