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/ 三份规则与源码一致(无差异)
162 lines
4.9 KiB
Python
162 lines
4.9 KiB
Python
"""传输管理命令: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}")
|