The caller script may not want an automatic execution of the new version. Add two parameters to allow showing alternatives and to bail out if version is incompatible. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> --- tools/docs/lib/python_version.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/tools/docs/lib/python_version.py b/tools/docs/lib/python_version.py index 660bfe7d23fa..e2e9f9a3d421 100644 --- a/tools/docs/lib/python_version.py +++ b/tools/docs/lib/python_version.py @@ -85,10 +85,12 @@ class PythonVersion: may need to update it one day, hopefully on a distant future. """ patterns = [ - "python3.[0-9]", "python3.[0-9][0-9]", + "python3.[0-9]", ] + python_cmd = [] + # Seek for a python binary newer than min_version for path in os.getenv("PATH", "").split(":"): for pattern in patterns: @@ -96,12 +98,12 @@ class PythonVersion: if os.path.isfile(cmd) and os.access(cmd, os.X_OK): version = PythonVersion.get_python_version(cmd) if version >= min_version: - return cmd + python_cmd.append((version, cmd)) - return None + return sorted(python_cmd, reverse=True) @staticmethod - def check_python(min_version): + def check_python(min_version, show_alternatives=False, bail_out=False): """ Check if the current python binary satisfies our minimal requirement for Sphinx build. If not, re-run with a newer version if found. @@ -113,18 +115,33 @@ class PythonVersion: python_ver = PythonVersion.ver_str(cur_ver) - new_python_cmd = PythonVersion.find_python(min_version) - if not new_python_cmd: + available_versions = PythonVersion.find_python(min_version) + if not available_versions: print(f"ERROR: Python version {python_ver} is not spported anymore\n") print(" Can't find a new version. This script may fail") return - # Restart script using the newer version + # Check possible alternatives + if available_versions: + new_python_cmd = available_versions[0][1] + else: + new_python_cmd = None + script_path = os.path.abspath(sys.argv[0]) args = [new_python_cmd, script_path] + sys.argv[1:] + if show_alternatives: + print("Available Python versions:") + for _, cmd in available_versions: + print(f" {cmd}") + print() + + if bail_out: + sys.exit(f"Python {python_ver} not supported. Bailing out") + print(f"Python {python_ver} not supported. Changing to {new_python_cmd}") + # Restart script using the newer version try: os.execv(new_python_cmd, args) except OSError as e: -- 2.51.0