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:
mihailkudravcev
2026-07-23 15:24:59 +03:00
parent ecddcef586
commit 02a05d34d0
5 changed files with 417 additions and 120 deletions
+119 -23
View File
@@ -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