Merge branch 'bugfix/idf_py_shell_complete_env_check' into 'master'

Tools: Don't check the environment during idf.py shell completion

Closes IDFGH-6733

See merge request espressif/esp-idf!17111
This commit is contained in:
Roland Dobai 2022-02-22 11:21:09 +00:00
commit 786592cef9
2 changed files with 34 additions and 13 deletions

View File

@ -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():

View File

@ -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]