"""Read 1C configuration version from dump tree."""
from __future__ import annotations
import re
from pathlib import Path
_VERSION_TAG = re.compile(r"([^<]+)")
_NAME_TAG = re.compile(
r"([^<]+)",
)
def config_root_from_src(src_root: Path) -> Path:
"""src/ → configuration root (parent that usually has VERSION + Configuration.xml)."""
src_root = Path(src_root).resolve()
if src_root.name == "src":
return src_root.parent
return src_root
def read_config_version(src_root: Path) -> str:
"""
Resolve configuration version.
Priority:
1. /VERSION
2. /src/Configuration.xml →
3. /Configuration.xml →
"""
src_root = Path(src_root)
root = config_root_from_src(src_root)
version_file = root / "VERSION"
if version_file.is_file():
text = version_file.read_text(encoding="utf-8-sig", errors="ignore").strip()
if text:
return text.splitlines()[0].strip()
for xml_path in (
root / "src" / "Configuration.xml",
src_root / "Configuration.xml",
root / "Configuration.xml",
):
if not xml_path.is_file():
continue
raw = xml_path.read_text(encoding="utf-8-sig", errors="ignore")
m = _VERSION_TAG.search(raw)
if m:
return m.group(1).strip()
return "unknown"
def read_config_name(src_root: Path) -> str | None:
src_root = Path(src_root)
root = config_root_from_src(src_root)
xml_path = root / "src" / "Configuration.xml"
if not xml_path.is_file():
xml_path = src_root / "Configuration.xml"
if not xml_path.is_file():
return None
raw = xml_path.read_text(encoding="utf-8-sig", errors="ignore")
m = _NAME_TAG.search(raw)
return m.group(1).strip() if m else None