Support any 1C config dump and auto wiki URL from its git remote.
Add info command, -c/--config, derived repo.wiki.git target, and README for submodule/root workflows.
This commit is contained in:
+119
-23
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""CLI: export 1C Help (ru.html) to Markdown / Gitea wiki."""
|
||||
"""CLI: export 1C Help (ru.html) to Markdown / Gitea/GitLab wiki."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -12,8 +12,20 @@ if str(TOOL_ROOT) not in sys.path:
|
||||
sys.path.insert(0, str(TOOL_ROOT))
|
||||
|
||||
from export1c_help import __status__, __version__ # noqa: E402
|
||||
from export1c_help.config_version import read_config_version # noqa: E402
|
||||
from export1c_help.config_version import ( # noqa: E402
|
||||
read_config_name,
|
||||
read_config_version,
|
||||
)
|
||||
from export1c_help.export import export_help # noqa: E402
|
||||
from export1c_help.resolve import ( # noqa: E402
|
||||
ResolveError,
|
||||
git_remote_url,
|
||||
git_toplevel,
|
||||
resolve_config_root,
|
||||
resolve_src_root,
|
||||
resolve_wiki_url,
|
||||
slug_for_path,
|
||||
)
|
||||
from export1c_help.wiki import WikiPushError, prepare_wiki_clone, push_wiki # noqa: E402
|
||||
|
||||
|
||||
@@ -21,7 +33,7 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
p = argparse.ArgumentParser(
|
||||
prog="export_1c_help",
|
||||
description=(
|
||||
f"Выгрузка встроенной справки 1С (Ext/Help/ru.html) в Markdown / Gitea wiki. "
|
||||
f"Выгрузка встроенной справки любой конфигурации 1С в Markdown / wiki. "
|
||||
f"v{__version__} ({__status__})."
|
||||
),
|
||||
)
|
||||
@@ -29,29 +41,53 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
|
||||
sub = p.add_subparsers(dest="cmd", required=True)
|
||||
|
||||
i = sub.add_parser(
|
||||
"info",
|
||||
help="Показать src, версию, git remote и wiki URL для конфигурации",
|
||||
)
|
||||
_add_config_path_args(i)
|
||||
i.add_argument("--remote", default="origin", help="Git remote (по умолчанию origin)")
|
||||
i.add_argument(
|
||||
"--wiki-url",
|
||||
default=None,
|
||||
help="Явный wiki URL (иначе из remote конфигурации)",
|
||||
)
|
||||
i.set_defaults(func=cmd_info)
|
||||
|
||||
c = sub.add_parser("convert", help="Конвертация Help → Markdown в каталог")
|
||||
_add_convert_args(c)
|
||||
c.set_defaults(func=cmd_convert)
|
||||
|
||||
w = sub.add_parser("push", help="convert + push в Gitea wiki (.wiki.git)")
|
||||
w = sub.add_parser(
|
||||
"push",
|
||||
help="convert + push в wiki (явный --wiki-url или wiki репозитория конфигурации)",
|
||||
)
|
||||
_add_convert_args(w, require_out=False)
|
||||
w.add_argument(
|
||||
"--wiki-url",
|
||||
required=True,
|
||||
help="URL wiki-репозитория, напр. https://git.p7net.ru/1c/crm3_26.wiki.git",
|
||||
default=None,
|
||||
help=(
|
||||
"URL wiki-репозитория (…/repo.wiki.git). "
|
||||
"Если не задан — берётся из git remote конфигурации (…/repo.git → …/repo.wiki.git)"
|
||||
),
|
||||
)
|
||||
w.add_argument(
|
||||
"--remote",
|
||||
default="origin",
|
||||
help="Git remote конфигурации для авто-wiki URL (по умолчанию origin)",
|
||||
)
|
||||
w.add_argument(
|
||||
"--work-dir",
|
||||
type=Path,
|
||||
default=None,
|
||||
help="Локальный clone wiki (по умолчанию: <out-parent>/wiki_clone)",
|
||||
help="Локальный clone wiki (по умолчанию: out/wiki_clone-<slug>)",
|
||||
)
|
||||
w.add_argument(
|
||||
"-o",
|
||||
"--out",
|
||||
type=Path,
|
||||
default=None,
|
||||
help="Промежуточный каталог MD (по умолчанию: ./out/wiki-md)",
|
||||
help="Промежуточный каталог MD (по умолчанию: out/wiki-md-<slug>)",
|
||||
)
|
||||
w.add_argument(
|
||||
"--keep-unmanaged",
|
||||
@@ -66,14 +102,25 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
return p
|
||||
|
||||
|
||||
def _add_convert_args(p: argparse.ArgumentParser, *, require_out: bool = True) -> None:
|
||||
p.add_argument(
|
||||
def _add_config_path_args(p: argparse.ArgumentParser) -> argparse._MutuallyExclusiveGroup:
|
||||
g = p.add_mutually_exclusive_group(required=True)
|
||||
g.add_argument(
|
||||
"-c",
|
||||
"--config",
|
||||
type=Path,
|
||||
help="Корень выгрузки конфигурации (каталог с src/) или сам src/",
|
||||
)
|
||||
g.add_argument(
|
||||
"-s",
|
||||
"--src",
|
||||
type=Path,
|
||||
required=True,
|
||||
help="Каталог src выгрузки конфигурации (…/crm3-26/src)",
|
||||
help="Каталог src выгрузки (эквивалент -c …/src)",
|
||||
)
|
||||
return g
|
||||
|
||||
|
||||
def _add_convert_args(p: argparse.ArgumentParser, *, require_out: bool = True) -> None:
|
||||
_add_config_path_args(p)
|
||||
if require_out:
|
||||
p.add_argument(
|
||||
"-o",
|
||||
@@ -111,6 +158,14 @@ def _add_convert_args(p: argparse.ArgumentParser, *, require_out: bool = True) -
|
||||
)
|
||||
|
||||
|
||||
def _config_input(args: argparse.Namespace) -> Path:
|
||||
return args.config if getattr(args, "config", None) else args.src
|
||||
|
||||
|
||||
def _resolve_src(args: argparse.Namespace) -> Path:
|
||||
return resolve_src_root(_config_input(args))
|
||||
|
||||
|
||||
def _print_stats(stats, dest: Path) -> None:
|
||||
print(
|
||||
f"OK: config={stats.config_version} "
|
||||
@@ -122,14 +177,42 @@ def _print_stats(stats, dest: Path) -> None:
|
||||
)
|
||||
|
||||
|
||||
def cmd_info(args: argparse.Namespace) -> int:
|
||||
try:
|
||||
src = _resolve_src(args)
|
||||
root = resolve_config_root(src)
|
||||
wiki = resolve_wiki_url(src, wiki_url=args.wiki_url, remote=args.remote)
|
||||
except ResolveError as exc:
|
||||
print(f"error: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
top = git_toplevel(root)
|
||||
remote_url = git_remote_url(root, remote=args.remote)
|
||||
print(f"config_root: {root}")
|
||||
print(f"src: {src}")
|
||||
print(f"config_name: {read_config_name(src) or '—'}")
|
||||
print(f"config_version: {read_config_version(src)}")
|
||||
print(f"git_toplevel: {top or '—'}")
|
||||
print(f"git_remote({args.remote}): {remote_url or '—'}")
|
||||
print(f"wiki_url: {wiki}")
|
||||
print(f"slug: {slug_for_path(src)}")
|
||||
return 0
|
||||
|
||||
|
||||
def cmd_convert(args: argparse.Namespace) -> int:
|
||||
try:
|
||||
src = _resolve_src(args)
|
||||
except ResolveError as exc:
|
||||
print(f"error: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
stats = export_help(
|
||||
args.src,
|
||||
src,
|
||||
args.out,
|
||||
include_forms=not args.objects_only,
|
||||
skip_empty=not args.keep_empty,
|
||||
clean=args.clean,
|
||||
source_label=args.source_label,
|
||||
source_label=args.source_label or str(src),
|
||||
prev_manifest_path=args.prev_manifest,
|
||||
config_version=args.config_version,
|
||||
)
|
||||
@@ -138,27 +221,40 @@ def cmd_convert(args: argparse.Namespace) -> int:
|
||||
|
||||
|
||||
def cmd_push(args: argparse.Namespace) -> int:
|
||||
out = args.out or (TOOL_ROOT / "out" / "wiki-md")
|
||||
work = args.work_dir or (out.parent / "wiki_clone")
|
||||
try:
|
||||
src = _resolve_src(args)
|
||||
wiki_url = resolve_wiki_url(
|
||||
src, wiki_url=args.wiki_url, remote=args.remote
|
||||
)
|
||||
except ResolveError as exc:
|
||||
print(f"error: {exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
slug = slug_for_path(src)
|
||||
out = args.out or (TOOL_ROOT / "out" / f"wiki-md-{slug}")
|
||||
work = args.work_dir or (TOOL_ROOT / "out" / f"wiki_clone-{slug}")
|
||||
branch = args.branch
|
||||
|
||||
print(f"wiki_url: {wiki_url}")
|
||||
print(f"src: {src}")
|
||||
|
||||
try:
|
||||
prepare_wiki_clone(args.wiki_url, work, branch=branch)
|
||||
prepare_wiki_clone(wiki_url, work, branch=branch)
|
||||
except WikiPushError as exc:
|
||||
print(f"wiki prepare failed:\n{exc}", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
prev = args.prev_manifest or (work / "manifest.json")
|
||||
cfg = args.config_version or read_config_version(args.src)
|
||||
cfg = args.config_version or read_config_version(src)
|
||||
|
||||
stats = export_help(
|
||||
args.src,
|
||||
src,
|
||||
out,
|
||||
include_forms=not args.objects_only,
|
||||
skip_empty=not args.keep_empty,
|
||||
clean=True,
|
||||
source_label=args.source_label or str(args.src),
|
||||
prev_manifest_path=prev if prev.is_file() else None,
|
||||
source_label=args.source_label or str(src),
|
||||
prev_manifest_path=prev if Path(prev).is_file() else None,
|
||||
config_version=cfg,
|
||||
)
|
||||
print(
|
||||
@@ -178,7 +274,7 @@ def cmd_push(args: argparse.Namespace) -> int:
|
||||
try:
|
||||
push_wiki(
|
||||
out,
|
||||
args.wiki_url,
|
||||
wiki_url,
|
||||
work_dir=work,
|
||||
message=message,
|
||||
branch=branch,
|
||||
@@ -188,7 +284,7 @@ def cmd_push(args: argparse.Namespace) -> int:
|
||||
except WikiPushError as exc:
|
||||
print(f"push failed:\n{exc}", file=sys.stderr)
|
||||
return 1
|
||||
print(f"OK: pushed → {args.wiki_url}")
|
||||
print(f"OK: pushed → {wiki_url}")
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user