DEV: Allow `Discourse::Utils.execute_command` timeout with `env` (#12672)

Followup to 5deda5ef3e

The first argument to `Open3.capture3` can be an environment variable hash. In this case, we need to insert the `timeout` command after the env hash.
This commit is contained in:
David Taylor 2021-04-12 13:53:41 +01:00 committed by GitHub
parent cd24eff5d9
commit 65647000a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 1 deletions

View File

@ -96,13 +96,18 @@ module Discourse
private
def execute_command(*command, timeout: nil, failure_message: "", success_status_codes: [0], chdir: ".")
env = nil
env = command.shift if command[0].is_a?(Hash)
if timeout
# will send a TERM after timeout
# will send a KILL after timeout * 2
command = ["timeout", "-k", "#{timeout.to_f * 2}", timeout.to_s] + command
end
stdout, stderr, status = Open3.capture3(*command, chdir: chdir)
args = command
args = [env] + command if env
stdout, stderr, status = Open3.capture3(*args, chdir: chdir)
if !status.exited? || !success_status_codes.include?(status.exitstatus)
failure_message = "#{failure_message}\n" if !failure_message.blank?

View File

@ -402,6 +402,10 @@ describe Discourse do
expect do
Discourse::Utils.execute_command("sleep", "999999999999", timeout: 0.001)
end.to raise_error(RuntimeError)
expect do
Discourse::Utils.execute_command({ "MYENV" => "MYVAL" }, "sleep", "999999999999", timeout: 0.001)
end.to raise_error(RuntimeError)
end
it "works with a block" do