From 087f57e62ebb2a6aa3071a223e6fbe04b1bd15a1 Mon Sep 17 00:00:00 2001 From: CrispusCrew Date: Fri, 1 Aug 2025 19:00:41 +0300 Subject: [PATCH 1/3] Gitea support with manual test --- i18n/ru/.hashes.json | 4 +- release/lists/gitea/templates.list | 1 + release/lists/gitea/wiki.list | 1 + release/src/preparer/ListLoader.py | 97 +++++++++++++++++++++--------- release/src/preparer/Translate.py | 2 +- release/src/preparer/Units.py | 17 +----- 6 files changed, 79 insertions(+), 43 deletions(-) create mode 100644 release/lists/gitea/templates.list create mode 100644 release/lists/gitea/wiki.list diff --git a/i18n/ru/.hashes.json b/i18n/ru/.hashes.json index 4187e91..864cc89 100644 --- a/i18n/ru/.hashes.json +++ b/i18n/ru/.hashes.json @@ -8,5 +8,7 @@ "git/templates/.github/ISSUE_TEMPLATE/experimental.md": "88dde5d2feaaa95ccca48bdd595b9f32314a3d1ef14892ff92f445691cc2b8de", "git/templates/.github/ISSUE_TEMPLATE/config.yml": "b795747dcc0f3f6e7f7c99b87f06f56c6a4718c6dcd7c4031befc25438b59055", "git/templates/.github/ISSUE_TEMPLATE/refactor.md": "64d05da46ea4eb34bddef9057eb2be131ba5c9c103f1bfd44650ac420b1ed580", - "git/templates/.github/ISSUE_TEMPLATE/epic.md": "75ae9437ead05d9a8a6289e6af43ec6a720272e0fe3c2c39be134ea2ff66ad55" + "git/templates/.github/ISSUE_TEMPLATE/epic.md": "75ae9437ead05d9a8a6289e6af43ec6a720272e0fe3c2c39be134ea2ff66ad55", + "git/rules/issue.md": "9b4efe2c2d29290d1426b5344c19a66585e88f292993a099c7b239cc8c4f453d", + "git/rules/branch.md": "522b95758f55b7ed4c1dbb6ab9bb1e778d20795139ffa5b1836baecc6cddb5e2" } \ No newline at end of file diff --git a/release/lists/gitea/templates.list b/release/lists/gitea/templates.list new file mode 100644 index 0000000..0dad267 --- /dev/null +++ b/release/lists/gitea/templates.list @@ -0,0 +1 @@ +git/templates/.github -> .gitea \ No newline at end of file diff --git a/release/lists/gitea/wiki.list b/release/lists/gitea/wiki.list new file mode 100644 index 0000000..de0e001 --- /dev/null +++ b/release/lists/gitea/wiki.list @@ -0,0 +1 @@ +@root git/rules \ No newline at end of file diff --git a/release/src/preparer/ListLoader.py b/release/src/preparer/ListLoader.py index d40e517..54c60b9 100644 --- a/release/src/preparer/ListLoader.py +++ b/release/src/preparer/ListLoader.py @@ -1,40 +1,83 @@ from pathlib import Path from release.src.utils.ConsoleIO import print_status +class BaseLineParser: + comment_marker = "#" + mapping_marker = "->" + root_prefix = "@root " + + @classmethod + def _commentoff(cls, raw: str) -> str: + raw = raw.strip() + if raw.startswith(cls.comment_marker): return None + if cls.comment_marker in raw: + raw = raw.split(cls.comment_marker, 1)[0].strip() + return raw or None + + @classmethod + def _split_mapping(cls, raw: str) -> tuple[str, str]: + if cls.mapping_marker in raw: + left, right = raw.split(cls.mapping_marker, 1) + else: + left, right = raw, raw + return left.strip(), right.strip() + + @classmethod + def _root_detect(cls, raw: str) -> tuple[str, bool]: + if raw.startswith(cls.root_prefix): + return raw[len(cls.root_prefix):].strip(), True + return raw, False + + @classmethod + def parse(cls, raw: str) -> tuple[Path, Path, bool] | None: + raw_clean = cls._commentoff(raw) + if raw_clean is None: return None + + raw_clean, root = cls._root_detect(raw) + + source_raw, dest_raw = cls._split_mapping(raw_clean) + + return Path(source_raw), Path(dest_raw), root + + class ListLoader: def __init__(self, source_dir: Path, dest_dir: Path): self.source_dir = source_dir.resolve() self.dest_dir = dest_dir.resolve() - def _parse_line(self, raw: str) -> tuple[Path, Path | None] | None: - raw = raw.strip() - if not raw or raw.startswith("#"): - return None - if "#" in raw: - raw = raw.split("#", 1)[0].strip() - if not raw: - return None - - if "->" in raw: - source_raw, dest_raw = map(str.strip, raw.split("->", 1)) - source = (self.source_dir / source_raw).resolve() - dest = (self.dest_dir / dest_raw).resolve() - else: - source = (self.source_dir / raw).resolve() - dest = (self.dest_dir / source.relative_to(self.source_dir)).resolve() + if self.dest_dir == self.source_dir: + raise ValueError(f"[ERR] destination must differ from source") + + def _recursive_load(self, source_raw : Path, dest_raw : Path, root : bool) -> list[tuple[Path, Path]]: + result: list[tuple[Path, Path]] = [] + src = (self.source_dir / source_raw).resolve() + dest = (self.dest_dir / dest_raw ).resolve() + + if not src.exists(): + raise FileNotFoundError(f"[ERR] Missing list file: {src}") + + if src.is_file(): + if root: + result.append((src, self.dest_dir / dest.name)) + else: + result.append((src, dest)) + elif src.is_dir(): + for path in src.rglob("*"): + if path.is_file(): + if root: + result.append((path, self.dest_dir / path.name)) + else: + rel = path.relative_to(src) + new_dest = dest / rel if dest else None + result.append((path, new_dest)) + return result - return (source, dest) - def load(self, list_path: Path) -> list[tuple[Path, Path | None]]: - result = [] + def load(self, list_path: Path) -> list[tuple[Path, Path]]: + result: list[tuple[Path, Path]] = [] if not list_path.exists(): - raise FileNotFoundError(f"[ERROR] Missing list file: {list_path}") + raise FileNotFoundError(f"[ERR] Missing list file: {list_path}") for line in list_path.read_text(encoding="utf-8").splitlines(): - parsed = self._parse_line(line) - if parsed is None: - continue - source, dest = parsed - if not source.exists(): - print_status("WRN", f"Missing: {source}") - result.append((source, dest)) + src, dst, is_root = BaseLineParser.parse(line) + result.extend(self._recursive_load(src, dst, is_root)) return result \ No newline at end of file diff --git a/release/src/preparer/Translate.py b/release/src/preparer/Translate.py index f6c228f..bd6f933 100644 --- a/release/src/preparer/Translate.py +++ b/release/src/preparer/Translate.py @@ -1,6 +1,6 @@ import hashlib, json, functools from pathlib import Path -from release.src.utils.ConsoleIO import print_status, promt +from release.src.utils.ConsoleIO import print_status, prompt def update_registry_on_success(func): @functools.wraps(func) diff --git a/release/src/preparer/Units.py b/release/src/preparer/Units.py index 4c43cb1..a308ea7 100644 --- a/release/src/preparer/Units.py +++ b/release/src/preparer/Units.py @@ -25,20 +25,9 @@ def __init__(self, name : str, manifest: Manifest, ppath : ProjectPath): def prepare(self): self._ensure_clean(self.dest_dir) - raw_entries = self.list_loader.load(self.list_path) - expanded_entries = [] - for src, dst in raw_entries: - if src.is_file(): - expanded_entries.append((src, dst)) - elif src.is_dir(): - for path in src.rglob("*"): - if path.is_file(): - rel = path.relative_to(src) - new_dest = dst / rel if dst else None - expanded_entries.append((path, new_dest)) - - - sources, destinations = zip(*expanded_entries) + entries = self.list_loader.load(self.list_path) + + sources, destinations = zip(*entries) translated_sources = self.translator.ensure_all(list(sources)) final_entries = list(zip(translated_sources, destinations)) From d0f4f5ab03f5b01b76d7042b5f4242a97f1f8d13 Mon Sep 17 00:00:00 2001 From: CrispusCrew Date: Mon, 11 Aug 2025 14:48:23 +0300 Subject: [PATCH 2/3] fix --- release/src/builder/Scriptgen.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/release/src/builder/Scriptgen.py b/release/src/builder/Scriptgen.py index af9f236..e55439e 100644 --- a/release/src/builder/Scriptgen.py +++ b/release/src/builder/Scriptgen.py @@ -75,9 +75,13 @@ def generate_script_header(self) -> bytes: cp -r "$TMPDIR/wiki"/* "$TMPDIR/wiki-repo/" cd "$TMPDIR/wiki-repo" - git add . - git commit -m "Update wiki from release bundle" - git push + git add -A + if ! git diff --cached --quiet; then + git commit -m "Update wiki from release bundle" + git push + else + echo "Wiki: no changes to commit" + fi echo "--- Templates ---" git clone "$BASE_URL.git" "$TMPDIR/main-repo" @@ -85,15 +89,19 @@ def generate_script_header(self) -> bytes: git checkout "$TEMPLATE_BRANCH" || git checkout -b "$TEMPLATE_BRANCH" TEMPLATE_ROOT="$TMPDIR/templates" - find "$TEMPLATE_ROOT" -type f | while read src; do - rel="${{src#$TEMPLATE_ROOT/}}" - mkdir -p "$(dirname "$rel")" - cp "$src" "$rel" - done - - git add . - git commit -m "Add templates from release bundle" - git push -u origin "$TEMPLATE_BRANCH" + if [ -d "$TEMPLATE_ROOT" ]; then + rsync -a "$TEMPLATE_ROOT"/ ./ + else + echo "Templates: directory not found: $TEMPLATE_ROOT" + fi + + git add -A + if ! git diff --cached --quiet; then + git commit -m "Add templates from release bundle" + git push -u origin "$TEMPLATE_BRANCH" + else + echo "Templates: no changes to commit" + fi echo "Done" exit 0 From b1cbd8ccbeecb09eb134fea1209de45519011677 Mon Sep 17 00:00:00 2001 From: CrispusCrew Date: Thu, 21 Aug 2025 13:44:06 +0300 Subject: [PATCH 3/3] gitea lists folder remove (has been for test only) --- release/lists/gitea/templates.list | 1 - release/lists/gitea/wiki.list | 1 - 2 files changed, 2 deletions(-) delete mode 100644 release/lists/gitea/templates.list delete mode 100644 release/lists/gitea/wiki.list diff --git a/release/lists/gitea/templates.list b/release/lists/gitea/templates.list deleted file mode 100644 index 0dad267..0000000 --- a/release/lists/gitea/templates.list +++ /dev/null @@ -1 +0,0 @@ -git/templates/.github -> .gitea \ No newline at end of file diff --git a/release/lists/gitea/wiki.list b/release/lists/gitea/wiki.list deleted file mode 100644 index de0e001..0000000 --- a/release/lists/gitea/wiki.list +++ /dev/null @@ -1 +0,0 @@ -@root git/rules \ No newline at end of file