Files
吴让宇 e786742bcb chore: 同步至源码 2.5.1 — SKILL.md 改为构建产物 + 工具代码刷新
SKILL.md(唯一来源 = sap-cli/skill-src/SKILL.md.tmpl):
- 本仓 SKILL.md 自此为构建产物,勿手工编辑;手改后再构建会被漂移护栏拦下
- 并入模板独有内容:调用方式节 + 补齐 parser 真实命令(clone/enhancement/
  history/unit-test/unlock/transport create,原表只 9 个,实际 31 个)
- 版本号改为 {{VERSION}} 注入(原字面量停在 v2.2.1/v2.3.0,与工具实际版本脱节)
- 修 1 处违反铁律 5 的示例(--path ./src → ./src/TMP/class/)

assets/(工具代码,此前严重过时):
- 9 个文件与源码不一致,scanner.py 尤甚:3818B → 6664B
- 修复前从本仓装出的工具**不支持三层 src 结构**,铁律 5 实际跑不通
- transport.py 反向漂移(分发版多 transport create,源码无)已随源码回迁对齐

VERSION 2.5.1;references/ 三份规则与源码一致(无差异)
2026-09-11 00:22:05 +08:00

162 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""传输管理命令:transport (list / info / release / objects / create)。"""
from __future__ import annotations
import argparse
import logging
from sapcli.client import ADTClient
logger = logging.getLogger("sapcli.commands.transport")
def cmd_transport(args: argparse.Namespace, client: ADTClient) -> None:
"""传输请求管理。"""
action = getattr(args, "transport_action", None)
if action == "list":
_transport_list(args, client)
elif action == "info":
_transport_info(args, client)
elif action == "release":
_transport_release(args, client)
elif action == "objects":
_transport_objects(args, client)
elif action == "create":
_transport_create(args, client)
else:
print(" 用法: sap-cli transport [list|info|release|objects|create]")
print(" list — 列出可修改的传输请求")
print(" info — 查看传输请求详情")
print(" release — 释放传输请求")
print(" objects — 列出传输请求中的对象")
print(" create — 新建传输请求 (--description)")
def _transport_list(args: argparse.Namespace, client: ADTClient) -> None:
"""列出可修改的传输请求。"""
print("=" * 60)
print(" SAP 传输请求列表")
print("=" * 60)
print(f"\n → 正在查询传输请求...")
try:
requests_list = client.list_transport_requests()
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
if not requests_list:
print(" ℹ 未找到可修改的传输请求")
return
print(f" ✓ 找到 {len(requests_list)} 个传输请求\n")
print(f" {'编号':<15s} {'描述':<40s} {'所有者':<15s}")
print(f" {'─' * 15} {'─' * 40} {'─' * 15}")
for req in requests_list:
num = req.get("number", "")[:15]
desc = req.get("description", "")[:40]
owner = req.get("owner", "")[:15]
print(f" {num:<15s} {desc:<40s} {owner:<15s}")
def _transport_info(args: argparse.Namespace, client: ADTClient) -> None:
"""查看传输请求详情。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 传输请求详情")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n → 正在查询...")
try:
info = client.transport_info(corr_nr)
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
print(f"\n {'─' * 50}")
print(f" 描述: {info.get('description', '')}")
print(f" 状态: {info.get('status', '')}")
print(f" 所有者: {info.get('owner', '')}")
print(f" {'─' * 50}")
def _transport_release(args: argparse.Namespace, client: ADTClient) -> None:
"""释放传输请求。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 释放传输请求")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n ⚠️ 即将释放传输请求: {corr_nr}")
confirm = input(" 确认释放? (输入 yes 确认): ").strip()
if confirm.lower() != "yes":
print(" 已取消释放操作")
return
print(f"\n → 正在释放...")
try:
success = client.transport_release(corr_nr)
except Exception as e:
print(f" ✗ 释放失败: {e}")
return
if success:
print(f" ✓ 传输请求 {corr_nr} 已成功释放!")
else:
print(f" ✗ 释放失败,请检查传输请求状态")
def _transport_create(args: argparse.Namespace, client: ADTClient) -> None:
"""新建传输请求。"""
description: str = args.description
print("=" * 60)
print(" SAP 新建传输请求")
print("=" * 60)
print(f" 描述: {description}")
print("\n → 正在创建...")
try:
new_nr = client.create_transport_request(description)
except Exception as e:
print(f" ✗ 创建失败: {e}")
return
if new_nr:
print(f"\n ✓ 传输请求已创建: {new_nr}")
else:
print("\n ✗ 创建失败(未返回编号),请检查系统或描述合法性")
def _transport_objects(args: argparse.Namespace, client: ADTClient) -> None:
"""列出传输请求中的对象。"""
corr_nr: str = args.corr_nr
print("=" * 60)
print(" SAP 传输请求对象列表")
print("=" * 60)
print(f" 传输请求: {corr_nr}")
print(f"\n → 正在查询...")
try:
objects = client.transport_objects(corr_nr)
except Exception as e:
print(f" ✗ 查询失败: {e}")
return
if not objects:
print(" 传输请求中无对象")
return
print(f" ✓ 找到 {len(objects)} 个对象\n")
print(f" {'名称':<30s} {'类型':<15s}")
print(f" {'─' * 30} {'─' * 15}")
for obj in objects:
obj_name = obj.get("name", "")[:30]
obj_type = obj.get("type", "")[:15]
print(f" {obj_name:<30s} {obj_type:<15s}")