From 447d56a960f6dcf4364803c1e166ad35b74639b9 Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Mon, 25 May 2026 19:55:08 +0200 Subject: [PATCH] fix: skip empty or unparseable athlete.json in merge_all --- bincio/render/merge.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/bincio/render/merge.py b/bincio/render/merge.py index 34c5db4..3d056f3 100644 --- a/bincio/render/merge.py +++ b/bincio/render/merge.py @@ -326,7 +326,7 @@ def _merge_all_locked(data_dir: Path) -> int: athlete_dest = merged_dir / "athlete.json" if athlete_dest.exists() or athlete_dest.is_symlink(): athlete_dest.unlink() - if athlete_src.exists(): + if athlete_src.exists() and athlete_src.stat().st_size > 0: athlete_edits_path = data_dir / "edits" / "athlete.yaml" if athlete_edits_path.exists(): try: @@ -338,9 +338,12 @@ def _merge_all_locked(data_dir: Path) -> int: edits = {} _ATHLETE_EDITABLE = {"max_hr", "ftp_w", "hr_zones", "power_zones", "seasons", "gear"} if edits: - athlete_data = json.loads(athlete_src.read_text(encoding="utf-8")) - athlete_data.update({k: v for k, v in edits.items() if k in _ATHLETE_EDITABLE}) - athlete_dest.write_text(_dumps(athlete_data)) + try: + athlete_data = json.loads(athlete_src.read_text(encoding="utf-8")) + athlete_data.update({k: v for k, v in edits.items() if k in _ATHLETE_EDITABLE}) + athlete_dest.write_text(_dumps(athlete_data)) + except (json.JSONDecodeError, OSError): + pass else: athlete_dest.symlink_to(athlete_src.resolve())