mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-08 19:13:47 -06:00
fix: fit the progress line to the terminal
This commit is contained in:
1 parent
8247895664
commit
e2d329c6ef
4 files changed
+53
-12
No files matched your search
+1
-1
@@ -8,7 +8,7 @@ param(
|
|||||||
|
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
$defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
|
$defaultInstallUrl = "https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
|
||||||
$defaultInstallSha256 = "324baf5363d46da75cb7f166e83b323a40ce6502084314360f909e9d1ff4dd4e"
|
$defaultInstallSha256 = "aec72e43585459efb0fd49d2eafb49b0e898b9ddc0f9ca2f44c7636080e21425"
|
||||||
$maximumInstallerBytes = 2MB
|
$maximumInstallerBytes = 2MB
|
||||||
$installerExit = 0
|
$installerExit = 0
|
||||||
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
|
$installer = if ($PSScriptRoot) { Join-Path $PSScriptRoot "install.py" } else { $null }
|
||||||
|
|||||||
+25
-10
@@ -340,19 +340,34 @@ class Progress:
|
|||||||
|
|
||||||
def _draw(self) -> None:
|
def _draw(self) -> None:
|
||||||
share = min(self.bytes / self.total_bytes, 1.0)
|
share = min(self.bytes / self.total_bytes, 1.0)
|
||||||
filled = int(share * self.BAR)
|
|
||||||
bar = "#" * filled + "-" * (self.BAR - filled)
|
|
||||||
elapsed = self.elapsed()
|
elapsed = self.elapsed()
|
||||||
speed = self.bytes / elapsed if elapsed > 0 else 0
|
speed = self.bytes / elapsed if elapsed > 0 else 0
|
||||||
left = (self.total_bytes - self.bytes) / speed if speed > 0 else 0
|
left = (self.total_bytes - self.bytes) / speed if speed > 0 else 0
|
||||||
text = (
|
parts = [
|
||||||
f" [{bar}] {share * 100:5.1f}% "
|
f"{share * 100:5.1f}%",
|
||||||
f"{format_size(self.bytes)} / {format_size(self.total_bytes)} "
|
f"{format_size(self.bytes)} / {format_size(self.total_bytes)}",
|
||||||
f"{format_size(int(speed))}/s "
|
f"{format_size(int(speed))}/s",
|
||||||
f"{format_duration(left)} left "
|
f"{format_duration(left)} left",
|
||||||
f"({self.files}/{self.total_files} files)"
|
f"({self.files}/{self.total_files} files)",
|
||||||
)
|
]
|
||||||
print(f"\r\033[K{text}", end="", file=self.term.stream, flush=True)
|
# 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.
|
# The three RetroArch packages published for Android, newest ABI first.
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ esac
|
|||||||
TEMP_INSTALLER=""
|
TEMP_INSTALLER=""
|
||||||
TEMP_DIRECTORY=""
|
TEMP_DIRECTORY=""
|
||||||
DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
|
DEFAULT_INSTALL_URL="https://raw.githubusercontent.com/Abdess/retrobios/main/install.py"
|
||||||
DEFAULT_INSTALL_SHA256="324baf5363d46da75cb7f166e83b323a40ce6502084314360f909e9d1ff4dd4e"
|
DEFAULT_INSTALL_SHA256="aec72e43585459efb0fd49d2eafb49b0e898b9ddc0f9ca2f44c7636080e21425"
|
||||||
MAX_INSTALLER_BYTES=2097152
|
MAX_INSTALLER_BYTES=2097152
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
|||||||
@@ -2631,5 +2631,31 @@ class AChunkedCutIsADownloadFailure(unittest.TestCase):
|
|||||||
self.assertIn("IncompleteRead", reason)
|
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__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
Reference in new issue
Block a user