Files
sap-cli-skill/assets/sapcli/commands/transport.py
T
WuRangyu 02bc2c5165 v2.3.0: info 新增开发包/传输请求字段 (纯只读 E071)
- info 输出新增「开发包」(packageRef)、「传输请求」(纯只读查 E071)

- 优雅降级: 无请求/查询失败/非独立传输对象, 不中断 info

- bump 2.2.1 -> 2.3.0

- pack 从源码同步 (含 parser/transport 最新代码)
2026-08-06 11:57:36 +08:00

162 lines
4.9 KiB
Python
Raw 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)。"""
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(f"\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(f"\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}")