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
This commit is contained in:
Marek Fiala 2023-07-21 14:46:26 +02:00
parent 4c1f574c3d
commit 076779f419
12 changed files with 19 additions and 19 deletions

View File

@ -696,7 +696,7 @@ def init_cli(verbose_output: List=None) -> 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()
@ -719,7 +719,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.
@ -729,10 +729,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
@ -747,13 +747,13 @@ def expand_file_arguments(argv):
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(), [])

View File

@ -1 +0,0 @@
-DAAA -DBBB

View File

@ -1 +0,0 @@
-DCCC -DDDD

View File

@ -1 +0,0 @@
-DAAA @args_circular_b

View File

@ -1 +0,0 @@
-DBBB @args_circular_a

View File

@ -1 +0,0 @@
@args_a -DEEE -DFFF

View File

@ -0,0 +1 @@
DAAA DBBB

View File

@ -0,0 +1 @@
DCCC DDDD

View File

@ -0,0 +1 @@
DAAA @args_circular_b

View File

@ -0,0 +1 @@
DBBB @args_circular_a

View File

@ -0,0 +1 @@
@args_a DEEE DFFF

View File

@ -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 @@ class TestFileArgumentExpansion(TestCase):
"""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 @@ class TestFileArgumentExpansion(TestCase):
"""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 @@ class TestFileArgumentExpansion(TestCase):
"""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 @@ class TestFileArgumentExpansion(TestCase):
"""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'))