Estimate progress while rsync scans from the last backup's file count

With incremental recursion rsync only knows the total near the end, so the bar showed
no ETA for most of the backup. Save the file count as a third line of the state file
and use it as an estimate until rsync reports the real total.
This commit is contained in:
Fuxino
2026-11-02 20:56:12 +01:00
parent 5e33781974
commit ec27b8d77f
6 changed files with 142 additions and 19 deletions
+16 -2
View File
@@ -32,7 +32,8 @@ class FakeBackup:
def __init__(self, inputs: Any, output: Any, exclude: Any, keep: Any, options: str,
ssh_host: str | None = None, ssh_user: str | None = None,
ssh_keyfile: str | None = None, remote_sudo: bool = False,
remove_before: bool = False, verbose: bool = False, progress: bool = False) -> None:
remove_before: bool = False, verbose: bool = False, progress: bool = False,
file_estimate: int = 0) -> None:
self.inputs = inputs
self.output = output
self.exclude = exclude
@@ -45,6 +46,8 @@ class FakeBackup:
self.remove_before = remove_before
self.verbose = verbose
self.progress = progress
self.file_estimate = file_estimate
self.file_count: int | None = None
self.homedir: str | None = None
self.ran = False
self.closed = False
@@ -87,7 +90,7 @@ def as_root(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(os, 'geteuid', lambda: 0)
# Writing the state file as root would call seteuid() (covered in test_state.py)
monkeypatch.setattr(sb, '_write_state', lambda user, destination: None)
monkeypatch.setattr(sb, '_write_state', lambda user, destination, file_count=None: None)
for var in ['SUDO_USER', 'SUDO_UID', 'DOAS_USER']:
monkeypatch.delenv(var, raising=False)
@@ -266,6 +269,17 @@ ssh_keyfile=/keys/id
assert run_cli('-c', config('backup_dir=/backups'), *argv) == 0
assert last_backup().progress is progress
@pytest.mark.parametrize('tty, estimate', [(True, 1234), (False, 0)])
def test_file_estimate(self, run_cli: RunCli, config: Callable[[str], str], monkeypatch: pytest.MonkeyPatch,
tmp_path: Path, tty: bool, estimate: int) -> None:
monkeypatch.setattr(sb.sys.stderr, 'isatty', lambda: tty)
state = tmp_path / 'state' / 'simple_backup' / 'last_backup'
state.parent.mkdir(parents=True)
state.write_text('2026-10-25T10:00:00+02:00\n/backups/old\n1234\n')
assert run_cli('-c', config('backup_dir=/backups')) == 0
assert last_backup().file_estimate == estimate
def test_check_params_failure(self, run_cli: RunCli, config: Callable[[str], str]) -> None:
FakeBackup.check_code = 2