feat: --retry -1 无限次自动补传

This commit is contained in:
AskaEth committed 2026-08-22 14:05:26 +08:00
1 parent 81857d6343
commit ae875cb710
2 files changed
+17 -7

No files matched your search

+4
View File
@@ -366,3 +366,7 @@ def test_count_files_only_files(tmp_path):
(tmp_path / "a.txt").write_text("x")
(tmp_path / "dir1").mkdir()
assert transfer.count_files(str(tmp_path)) == 1 # 目录不计
def test_parse_args_retry_infinite():
args = transfer.parse_args(["--retry", "-1", "s", "d"])
assert args.retry == -1 # 无限重试
+13 -7
View File
@@ -442,7 +442,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser.add_argument("--verify", action="store_true",
help="传输完成后校验 (-c)")
parser.add_argument("--retry", type=int, default=0,
help="失败自动补传轮数 (默认 0)")
help="失败自动补传轮数 (-1=无限, 默认 0 不重试)")
parser.add_argument("--mode", choices=["cli", "tui"], default=None,
help="运行模式 (默认: 有任务=cli, 无任务=tui)")
parser.add_argument("--keep-logs", type=int, default=20,
@@ -591,18 +591,24 @@ class TaskRunner:
def run(self) -> int:
"""执行传输: 失败自动补传(retry) + 完成后校验(verify)"""
rc = 0
for attempt in range(self.cfg.retry + 1):
attempt = 0
retry_label = "∞" if self.cfg.retry < 0 else str(self.cfg.retry)
while True:
if attempt > 0:
self.lm.write(f"=== 补传轮次 {attempt}/{self.cfg.retry} ===")
self.lm.write(f"=== 补传轮次 {attempt}/{retry_label} ===")
if self.on_log:
self.on_log(f"[yellow]补传轮次 {attempt}/{self.cfg.retry}[/]")
self.on_log(f"[yellow]补传轮次 {attempt}/{retry_label}[/]")
time.sleep(3) # 等守护恢复设备
rc = self._run_once()
if rc == 0 or self._stop.is_set():
break
self.lm.write(f"attempt {attempt + 1} failed rc={rc}")
if self.on_error and attempt < self.cfg.retry:
self.on_error(f"本轮退出码 {rc}, 将自动补传 ({attempt + 1}/{self.cfg.retry})")
attempt += 1
# retry=-1 无限重试; retry=N 重试 N 轮; retry=0 不重试
if self.cfg.retry >= 0 and attempt > self.cfg.retry:
break
self.lm.write(f"attempt {attempt} failed rc={rc}")
if self.on_error:
self.on_error(f"本轮退出码 {rc}, 将自动补传 ({attempt}/{retry_label})")
if rc == 0 and self.cfg.verify and self.cfg.backend in ("rsync",):
self._verify()
return rc