https://github.com/python/cpython/commit/abd19eddee20a7d05266f11f6042a84b04d29664
commit: abd19eddee20a7d05266f11f6042a84b04d29664
branch: main
author: Brett Cannon <[email protected]>
committer: brettcannon <[email protected]>
date: 2025-10-30T10:35:53-07:00
summary:
Make printing log lines to the terminal a little cleaner when building WASI
(GH-140772)
files:
M Tools/wasm/wasi/__main__.py
diff --git a/Tools/wasm/wasi/__main__.py b/Tools/wasm/wasi/__main__.py
index 50372cf6555de2..bb5ce30c5d8b4f 100644
--- a/Tools/wasm/wasi/__main__.py
+++ b/Tools/wasm/wasi/__main__.py
@@ -37,6 +37,30 @@
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 wrapper(context):
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():
_______________________________________________
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]