]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] Make printing log lines to the terminal a little cleaner when building WASI...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 30 Oct 2025 18:02:10 +0000 (19:02 +0100)
committerGitHub <noreply@github.com>
Thu, 30 Oct 2025 18:02:10 +0000 (18:02 +0000)
Make printing log lines to the terminal a little cleaner when building WASI (GH-140772)
(cherry picked from commit abd19eddee20a7d05266f11f6042a84b04d29664)

Co-authored-by: Brett Cannon <brett@python.org>
Tools/wasm/wasi/__main__.py

index fac32926cbcaffaff4baa92fbe804921e273c058..628fbb10b630bcb4bc36d73ef2bc9bcea147da81 100644 (file)
@@ -37,6 +37,30 @@ WASMTIME_VAR_NAME = "WASMTIME"
 WASMTIME_HOST_RUNNER_VAR = f"{{{WASMTIME_VAR_NAME}}}"
 
 
+def separator():
+    """Print a separator line across the terminal width."""
+    try:
+        tput_output = subprocess.check_output(
+            ["tput", "cols"], encoding="utf-8"
+        )
+    except subprocess.CalledProcessError:
+        terminal_width = 80
+    else:
+        terminal_width = int(tput_output.strip())
+    print("โŽฏ" * terminal_width)
+
+
+def log(emoji, message, *, spacing=None):
+    """Print a notification with an emoji.
+
+    If 'spacing' is None, calculate the spacing based on the number of code points
+    in the emoji as terminals "eat" a space when the emoji has multiple code points.
+    """
+    if spacing is None:
+        spacing = " " if len(emoji) == 1 else "  "
+    print("".join([emoji, spacing, message]))
+
+
 def updated_env(updates={}):
     """Create a new dict representing the environment to use.
 
@@ -60,9 +84,10 @@ def updated_env(updates={}):
         if os.environ.get(key) != value:
             env_diff[key] = value
 
-    print("๐ŸŒŽ Environment changes:")
-    for key in sorted(env_diff.keys()):
-        print(f"  {key}={env_diff[key]}")
+    env_vars = (
+        f"\n     {key}={item}" for key, item in sorted(env_diff.items())
+    )
+    log("๐ŸŒŽ", f"Environment changes:{''.join(env_vars)}")
 
     return environment
 
@@ -77,22 +102,14 @@ def subdir(working_dir, *, clean_ok=False):
 
             if callable(working_dir):
                 working_dir = working_dir(context)
-            try:
-                tput_output = subprocess.check_output(
-                    ["tput", "cols"], encoding="utf-8"
-                )
-            except subprocess.CalledProcessError:
-                terminal_width = 80
-            else:
-                terminal_width = int(tput_output.strip())
-            print("โŽฏ" * terminal_width)
-            print("๐Ÿ“", working_dir)
+            separator()
+            log("๐Ÿ“", os.fsdecode(working_dir))
             if (
                 clean_ok
                 and getattr(context, "clean", False)
                 and working_dir.exists()
             ):
-                print("๐Ÿšฎ Deleting directory (--clean)...")
+                log("๐Ÿšฎ", "Deleting directory (--clean)...")
                 shutil.rmtree(working_dir)
 
             working_dir.mkdir(parents=True, exist_ok=True)
@@ -116,7 +133,7 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs):
     elif quiet and logdir is None:
         raise ValueError("When quiet is True, logdir must be specified")
 
-    print("โฏ", " ".join(map(str, command)))
+    log("โฏ", " ".join(map(str, command)), spacing="  ")
     if not quiet:
         stdout = None
         stderr = None
@@ -130,7 +147,7 @@ def call(command, *, context=None, quiet=False, logdir=None, **kwargs):
             suffix=".log",
         )
         stderr = subprocess.STDOUT
-        print(f"๐Ÿ“ Logging output to {stdout.name} (--quiet)...")
+        log("๐Ÿ“", f"Logging output to {stdout.name} (--quiet)...")
 
     subprocess.check_call(command, **kwargs, stdout=stdout, stderr=stderr)
 
@@ -163,11 +180,11 @@ def configure_build_python(context, working_dir):
     """Configure the build/host Python."""
     if LOCAL_SETUP.exists():
         if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER:
-            print(f"๐Ÿ‘ {LOCAL_SETUP} exists ...")
+            log("๐Ÿ‘", f"{LOCAL_SETUP} exists ...")
         else:
-            print(f"โš ๏ธ {LOCAL_SETUP} exists, but has unexpected contents")
+            log("โš ๏ธ", f"{LOCAL_SETUP} exists, but has unexpected contents")
     else:
-        print(f"๐Ÿ“ Creating {LOCAL_SETUP} ...")
+        log("๐Ÿ“", f"Creating {LOCAL_SETUP} ...")
         LOCAL_SETUP.write_bytes(LOCAL_SETUP_MARKER)
 
     configure = [os.path.relpath(CHECKOUT / "configure", working_dir)]
@@ -191,7 +208,7 @@ def make_build_python(context, working_dir):
     ]
     version = subprocess.check_output(cmd, encoding="utf-8").strip()
 
-    print(f"๐ŸŽ‰ {binary} {version}")
+    log("๐ŸŽ‰", f"{binary} {version}")
 
 
 def find_wasi_sdk():
@@ -228,9 +245,10 @@ def find_wasi_sdk():
         # supported version is a prefix of the found version (e.g. `25` and `2567`).
         if not found_version.startswith(f"{WASI_SDK_VERSION}."):
             major_version = found_version.partition(".")[0]
-            print(
-                f"โš ๏ธ Found WASI SDK {major_version}, "
-                f"but WASI SDK {WASI_SDK_VERSION} is the supported version"
+            log(
+                "โš ๏ธ",
+                f" Found WASI SDK {major_version}, "
+                f"but WASI SDK {WASI_SDK_VERSION} is the supported version",
             )
 
     return wasi_sdk_path
@@ -349,7 +367,7 @@ def configure_wasi_python(context, working_dir):
     with exec_script.open("w", encoding="utf-8") as file:
         file.write(f'#!/bin/sh\nexec {host_runner} {python_wasm} "$@"\n')
     exec_script.chmod(0o755)
-    print(f"๐Ÿƒโ€โ™€๏ธ Created {exec_script} (--host-runner)... ")
+    log("๐Ÿƒ", f"Created {exec_script} (--host-runner)... ")
     sys.stdout.flush()
 
 
@@ -364,9 +382,10 @@ def make_wasi_python(context, working_dir):
 
     exec_script = working_dir / "python.sh"
     call([exec_script, "--version"], quiet=False)
-    print(
-        f"๐ŸŽ‰ Use `{exec_script.relative_to(context.init_dir)}` "
-        "to run CPython w/ the WASI host specified by --host-runner"
+    log(
+        "๐ŸŽ‰",
+        f"Use `{exec_script.relative_to(context.init_dir)}` "
+        "to run CPython w/ the WASI host specified by --host-runner",
     )
 
 
@@ -385,12 +404,12 @@ def build_all(context):
 def clean_contents(context):
     """Delete all files created by this script."""
     if CROSS_BUILD_DIR.exists():
-        print(f"๐Ÿงน Deleting {CROSS_BUILD_DIR} ...")
+        log("๐Ÿงน", f"Deleting {CROSS_BUILD_DIR} ...")
         shutil.rmtree(CROSS_BUILD_DIR)
 
     if LOCAL_SETUP.exists():
         if LOCAL_SETUP.read_bytes() == LOCAL_SETUP_MARKER:
-            print(f"๐Ÿงน Deleting generated {LOCAL_SETUP} ...")
+            log("๐Ÿงน", f"Deleting generated {LOCAL_SETUP} ...")
 
 
 def main():