From 49e9f254c5304b6e564c5999f1d89493e4729fc2 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Thu, 10 Feb 2022 16:58:16 +0100 Subject: [PATCH 1/2] Tools: Don't check the environment during idf.py shell completion Closes https://github.com/espressif/esp-idf/issues/8362 --- tools/idf.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/tools/idf.py b/tools/idf.py index e8950fd5cf..c2b4a55b6f 100755 --- a/tools/idf.py +++ b/tools/idf.py @@ -32,8 +32,14 @@ from pkgutil import iter_modules sys.dont_write_bytecode = True import python_version_checker # noqa: E402 -from idf_py_actions.errors import FatalError # noqa: E402 -from idf_py_actions.tools import executable_exists, idf_version, merge_action_lists, realpath # noqa: E402 + +try: + from idf_py_actions.errors import FatalError # noqa: E402 + from idf_py_actions.tools import executable_exists, idf_version, merge_action_lists, realpath # noqa: E402 +except ImportError: + # For example, importing click could cause this. + print('Please use idf.py only in an ESP-IDF shell environment.', file=sys.stderr) + sys.exit(1) # Use this Python interpreter for any subprocesses we launch PYTHON = sys.executable @@ -46,13 +52,18 @@ os.environ['PYTHON'] = sys.executable # Can be overridden from idf.bat using IDF_PY_PROGRAM_NAME PROG = os.getenv('IDF_PY_PROGRAM_NAME', 'idf.py') +# environment variable used during click shell completion run +SHELL_COMPLETE_VAR = '_IDF.PY_COMPLETE' + +# was shell completion invoked? +SHELL_COMPLETE_RUN = SHELL_COMPLETE_VAR in os.environ + # function prints warning when autocompletion is not being performed # set argument stream to sys.stderr for errors and exceptions def print_warning(message, stream=None): - stream = stream or sys.stderr - if not os.getenv('_IDF.PY_COMPLETE'): - print(message, file=stream) + if not SHELL_COMPLETE_RUN: + print(message, file=stream or sys.stderr) def check_environment(): @@ -729,14 +740,21 @@ def signal_handler(_signal, _frame): def main(): - # Processing of Ctrl+C event for all threads made by main() signal.signal(signal.SIGINT, signal_handler) - checks_output = check_environment() - cli = init_cli(verbose_output=checks_output) - # the argument `prog_name` must contain name of the file - not the absolute path to it! - cli(sys.argv[1:], prog_name=PROG, complete_var='_IDF.PY_COMPLETE') + # Check the environment only when idf.py is invoked regularly from command line. + checks_output = None if SHELL_COMPLETE_RUN else check_environment() + + try: + cli = init_cli(verbose_output=checks_output) + except ImportError: + if SHELL_COMPLETE_RUN: + pass + else: + raise + else: + cli(sys.argv[1:], prog_name=PROG, complete_var=SHELL_COMPLETE_VAR) def _valid_unicode_config(): From d93380e8f637ce43f7257507c922ff545f791e05 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Thu, 10 Feb 2022 17:29:41 +0100 Subject: [PATCH 2/2] Tools: Don't print git failure message for version detection --- tools/idf_tools.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/idf_tools.py b/tools/idf_tools.py index eb5dd57e39..83d3cdca7e 100755 --- a/tools/idf_tools.py +++ b/tools/idf_tools.py @@ -988,12 +988,15 @@ def get_python_env_path(): # type: () -> Tuple[str, str, str, str] idf_version_str = '' try: idf_version_str = subprocess.check_output(['git', 'describe'], - cwd=global_idf_path, env=os.environ).decode() + cwd=global_idf_path, env=os.environ, + stderr=subprocess.DEVNULL).decode() except OSError: # OSError should cover FileNotFoundError and WindowsError warn('Git was not found') - except subprocess.CalledProcessError as e: - warn('Git describe was unsuccessful: {}'.format(e.output)) + except subprocess.CalledProcessError: + # This happens quite often when the repo is shallow. Don't print a warning because there are other + # possibilities for version detection. + pass match = re.match(r'^v([0-9]+\.[0-9]+).*', idf_version_str) if match: idf_version = match.group(1) # type: Optional[str]