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
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 sys.dont_write_bytecode = True
import python_version_checker # noqa: E402 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 # Use this Python interpreter for any subprocesses we launch
PYTHON = sys.executable PYTHON = sys.executable
@@ -46,13 +52,18 @@ os.environ['PYTHON'] = sys.executable
# Can be overridden from idf.bat using IDF_PY_PROGRAM_NAME # Can be overridden from idf.bat using IDF_PY_PROGRAM_NAME
PROG = os.getenv('IDF_PY_PROGRAM_NAME', 'idf.py') 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 # function prints warning when autocompletion is not being performed
# set argument stream to sys.stderr for errors and exceptions # set argument stream to sys.stderr for errors and exceptions
def print_warning(message, stream=None): def print_warning(message, stream=None):
stream = stream or sys.stderr if not SHELL_COMPLETE_RUN:
if not os.getenv('_IDF.PY_COMPLETE'): print(message, file=stream or sys.stderr)
print(message, file=stream)
def check_environment(): def check_environment():
@@ -729,14 +740,21 @@ def signal_handler(_signal, _frame):
def main(): def main():
# Processing of Ctrl+C event for all threads made by main() # Processing of Ctrl+C event for all threads made by main()
signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGINT, signal_handler)
checks_output = check_environment() # Check the environment only when idf.py is invoked regularly from command line.
cli = init_cli(verbose_output=checks_output) checks_output = None if SHELL_COMPLETE_RUN else check_environment()
# 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') 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(): def _valid_unicode_config():

View File

@@ -988,12 +988,15 @@ def get_python_env_path(): # type: () -> Tuple[str, str, str, str]
idf_version_str = '' idf_version_str = ''
try: try:
idf_version_str = subprocess.check_output(['git', 'describe'], 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: except OSError:
# OSError should cover FileNotFoundError and WindowsError # OSError should cover FileNotFoundError and WindowsError
warn('Git was not found') warn('Git was not found')
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError:
warn('Git describe was unsuccessful: {}'.format(e.output)) # 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) match = re.match(r'^v([0-9]+\.[0-9]+).*', idf_version_str)
if match: if match:
idf_version = match.group(1) # type: Optional[str] idf_version = match.group(1) # type: Optional[str]