emdashes begone (#10847)

This commit is contained in:
Tom
2026-07-01 19:01:27 -05:00
committed by GitHub
co-authored by GitHub
parent dee94e0758
commit 3becaf2d95
276 changed files with 1795 additions and 1793 deletions
+12 -12
View File
@@ -1,8 +1,8 @@
"""Session-bake module runs first in the tier order to flash both hub roles
"""Session-bake module - runs first in the tier order to flash both hub roles
with the session `test_profile`.
Ordered first by `pytest_collection_modifyitems` in `conftest.py` (bucket
-1) because `baked_mesh` only *verifies* state it does not reflash. Without
-1) because `baked_mesh` only *verifies* state - it does not reflash. Without
the explicit order pin, the top-level path `tests/test_00_bake.py` falls
into the fallback bucket and sorts AFTER every tier, silently turning
`--force-bake` into a no-op for the tier tests.
@@ -52,9 +52,9 @@ def _wait_port_free(port: str, *, timeout_s: float = 15.0, role: str = "") -> No
Root cause for the retry loop: esptool / nrfutil / pio all take an
*exclusive* serial port lock (fcntl LOCK_EX on macOS, EAGAIN otherwise).
Anything that held the port recently the TUI's startup `DevicePollerWorker._poll_once()`,
Anything that held the port recently - the TUI's startup `DevicePollerWorker._poll_once()`,
a prior `device_info` call, a lingering `meshtastic-mcp` subprocess
spawned by the operator's MCP host, or a stale `pio device monitor`
spawned by the operator's MCP host, or a stale `pio device monitor` -
can still be holding it when `test_00_bake` reaches the flash step. The
result is esptool exiting 2 in ~0.1s with `[Errno 35] Resource
temporarily unavailable`.
@@ -84,7 +84,7 @@ def _wait_port_free(port: str, *, timeout_s: float = 15.0, role: str = "") -> No
pass
return
raise AssertionError(
f"{role_prefix}port {port} still busy after {timeout_s:.0f}s "
f"{role_prefix}port {port} still busy after {timeout_s:.0f}s - "
f"something else holds an exclusive lock. Last error: {last_exc!r}. "
f"Identify the holder with `lsof {port}` and kill it; common "
f"culprits are a lingering `meshtastic-mcp` subprocess from the "
@@ -102,7 +102,7 @@ def _prepare_nrf52_for_upload(port: str) -> str:
`touch_1200bps` does the heavy lifting: bounded open/close, polls for the
Adafruit-bootloader PID specifically, retries the touch up to twice.
Fails loudly if the device doesn't enter DFU no point trying pio
Fails loudly if the device doesn't enter DFU - no point trying pio
upload against an app-mode device, it'll just hang.
"""
result = flash.touch_1200bps(port=port, settle_ms=500, retries=2)
@@ -162,14 +162,14 @@ def _bake_role(
# If we can't query, fall through and bake anyway.
pass
# All architectures go through `pio run -t upload` pio knows the right
# All architectures go through `pio run -t upload` - pio knows the right
# protocol per variant (esptool for ESP32, adafruit-nrfutil for nRF52,
# picotool for RP2040). We don't use `bin/device-install.sh` for ESP32
# because it requires the external `mt-esp32s3-ota.bin` helper that's
# downloaded from releases, not generated by the build.
#
# IMPORTANT: `pio run -t upload` on ESP32 only overwrites the APP
# partition the LittleFS partition (config + NodeDB) survives. That
# partition - the LittleFS partition (config + NodeDB) survives. That
# means USERPREFS-baked defaults never take effect on a device that was
# already provisioned, because NodeDB init prefers the saved config. To
# force USERPREFS to apply cleanly, we erase the full chip first on
@@ -184,7 +184,7 @@ def _bake_role(
if arch in _NRF52_ARCHES:
upload_port = _prepare_nrf52_for_upload(port)
elif arch in _ESP32_ARCHES:
# Full chip erase wipes NVS + LittleFS so USERPREFS defaults apply.
# Full chip erase - wipes NVS + LittleFS so USERPREFS defaults apply.
erase_result = hw_tools.esptool_erase_flash(port=port, confirm=True)
assert erase_result["exit_code"] == 0, (
f"{role}: esptool erase_flash failed:\n"
@@ -196,7 +196,7 @@ def _bake_role(
# Post-erase, pre-upload: full chip erase on ESP32 drops the CDC
# endpoint for a moment while the bootloader re-enters download mode.
# Wait for the port to settle before pio reopens it for upload
# Wait for the port to settle before pio reopens it for upload -
# otherwise a fast machine can race and hit the same errno 35.
if arch in _ESP32_ARCHES:
_wait_port_free(upload_port, role=role, timeout_s=10.0)
@@ -207,7 +207,7 @@ def _bake_role(
# and will restore the original file at session end. A local
# `temporary_overrides` here would be a no-op (file is already baked)
# AND would cause the session fixture's teardown to see different
# stat / mtime than it snapshotted keep the mutation in one place.
# stat / mtime than it snapshotted - keep the mutation in one place.
result = flash.flash(
env=env,
port=upload_port,
@@ -220,7 +220,7 @@ def _bake_role(
)
# Post-flash: for nRF52, the DFU process only overwrites the app
# partition the NVS region holding the existing NodeDB/config is
# partition - the NVS region holding the existing NodeDB/config is
# untouched, so the firmware will prefer the saved config over the
# baked USERPREFS defaults. Trigger a full factory reset to wipe NVS
# so USERPREFS takes effect on the next boot.