Show sync freshness status

This commit is contained in:
liuji
2026-10-10 17:59:30 +08:00
parent 913b601609
commit a0108a3c0e
3 changed files with 87 additions and 8 deletions
+30
View File
@@ -174,6 +174,18 @@ def run_git(args: list[str], env: dict[str, str]) -> subprocess.CompletedProcess
)
def read_sync_log() -> dict[str, object]:
"""Read the previously published sync log when it is available."""
path = ROOT / SYNC_LOG_PATH
if not path.exists():
return {}
try:
payload = json.loads(path.read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError):
return {}
return payload if isinstance(payload, dict) else {}
def publish(content: bytes, sync_log: dict[str, object]) -> None:
log_content = (json.dumps(sync_log, ensure_ascii=False, indent=2) + "\n").encode("utf-8")
targets = {
@@ -244,10 +256,28 @@ def sync() -> None:
sheets.append((name, headers, rows))
headers, rows = merge_sheets(sheets)
content = render_html(headers, rows)
previous_sync_log = read_sync_log()
previous_data_path = ROOT / PUBLISH_PATH
data_changed = (
not previous_data_path.exists()
or previous_data_path.read_bytes() != content
)
success_at = datetime.now(timezone.utc)
if data_changed:
last_data_update_at = success_at.isoformat().replace("+00:00", "Z")
last_data_update_at_shanghai = success_at.astimezone(ZoneInfo("Asia/Shanghai")).isoformat()
else:
last_data_update_at = previous_sync_log.get("last_data_update_at")
last_data_update_at_shanghai = previous_sync_log.get("last_data_update_at_shanghai")
if not isinstance(last_data_update_at, str) or not last_data_update_at:
last_data_update_at = None
if not isinstance(last_data_update_at_shanghai, str) or not last_data_update_at_shanghai:
last_data_update_at_shanghai = None
sync_log = {
"last_success_at": success_at.isoformat().replace("+00:00", "Z"),
"last_success_at_shanghai": success_at.astimezone(ZoneInfo("Asia/Shanghai")).isoformat(),
"last_data_update_at": last_data_update_at,
"last_data_update_at_shanghai": last_data_update_at_shanghai,
"worksheet_count": len(worksheet_names),
"record_count": len(rows),
"artifact_bytes": len(content),