fix: fit the progress line to the terminal

This commit is contained in:
Abdessamad Derraz committed 2026-10-18 16:26:01 +02:00
1 parent 8247895664
commit e2d329c6ef
4 files changed
+53 -12

No files matched your search

+1 -1
View File
@@ -8,7 +8,7 @@ param(
$ErrorActionPreference = "Stop"
$defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
$defaultInstallSha256 = "324baf5363d46da75cb7f166e83b323a40ce6502084314360f909e9d1ff4dd4e"
$defaultInstallSha256 = "aec72e43585459efb0fd49d2eafb49b0e898b9ddc0f9ca2f44c7636080e21425"
$maximumInstallerBytes = 2MB
$installerExit = 0
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
+25 -10
View File
@@ -340,19 +340,34 @@ class Progress:
def _draw(self) -> None:
share = min(self.bytes / self.total_bytes, 1.0)
filled = int(share * self.BAR)
bar = "#" * filled + "-" * (self.BAR - filled)
elapsed = self.elapsed()
speed = self.bytes / elapsed if elapsed > 0 else 0
left = (self.total_bytes - self.bytes) / speed if speed > 0 else 0
text = (
f" [{bar}] {share * 100:5.1f}% "
f"{format_size(self.bytes)} / {format_size(self.total_bytes)} "
f"{format_size(int(speed))}/s "
f"{format_duration(left)} left "
f"({self.files}/{self.total_files} files)"
)
print(f"\r\033[K{text}", end="", file=self.term.stream, flush=True)
parts = [
f"{share * 100:5.1f}%",
f"{format_size(self.bytes)} / {format_size(self.total_bytes)}",
f"{format_size(int(speed))}/s",
f"{format_duration(left)} left",
f"({self.files}/{self.total_files} files)",
]
# One physical line, whatever the width: \r\033[K clears only the
# line the cursor is on, so a wrapped line left a ghost per redraw
# on an 80-column console. The bar gives way first, then the least
# telling figures.
width = shutil.get_terminal_size((80, 24)).columns - 1
while True:
tail = " ".join(parts)
room = width - len(tail) - 6
if room >= 10 or len(parts) == 1:
break
parts.pop()
if room >= 10:
bar_width = min(self.BAR, room)
filled = int(share * bar_width)
text = f" [{'#' * filled}{'-' * (bar_width - filled)}] {tail}"
else:
text = f" {tail}"
print(f"\r\033[K{text[:width]}", end="", file=self.term.stream, flush=True)
# The three RetroArch packages published for Android, newest ABI first.
+1 -1
View File
@@ -18,7 +18,7 @@ esac
TEMP_INSTALLER=""
TEMP_DIRECTORY=""
DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
DEFAULT_INSTALL_SHA256="324baf5363d46da75cb7f166e83b323a40ce6502084314360f909e9d1ff4dd4e"
DEFAULT_INSTALL_SHA256="aec72e43585459efb0fd49d2eafb49b0e898b9ddc0f9ca2f44c7636080e21425"
MAX_INSTALLER_BYTES=2097152
cleanup() {
+26
View File
@@ -2631,5 +2631,31 @@ class AChunkedCutIsADownloadFailure(unittest.TestCase):
self.assertIn("IncompleteRead", reason)
class TheProgressLineFitsTheTerminal(unittest.TestCase):
"""At 80 columns the 94-100 column line wrapped, and every redraw left
a ghost line behind."""
def test_each_width(self):
import os as _os
for columns in (40, 60, 80, 120):
with self.subTest(columns=columns):
out = io.StringIO()
term = install.Terminal(out)
term.live = True
progress = install.Progress(5865, 2_300_000_000, term)
progress.bytes = 1_000_000_000
progress.files = 5000
with unittest.mock.patch.object(
install.shutil, "get_terminal_size",
return_value=_os.terminal_size((columns, 24)),
):
progress._draw()
line = out.getvalue().split("\033[K")[-1]
self.assertLess(len(line), columns)
self.assertIn("%", line)
if __name__ == "__main__":
unittest.main()