From 249dbd7ab4d94fb1ed2d42b74d8c926d3602ff89 Mon Sep 17 00:00:00 2001 From: Marek Fiala Date: Fri, 21 Jul 2023 14:46:26 +0200 Subject: [PATCH] feat(tools): idf.py adding arguments from file via @filename.txt - moved test inputs to one directory - removed `-` from test arguments Closes https://github.com/espressif/esp-idf/pull/11821 Closes https://github.com/espressif/esp-idf/issues/11783 --- tools/idf.py | 12 ++++++------ tools/test_idf_py/args_a | 1 - tools/test_idf_py/args_b | 1 - tools/test_idf_py/args_circular_a | 1 - tools/test_idf_py/args_circular_b | 1 - tools/test_idf_py/args_recursive | 1 - .../file_args_expansion_inputs/args_a | 1 + .../file_args_expansion_inputs/args_b | 1 + .../file_args_expansion_inputs/args_circular_a | 1 + .../file_args_expansion_inputs/args_circular_b | 1 + .../file_args_expansion_inputs/args_recursive | 1 + tools/test_idf_py/test_idf_py.py | 16 ++++++++-------- 12 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 tools/test_idf_py/args_a delete mode 100644 tools/test_idf_py/args_b delete mode 100644 tools/test_idf_py/args_circular_a delete mode 100644 tools/test_idf_py/args_circular_b delete mode 100644 tools/test_idf_py/args_recursive create mode 100644 tools/test_idf_py/file_args_expansion_inputs/args_a create mode 100644 tools/test_idf_py/file_args_expansion_inputs/args_b create mode 100644 tools/test_idf_py/file_args_expansion_inputs/args_circular_a create mode 100644 tools/test_idf_py/file_args_expansion_inputs/args_circular_b create mode 100644 tools/test_idf_py/file_args_expansion_inputs/args_recursive diff --git a/tools/idf.py b/tools/idf.py index 07e6a49f9419..9768bdb979b3 100755 --- a/tools/idf.py +++ b/tools/idf.py @@ -694,7 +694,7 @@ def parse_project_dir(project_dir: str) -> Any: return CLI(help=cli_help, verbose_output=verbose_output, all_actions=all_actions) -def main(argv=None) -> None: +def main(argv: List[Any] = None) -> None: # Check the environment only when idf.py is invoked regularly from command line. checks_output = None if SHELL_COMPLETE_RUN else check_environment() @@ -717,7 +717,7 @@ def main(argv=None) -> None: cli(argv, prog_name=PROG, complete_var=SHELL_COMPLETE_VAR) -def expand_file_arguments(argv): +def expand_file_arguments(argv: List[Any]) -> List[Any]: """ Any argument starting with "@" gets replaced with all values read from a text file. Text file arguments can be split by newline or by space. @@ -727,10 +727,10 @@ def expand_file_arguments(argv): visited = set() expanded = False - def expand_args(args, parent_path, file_stack): + def expand_args(args: List[Any], parent_path: str, file_stack: List[str]) -> List[str]: expanded_args = [] for arg in args: - if not arg.startswith("@"): + if not arg.startswith('@'): expanded_args.append(arg) else: nonlocal expanded, visited @@ -745,13 +745,13 @@ def expand_args(args, parent_path, file_stack): visited.add(rel_path) try: - with open(rel_path, "r") as f: + with open(rel_path, 'r') as f: for line in f: expanded_args.extend(expand_args(shlex.split(line), os.path.dirname(rel_path), file_stack + [file_name])) except IOError: file_stack_str = ' -> '.join(['@' + f for f in file_stack + [file_name]]) raise FatalError(f"File '{rel_path}' (expansion of {file_stack_str}) could not be opened. " - "Please ensure the file exists and you have the necessary permissions to read it.") + 'Please ensure the file exists and you have the necessary permissions to read it.') return expanded_args argv = expand_args(argv, os.getcwd(), []) diff --git a/tools/test_idf_py/args_a b/tools/test_idf_py/args_a deleted file mode 100644 index f0252ff8635d..000000000000 --- a/tools/test_idf_py/args_a +++ /dev/null @@ -1 +0,0 @@ --DAAA -DBBB \ No newline at end of file diff --git a/tools/test_idf_py/args_b b/tools/test_idf_py/args_b deleted file mode 100644 index 1c01c9980a79..000000000000 --- a/tools/test_idf_py/args_b +++ /dev/null @@ -1 +0,0 @@ --DCCC -DDDD \ No newline at end of file diff --git a/tools/test_idf_py/args_circular_a b/tools/test_idf_py/args_circular_a deleted file mode 100644 index 38cebf4772a7..000000000000 --- a/tools/test_idf_py/args_circular_a +++ /dev/null @@ -1 +0,0 @@ --DAAA @args_circular_b diff --git a/tools/test_idf_py/args_circular_b b/tools/test_idf_py/args_circular_b deleted file mode 100644 index f427223c9c3b..000000000000 --- a/tools/test_idf_py/args_circular_b +++ /dev/null @@ -1 +0,0 @@ --DBBB @args_circular_a \ No newline at end of file diff --git a/tools/test_idf_py/args_recursive b/tools/test_idf_py/args_recursive deleted file mode 100644 index 7d44f743e7a1..000000000000 --- a/tools/test_idf_py/args_recursive +++ /dev/null @@ -1 +0,0 @@ -@args_a -DEEE -DFFF \ No newline at end of file diff --git a/tools/test_idf_py/file_args_expansion_inputs/args_a b/tools/test_idf_py/file_args_expansion_inputs/args_a new file mode 100644 index 000000000000..9d7fc88babae --- /dev/null +++ b/tools/test_idf_py/file_args_expansion_inputs/args_a @@ -0,0 +1 @@ +DAAA DBBB diff --git a/tools/test_idf_py/file_args_expansion_inputs/args_b b/tools/test_idf_py/file_args_expansion_inputs/args_b new file mode 100644 index 000000000000..cc007efe404c --- /dev/null +++ b/tools/test_idf_py/file_args_expansion_inputs/args_b @@ -0,0 +1 @@ +DCCC DDDD diff --git a/tools/test_idf_py/file_args_expansion_inputs/args_circular_a b/tools/test_idf_py/file_args_expansion_inputs/args_circular_a new file mode 100644 index 000000000000..8351f3875905 --- /dev/null +++ b/tools/test_idf_py/file_args_expansion_inputs/args_circular_a @@ -0,0 +1 @@ +DAAA @args_circular_b diff --git a/tools/test_idf_py/file_args_expansion_inputs/args_circular_b b/tools/test_idf_py/file_args_expansion_inputs/args_circular_b new file mode 100644 index 000000000000..5b3db9769b62 --- /dev/null +++ b/tools/test_idf_py/file_args_expansion_inputs/args_circular_b @@ -0,0 +1 @@ +DBBB @args_circular_a diff --git a/tools/test_idf_py/file_args_expansion_inputs/args_recursive b/tools/test_idf_py/file_args_expansion_inputs/args_recursive new file mode 100644 index 000000000000..facd895eb062 --- /dev/null +++ b/tools/test_idf_py/file_args_expansion_inputs/args_recursive @@ -0,0 +1 @@ +@args_a DEEE DFFF diff --git a/tools/test_idf_py/test_idf_py.py b/tools/test_idf_py/test_idf_py.py index 1e770473037e..678d93a09b18 100755 --- a/tools/test_idf_py/test_idf_py.py +++ b/tools/test_idf_py/test_idf_py.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD # SPDX-License-Identifier: Apache-2.0 import json @@ -296,10 +296,10 @@ def test_file_expansion(self): """Test @filename expansion functionality""" try: output = subprocess.check_output( - [sys.executable, idf_py_path, '--version', '@args_a'], + [sys.executable, idf_py_path, '--version', '@file_args_expansion_inputs/args_a'], env=os.environ, stderr=subprocess.STDOUT).decode('utf-8', 'ignore') - self.assertIn('Running: idf.py --version -DAAA -DBBB', output) + self.assertIn('Running: idf.py --version DAAA DBBB', output) except subprocess.CalledProcessError as e: self.fail(f'Process should have exited normally, but it exited with a return code of {e.returncode}') @@ -307,10 +307,10 @@ def test_multiple_file_arguments(self): """Test multiple @filename arguments""" try: output = subprocess.check_output( - [sys.executable, idf_py_path, '--version', '@args_a', '@args_b'], + [sys.executable, idf_py_path, '--version', '@file_args_expansion_inputs/args_a', '@file_args_expansion_inputs/args_b'], env=os.environ, stderr=subprocess.STDOUT).decode('utf-8', 'ignore') - self.assertIn('Running: idf.py --version -DAAA -DBBB -DCCC -DDDD', output) + self.assertIn('Running: idf.py --version DAAA DBBB DCCC DDDD', output) except subprocess.CalledProcessError as e: self.fail(f'Process should have exited normally, but it exited with a return code of {e.returncode}') @@ -318,10 +318,10 @@ def test_recursive_expansion(self): """Test recursive expansion of @filename arguments""" try: output = subprocess.check_output( - [sys.executable, idf_py_path, '--version', '@args_recursive'], + [sys.executable, idf_py_path, '--version', '@file_args_expansion_inputs/args_recursive'], env=os.environ, stderr=subprocess.STDOUT).decode('utf-8', 'ignore') - self.assertIn('Running: idf.py --version -DAAA -DBBB -DEEE -DFFF', output) + self.assertIn('Running: idf.py --version DAAA DBBB DEEE DFFF', output) except subprocess.CalledProcessError as e: self.fail(f'Process should have exited normally, but it exited with a return code of {e.returncode}') @@ -329,7 +329,7 @@ def test_circular_dependency(self): """Test circular dependency detection in file argument expansion""" with self.assertRaises(subprocess.CalledProcessError) as cm: subprocess.check_output( - [sys.executable, idf_py_path, '--version', '@args_circular_a'], + [sys.executable, idf_py_path, '--version', '@file_args_expansion_inputs/args_circular_a'], env=os.environ, stderr=subprocess.STDOUT).decode('utf-8', 'ignore') self.assertIn('Circular dependency in file argument expansion', cm.exception.output.decode('utf-8', 'ignore'))