[PATCH rtems-tools] rtemstoolkit: add support for executing pipe command

Muhammad Sulthan Mazaya msulthanmazaya at gmail.com
Mon Jun 19 22:44:06 UTC 2023


The previous implementation of execute command on rtems-tools config does
not support command line pipe operation. So something like:

%execute %{command} | %{trim_command}

Would not work, since the "| %{trim_command}" part is treated as an 
additional command option. This patch is intended to fix that issue.

---
 rtemstoolkit/execute.py | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
index ed81589..9bb7434 100755
--- a/rtemstoolkit/execute.py
+++ b/rtemstoolkit/execute.py
@@ -389,11 +389,29 @@ class execute(object):
                     r, e = os.path.splitext(command[0])
                     if e not in ['.exe', '.com', '.bat']:
                         command[0] = command[0] + '.exe'
-            proc = subprocess.Popen(command, shell = shell,
-                                    cwd = cwd, env = env,
-                                    stdin = stdin, stdout = stdout,
-                                    stderr = stderr,
-                                    close_fds = False)
+                        
+            pipe_commands = []
+            current_command = []
+            for cmd in command:
+                if cmd == '|':
+                    pipe_commands.append(current_command)
+                    current_command = []
+                else:
+                    current_command.append(cmd)
+            pipe_commands.append(current_command)
+
+            proc = None
+            for i, cmd in enumerate(pipe_commands):
+                if i == 0:
+                    proc = subprocess.Popen(
+                        cmd, shell=shell, cwd=cwd, env=env, stdin=stdin, stdout=subprocess.PIPE)
+                elif i == len(pipe_commands) - 1:
+                    proc = subprocess.Popen(
+                        cmd, shell=shell, cwd=cwd, env=env, stdin=proc.stdout, stdout=stdout, stderr=stderr, close_fds=False)
+                else:
+                    proc = subprocess.Popen(
+                        cmd, shell=shell, cwd=cwd, env=env, stdin=proc.stdout, stdout=subprocess.PIPE)
+
             if not capture:
                 return (0, proc)
             if self.output is None:
-- 
2.34.1



More information about the devel mailing list