"""history 命令 — 查询对象版本历史。""" from __future__ import annotations import argparse import logging from sapcli.client import ADTClient from sapcli.exceptions import ObjectNotFoundError from sapcli.types import get_type_config, parse_object_name logger = logging.getLogger("sapcli.commands.history") def _format_date(value: str) -> str: """ISO 日期 ``2026-06-15T10:30:00`` → ``2026-06-15 10:30:00``。""" if not value: return "" return value.replace("T", " ").rstrip("Z").strip() def cmd_history(args: argparse.Namespace, client: ADTClient) -> None: """查询对象的版本历史。""" name: str = args.name obj_type: str = args.type parsed = parse_object_name(name, obj_type) type_label = get_type_config(obj_type).label print("=" * 60) print(" 对象版本历史") print("=" * 60) print(f" 对象类型: {type_label}") print(f" 对象名称: {parsed.display_name}") print(f"\n → 检查对象是否存在...") if not client.object_exists(parsed.obj_uri): print(f" ✗ 对象不存在: {parsed.display_name}") raise ObjectNotFoundError(parsed.display_name, obj_type) print(" ✓ 对象存在") print(f"\n → 正在查询版本历史...") try: versions = client.get_object_versions(parsed.obj_uri) except Exception as e: print(f" ✗ 查询版本历史失败: {e}") return if not versions: print(" ℹ 未找到版本历史") return print(f" ✓ 找到 {len(versions)} 个版本\n") print( f" {'Version':<10} {'Author':<12} {'Date':<22} Description" ) print( f" {'─' * 10} {'─' * 12} {'─' * 22} {'─' * 30}" ) for v in versions: version = v.get("version", "") or "active" author = v.get("author", "") date = _format_date(v.get("date", "")) title = v.get("versionTitle", "") print(f" {version:<10} {author:<12} {date:<22} {title}") print()