https://github.com/python/cpython/commit/04242c027feeff726acb15b6463422897b489bcf
commit: 04242c027feeff726acb15b6463422897b489bcf
branch: main
author: Brett Cannon <[email protected]>
committer: brettcannon <[email protected]>
date: 2026-08-20T12:24:45-07:00
summary:

Don't leak exceptions when a subprocess fails when run by Platforms/WASI 
(#156030)

files:
M Platforms/WASI/_build.py
M Platforms/WASI/_package.py

diff --git a/Platforms/WASI/_build.py b/Platforms/WASI/_build.py
index 66e2ae64e181d70..fff7e3f9f8cdada 100644
--- a/Platforms/WASI/_build.py
+++ b/Platforms/WASI/_build.py
@@ -129,7 +129,19 @@ def call(command, *, context=None, quiet=False, **kwargs):
         stderr = subprocess.STDOUT
         _shared.log("📝", f"Logging output to {stdout.name} (--quiet)...")
 
-    subprocess.check_call(command, **kwargs, stdout=stdout, stderr=stderr)
+    try:
+        subprocess.check_call(command, **kwargs, stdout=stdout, stderr=stderr)
+    except subprocess.CalledProcessError as error:
+        if quiet:
+            _shared.log("❌", f"Exit code {error.returncode}")
+            separator()
+            with open(stdout.name, encoding="utf-8") as file:
+                lines = file.readlines()
+                # Inefficient, but the log shouldn't be dramatically large.
+                print("".join(lines[-10:]), end="")
+                if not lines[-1].endswith("\n"):
+                    print()
+        sys.exit(error.returncode)
 
 
 @subdir("build_python_path", clean_ok=True)
@@ -163,8 +175,7 @@ def make_build_python(context, _working_dir):
     cmd = [
         binary,
         "-c",
-        "import sys; "
-        "print(f'{sys.version_info.major}.{sys.version_info.minor}')",
+        "import sys; 
print(f'{sys.version_info.major}.{sys.version_info.minor}')",
     ]
     version = subprocess.check_output(cmd, encoding="utf-8").strip()
 
diff --git a/Platforms/WASI/_package.py b/Platforms/WASI/_package.py
index 37119799c233a23..d1d43e5da2843c1 100644
--- a/Platforms/WASI/_package.py
+++ b/Platforms/WASI/_package.py
@@ -4,6 +4,7 @@
     "pathlib",
     "shutil",
     "subprocess",
+    "sys",
     "_shared",
 ]
 
@@ -12,6 +13,7 @@
 import pathlib
 import shutil
 import subprocess
+import sys
 
 import _shared
 
@@ -376,45 +378,53 @@ def archive(context):
             int(source_date_epoch), datetime.UTC
         ).strftime(mtime_format)
     else:
-        mtime = subprocess.run(
+        try:
+            mtime = subprocess.run(
+                [
+                    "git",
+                    "log",
+                    "-1",
+                    "--format=tformat:%cd",
+                    f"--date=format:{mtime_format}",
+                    os.fsdecode(context.checkout),
+                ],
+                env={"TZ": "UTC0"},
+                capture_output=True,
+                text=True,
+                check=True,
+            ).stdout.strip()
+        except subprocess.CalledProcessError as error:
+            print(error.output)
+            sys.exit(error.returncode)
+
+    try:
+        subprocess.run(
             [
-                "git",
-                "log",
-                "-1",
-                "--format=tformat:%cd",
-                f"--date=format:{mtime_format}",
-                os.fsdecode(context.checkout),
+                "tar",
+                "-c",
+                "-f",
+                os.fsdecode(file_path),
+                "--sort=name",
+                "--mtime",
+                mtime,
+                "--clamp-mtime",
+                "--owner=0",
+                "--group=0",
+                "--numeric-owner",
+                
"--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime",
+                "--mode=go+u,go-w",
+                # Explicitly using `-T` because if you don't compress with 
threads you can't
+                # uncompress with them and the size difference is negligible 
when using
+                # single-threaded compression.
+                "--use-compress-program",
+                "xz -T 0",
+                to_compress.name,
             ],
-            env={"TZ": "UTC0"},
+            cwd=to_compress.parent,
             capture_output=True,
             text=True,
             check=True,
-        ).stdout.strip()
-
-    subprocess.run(
-        [
-            "tar",
-            "-c",
-            "-f",
-            os.fsdecode(file_path),
-            "--sort=name",
-            "--mtime",
-            mtime,
-            "--clamp-mtime",
-            "--owner=0",
-            "--group=0",
-            "--numeric-owner",
-            
"--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime",
-            "--mode=go+u,go-w",
-            # Explicitly using `-T` because if you don't compress with threads 
you can't
-            # uncompress with them and the size difference is negligible when 
using
-            # single-threaded compression.
-            "--use-compress-program",
-            "xz -T 0",
-            to_compress.name,
-        ],
-        cwd=to_compress.parent,
-        capture_output=True,
-        text=True,
-        check=True,
-    )
+        )
+    except subprocess.CalledProcessError as error:
+        print(error.output)
+        sys.exit(error.returncode)

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to