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

2023-06-19 Thread Muhammad Sulthan Mazaya
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

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


[PATCH rtems-tools] tester/rt: use shlex.split to split command args

2023-06-19 Thread Muhammad Sulthan Mazaya
The regular split-by-space function used to split command arguments
creates compatibility issues with many shell command syntaxes. A
specific example is the handling of string arguments, as shown below:

%define renode_args -e start_opts -e "s %{bsp_resc_script}"

Thus, it is changed to use shlex.split instead. It splits
the command arguments using shell-like syntax. More about shlex
module here: https://docs.python.org/3/library/shlex.html

---
 tester/rt/config.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tester/rt/config.py b/tester/rt/config.py
index 8a433af..bf6fdbf 100644
--- a/tester/rt/config.py
+++ b/tester/rt/config.py
@@ -38,6 +38,7 @@ import datetime
 import os
 import re
 import threading
+import shlex
 
 from rtemstoolkit import configuration
 from rtemstoolkit import config
@@ -326,7 +327,7 @@ class file(config.file):
 if len(_data):
 ds = [_data[0]]
 if len(_data) > 1:
-ds += _data[1].split()
+ds += shlex.split(_data[1], posix=False)
 ds = self.expand(ds)
 
 if _directive == '%console':
-- 
2.34.1

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


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

2023-06-19 Thread Chris Johns
Hi,

Thanks for this. I like the change.

Could you please shorten the long line? This code will be run through yapf after
6 branches but until then we limit the line length. :)

Could you please add a unit test for this to the end of this file?

Thanks
Chris

On 20/6/2023 8:44 am, Muhammad Sulthan Mazaya wrote:
> 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:
___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


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

2023-06-19 Thread Muhammad Sulthan Mazaya
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

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


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

2023-06-19 Thread Muhammad Sulthan Mazaya
Sorry, sent the wrong patch, it should be the v2. Ignore this one.

On Tue, Jun 20, 2023 at 12:30 PM Muhammad Sulthan Mazaya <
msulthanmaz...@gmail.com> wrote:

> 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
>
>
___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

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

2023-06-19 Thread Muhammad Sulthan Mazaya
added unit tests and shorten long lines.

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

diff --git a/rtemstoolkit/execute.py b/rtemstoolkit/execute.py
index ed81589..9ec1cd7 100755
--- a/rtemstoolkit/execute.py
+++ b/rtemstoolkit/execute.py
@@ -389,11 +389,38 @@ 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:
@@ -583,6 +610,10 @@ if __name__ == "__main__":
 proc.stdin.close()
 e.capture(proc)
 del proc
+ec, proc = e.open(commands['open'])
+if ec == 0:
+e.capture(proc)
+del proc
 
 def capture_output(text):
 print(text, end = '')
@@ -601,6 +632,7 @@ if __name__ == "__main__":
 commands['windows']['csubsts'] = [('netstat %0', ['-a']),
   ('netstat %0 %1', ['-a', '-n'])]
 commands['windows']['pipe'] = ('ftp', None, 'help\nquit')
+commands['windows']['open'] = ["echo",  "hello rtems", "|", "findstr", 
"rtems"]
 commands['unix']['shell'] = ['pwd', 'ls -las', './xyz', sh_shell_test]
 commands['unix']['spawn'] = ['ls', 'execute.pyc', ['ls', '-i']]
 commands['unix']['cmd'] = [('date'), ('date', '-R'), ('date', ['-u', '+%d 
%D']),
@@ -608,6 +640,7 @@ if __name__ == "__main__":
 commands['unix']['csubsts'] = [('date %0 "+%d %D %S"', ['-u']),
('date %0 %1', ['-u', '+%d %D %S'])]
 commands['unix']['pipe'] = ('grep', 'hello', 'hello world')
+commands['unix']['open'] = ["echo", "hello world", "|", "cut", "-d ", 
"-f2"]
 
 print(arg_list('cmd a1 a2 "a3 is a string" a4'))
 print(arg_list('cmd b1 b2 "b3 is a string a4'))
-- 
2.34.1

___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel