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

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

Followup to 5deda5ef3ef8763dfe936a313e0dddaa279a1b04

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.

diff --git a/lib/discourse.rb b/lib/discourse.rb
index 12f89a9..b13f785 100644
--- a/lib/discourse.rb
+++ b/lib/discourse.rb
@@ -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?
diff --git a/spec/components/discourse_spec.rb b/spec/components/discourse_spec.rb
index 6f1b294..cc05124 100644
--- a/spec/components/discourse_spec.rb
+++ b/spec/components/discourse_spec.rb
@@ -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

GitHub sha: 65647000

1 Like

This commit appears in #12672 which was approved by ZogStriP. It was merged by davidtaylorhq.