]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-136895: Fixes for pulling LLVM as a release artifact (#141002)
authorSavannah Ostrowski <savannah@python.org>
Thu, 6 Nov 2025 19:58:01 +0000 (11:58 -0800)
committerGitHub <noreply@github.com>
Thu, 6 Nov 2025 19:58:01 +0000 (11:58 -0800)
PCbuild/get_external.py
Tools/jit/_llvm.py

index 07970624e8647e2c6e825a5baa2fb9b3e3b3c4c3..edf14ce578bce69e8607a17a4f2dee8ce84a9f0c 100755 (executable)
@@ -3,8 +3,8 @@
 import argparse
 import os
 import pathlib
-import shutil
 import sys
+import tarfile
 import time
 import urllib.error
 import urllib.request
@@ -56,7 +56,8 @@ def fetch_release(tag, tarball_dir, *, org='python', verbose=False):
 
 def extract_tarball(externals_dir, tarball_path, tag):
     output_path = externals_dir / tag
-    shutil.unpack_archive(os.fspath(tarball_path), os.fspath(output_path))
+    with tarfile.open(tarball_path) as tf:
+        tf.extractall(os.fspath(externals_dir))
     return output_path
 
 
@@ -115,21 +116,23 @@ def main():
             verbose=args.verbose,
         )
         extracted = extract_zip(args.externals_dir, zip_path)
-    for wait in [1, 2, 3, 5, 8, 0]:
-        try:
-            extracted.replace(final_name)
-            break
-        except PermissionError as ex:
-            retry = f" Retrying in {wait}s..." if wait else ""
-            print(f"Encountered permission error '{ex}'.{retry}", file=sys.stderr)
-            time.sleep(wait)
-    else:
-        print(
-            f"ERROR: Failed to extract {final_name}.",
-            "You may need to restart your build",
-            file=sys.stderr,
-        )
-        sys.exit(1)
+
+    if extracted != final_name:
+        for wait in [1, 2, 3, 5, 8, 0]:
+            try:
+                extracted.replace(final_name)
+                break
+            except PermissionError as ex:
+                retry = f" Retrying in {wait}s..." if wait else ""
+                print(f"Encountered permission error '{ex}'.{retry}", file=sys.stderr)
+                time.sleep(wait)
+        else:
+            print(
+                f"ERROR: Failed to rename {extracted} to {final_name}.",
+                "You may need to restart your build",
+                file=sys.stderr,
+            )
+            sys.exit(1)
 
 
 if __name__ == '__main__':
index 54c2bf86a36ed6c5f41860005a22cb09dbac08e2..f1b0ad3f5dbc432e0b43ee94d7ccba2712242f7b 100644 (file)
@@ -83,6 +83,11 @@ async def _find_tool(tool: str, llvm_version: str, *, echo: bool = False) -> str
     # PCbuild externals:
     externals = os.environ.get("EXTERNALS_DIR", _targets.EXTERNALS)
     path = os.path.join(externals, _EXTERNALS_LLVM_TAG, "bin", tool)
+    # On Windows, executables need .exe extension
+    if os.name == "nt" and not path.endswith(".exe"):
+        path_with_exe = path + ".exe"
+        if os.path.exists(path_with_exe):
+            path = path_with_exe
     if await _check_tool_version(path, llvm_version, echo=echo):
         return path
     # Homebrew-installed executables: