[PATCH rtems-tools] rtemstoolkit: add support for executing pipe command
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
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
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
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
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
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