From a3f8059e6b62a9a0a6d4a8ef93aef4a79fce6e70 Mon Sep 17 00:00:00 2001 From: Walter Oggioni Date: Wed, 22 Apr 2026 22:08:45 +0800 Subject: [PATCH] improved progress bar --- pyproject.toml | 2 +- src/jpacrepo_uploader/uploader.py | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 532fb59..236c481 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "jpacrepo-uploader" -version = "0.0.7" +version = "0.0.8" authors = [ { name="Walter Oggioni", email="oggioni.walter@gmail.com" }, ] diff --git a/src/jpacrepo_uploader/uploader.py b/src/jpacrepo_uploader/uploader.py index 016185e..6a49818 100644 --- a/src/jpacrepo_uploader/uploader.py +++ b/src/jpacrepo_uploader/uploader.py @@ -3,6 +3,7 @@ import logging import re import shutil import urllib.parse +import sys from argparse import ArgumentParser from dataclasses import dataclass, fields from pathlib import Path @@ -56,6 +57,7 @@ class UploadPt: class PackageUploadProgressBar(Bar): def __init__(self, + headline: str, uploaded_size: int, packages_total_size: int, start_ts: float = monotonic(), @@ -63,8 +65,9 @@ class PackageUploadProgressBar(Bar): **kwargs: Any): kwargs.setdefault('suffix', 'speed: %(total_speed)s, completed: %(percent).2f%% - ETA: %(eta_td)s') - kwargs.setdefault('width', terminal_size[0] - 96) + kwargs.setdefault('width', max(0, terminal_size[0] - 72)) super().__init__(*args, **kwargs) + self._headline = headline self.uploaded_size = uploaded_size self.packages_total_size = packages_total_size self.start_ts = start_ts @@ -97,6 +100,19 @@ class PackageUploadProgressBar(Bar): def upload_progress(self) -> str: return f'{format_filesize(self.index, 5, 2)} / {format_filesize(self.max, 5, 2)}' + @staticmethod + def _clear_previous_line(): + sys.stdout.write("\033[1A\033[2K") + sys.stdout.flush() + + def __enter__(self): + print(self._headline) + return super().__enter__() + + def __exit__(self, exc_type, exc_val, exc_tb): + result = super().__exit__(exc_type, exc_val, exc_tb) + PackageUploadProgressBar._clear_previous_line() + return result class XferProgress: @@ -263,16 +279,16 @@ class JpacrepoClient: start_ts = monotonic() for i, file in enumerate(files): upload_size = file.stat().st_size - if len(file.name) <= 32: + if len(file.name) <= terminal_size[0]: filename = file.name else: - filename = file.name[:29] + '...' + filename = file.name[:terminal_size[0] - 3] + '...' kwargs = dict( + message='Uploading ', max=upload_size, - message=f'({i + 1}/{len(files)}) {filename}', start_ts=start_ts ) - with PackageUploadProgressBar(progress.uploaded_size, total_size, **kwargs) as bar: + with PackageUploadProgressBar(f'({i + 1}/{len(files)}) {filename}', progress.uploaded_size, total_size, **kwargs) as bar: bar.start_ts = start_ts progress.bar = bar self._upload_file(curl, file, progress)