2026-08-07 23:57:13 +08:00
|
|
|
|
"""先在 Gitea Wiki 创建任务归档,再登记并导出本地镜像。"""
|
2026-08-07 23:11:25 +08:00
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
|
|
import re
|
|
|
|
|
|
from datetime import date
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
2026-08-07 23:57:13 +08:00
|
|
|
|
from wiki_docs import (
|
|
|
|
|
|
DEFAULT_CONFIG,
|
|
|
|
|
|
Mapping,
|
|
|
|
|
|
WikiClient,
|
|
|
|
|
|
WikiDocsError,
|
|
|
|
|
|
append_mapping,
|
|
|
|
|
|
load_config,
|
|
|
|
|
|
sync_all,
|
|
|
|
|
|
)
|
2026-08-07 23:11:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def safe_title(title: str) -> str:
|
2026-08-07 23:57:13 +08:00
|
|
|
|
"""把标题转换为适合 Wiki 页面名和 Windows 文件名的短文本。"""
|
2026-08-07 23:11:25 +08:00
|
|
|
|
|
|
|
|
|
|
cleaned = re.sub(r'[<>:"/\\|?*]', "-", title.strip())
|
|
|
|
|
|
cleaned = re.sub(r"\s+", "-", cleaned)
|
2026-08-07 23:57:13 +08:00
|
|
|
|
cleaned = re.sub(r"-+", "-", cleaned)
|
2026-08-07 23:11:25 +08:00
|
|
|
|
return cleaned.strip(".-")
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-08-07 23:57:13 +08:00
|
|
|
|
def build_archive(
|
|
|
|
|
|
template: str,
|
|
|
|
|
|
issue_number: str,
|
|
|
|
|
|
title: str,
|
|
|
|
|
|
page_name: str,
|
|
|
|
|
|
issue_url: str,
|
|
|
|
|
|
) -> str:
|
|
|
|
|
|
content = template.replace("<工单号>", issue_number, 1)
|
2026-08-07 23:11:25 +08:00
|
|
|
|
content = content.replace("<标题>", title.strip(), 1)
|
|
|
|
|
|
content = content.replace("YYYY-MM-DD", date.today().isoformat(), 1)
|
2026-08-07 23:57:13 +08:00
|
|
|
|
content = content.replace("<链接>", issue_url, 1)
|
|
|
|
|
|
return content.replace("<页面名>", page_name, 1)
|
2026-08-07 23:11:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-08-07 23:57:13 +08:00
|
|
|
|
def main() -> int:
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
|
|
description="在 Gitea Wiki 创建任务归档并导出 docs/task 镜像"
|
|
|
|
|
|
)
|
2026-08-07 23:11:25 +08:00
|
|
|
|
parser.add_argument("issue_number", help="Gitea 工单号,例如 123")
|
|
|
|
|
|
parser.add_argument("title", help="简短任务标题")
|
2026-08-07 23:57:13 +08:00
|
|
|
|
parser.add_argument("--config", default=str(DEFAULT_CONFIG), help="Wiki 映射配置")
|
2026-08-07 23:11:25 +08:00
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
2026-08-07 23:57:13 +08:00
|
|
|
|
short_title = safe_title(args.title)
|
|
|
|
|
|
if not args.issue_number.isdigit():
|
|
|
|
|
|
print("错误:工单号必须是数字")
|
|
|
|
|
|
return 1
|
|
|
|
|
|
if not short_title:
|
|
|
|
|
|
print("错误:标题不能为空")
|
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
config = load_config(Path(args.config).resolve())
|
|
|
|
|
|
page_name = f"Task-{args.issue_number}-{short_title}"
|
|
|
|
|
|
local_path = f"docs/task/{args.issue_number}-{short_title}.md"
|
|
|
|
|
|
mapping = Mapping(page=page_name, path=local_path)
|
|
|
|
|
|
if any(
|
|
|
|
|
|
item.page == mapping.page or item.path == mapping.path
|
|
|
|
|
|
for item in config.mappings
|
|
|
|
|
|
):
|
|
|
|
|
|
raise WikiDocsError(f"任务归档已经登记:{page_name}")
|
|
|
|
|
|
|
|
|
|
|
|
client = WikiClient(config)
|
|
|
|
|
|
template = client.get_page("Task-Archive-Template").text
|
|
|
|
|
|
issue_url = (
|
|
|
|
|
|
f"{config.gitea_url}/{config.owner}/{config.repository}/issues/"
|
|
|
|
|
|
f"{args.issue_number}"
|
|
|
|
|
|
)
|
|
|
|
|
|
content = build_archive(
|
|
|
|
|
|
template, args.issue_number, args.title, page_name, issue_url
|
|
|
|
|
|
)
|
|
|
|
|
|
page = client.create_page(
|
|
|
|
|
|
page_name,
|
|
|
|
|
|
content,
|
|
|
|
|
|
f"docs: 创建任务 #{args.issue_number} 归档草稿",
|
|
|
|
|
|
)
|
|
|
|
|
|
append_mapping(config, mapping)
|
|
|
|
|
|
updated_config = load_config(config.path)
|
|
|
|
|
|
messages = sync_all(updated_config, client)
|
|
|
|
|
|
except WikiDocsError as exc:
|
|
|
|
|
|
print(f"错误:{exc}")
|
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
|
|
print(f"已创建 Wiki:{page.html_url}")
|
|
|
|
|
|
for message in messages:
|
|
|
|
|
|
print(message)
|
|
|
|
|
|
print(f"已登记镜像:{local_path}")
|
|
|
|
|
|
return 0
|
2026-08-07 23:11:25 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2026-08-07 23:57:13 +08:00
|
|
|
|
raise SystemExit(main())
|