From 97eea108fbba9f5337a3329d632f7b6aad45a6e2 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Sun, 27 Jul 2025 16:51:36 -0700 Subject: [PATCH] feat: exit on immutable files not all covered --- joj3_config_generator/transformers/repo.py | 17 ++++++++-- tests/convert/full/immutable/.gitattributes | 33 +++++++++++++++++++ .../full/immutable/.gitea/workflows/push.yaml | 19 +++++++++++ .../immutable/.gitea/workflows/release.yaml | 21 ++++++++++++ tests/convert/full/immutable/.gitignore | 23 +++++++++++++ tests/convert/full/task.json | 4 +-- 6 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 tests/convert/full/immutable/.gitattributes create mode 100644 tests/convert/full/immutable/.gitea/workflows/push.yaml create mode 100644 tests/convert/full/immutable/.gitea/workflows/release.yaml create mode 100644 tests/convert/full/immutable/.gitignore diff --git a/joj3_config_generator/transformers/repo.py b/joj3_config_generator/transformers/repo.py index fa3bb67..7a81229 100644 --- a/joj3_config_generator/transformers/repo.py +++ b/joj3_config_generator/transformers/repo.py @@ -1,4 +1,5 @@ import hashlib +import sys from pathlib import Path from typing import List, Tuple @@ -107,11 +108,23 @@ def get_check_lists(repo_conf: repo.Config) -> Tuple[List[str], List[str]]: immutable_files.append(file_path) file_sums.append(calc_sha256sum(file_path)) file_names.append(file) - immutable_dir = ( + new_immutable_dir = ( repo_conf.root / repo_conf.path ).parent / repo_conf.health_check.immutable_path - if not immutable_dir.exists(): + if not new_immutable_dir.exists(): + for file_path in sorted(immutable_dir.glob("**/*")): + relative_file_path = str(file_path.relative_to(immutable_dir)) + if relative_file_path not in file_names: + logger.error( + f"Immutable file exists in {immutable_dir}, " + f"but not found in health check: {relative_file_path}." + ) + logger.error( + f"Recommnd to move immutable files (keeping nested structure) to {new_immutable_dir}." + ) + sys.exit(1) return file_sums, file_names + immutable_dir = new_immutable_dir file_sums = [] file_names = [] for file_path in sorted(immutable_dir.glob("**/*")): diff --git a/tests/convert/full/immutable/.gitattributes b/tests/convert/full/immutable/.gitattributes new file mode 100644 index 0000000..b910c4a --- /dev/null +++ b/tests/convert/full/immutable/.gitattributes @@ -0,0 +1,33 @@ +*.avi filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.djvu filter=lfs diff=lfs merge=lfs -text +*.doc filter=lfs diff=lfs merge=lfs -text +*.docx filter=lfs diff=lfs merge=lfs -text +*.epub filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.ipynb filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.JPEG filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.JPG filter=lfs diff=lfs merge=lfs -text +*.mkv filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text +*.ods filter=lfs diff=lfs merge=lfs -text +*.odt filter=lfs diff=lfs merge=lfs -text +*.otf filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.PDF filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.PNG filter=lfs diff=lfs merge=lfs -text +*.ppt filter=lfs diff=lfs merge=lfs -text +*.pptx filter=lfs diff=lfs merge=lfs -text +*.ps filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.webm filter=lfs diff=lfs merge=lfs -text +*.xls filter=lfs diff=lfs merge=lfs -text +*.xlsx filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/tests/convert/full/immutable/.gitea/workflows/push.yaml b/tests/convert/full/immutable/.gitea/workflows/push.yaml new file mode 100644 index 0000000..1541fc1 --- /dev/null +++ b/tests/convert/full/immutable/.gitea/workflows/push.yaml @@ -0,0 +1,19 @@ +name: Run JOJ3 on Push +on: [push] + +jobs: + run: + container: + runs-on: focs-latest-slim + volumes: + - /home/tt/.config:/home/tt/.config + - /home/tt/.cache:/home/tt/.cache + - /home/tt/.ssh:/home/tt/.ssh + steps: + - name: Check out repository code + uses: actions/checkout@focs + with: + fetch-depth: 0 + - name: Run joj3 + run: | + sudo -E -u tt joj3 -conf-root /home/tt/.config/joj/tests/homework diff --git a/tests/convert/full/immutable/.gitea/workflows/release.yaml b/tests/convert/full/immutable/.gitea/workflows/release.yaml new file mode 100644 index 0000000..c1e0bef --- /dev/null +++ b/tests/convert/full/immutable/.gitea/workflows/release.yaml @@ -0,0 +1,21 @@ +name: Run JOJ3 on Release +on: + release: + types: [published] + +jobs: + run: + runs-on: focs-latest-slim + container: + volumes: + - /home/tt/.config:/home/tt/.config + - /home/tt/.cache:/home/tt/.cache + - /home/tt/.ssh:/home/tt/.ssh + steps: + - name: Check out repository code + uses: actions/checkout@focs + with: + fetch-depth: 0 + - name: Run joj3 + run: | + sudo -E -u tt joj3 -conf-root "/home/tt/.config/joj/tests/homework" -conf-name "conf-release.json" -tag "${{ gitea.ref_name }}" diff --git a/tests/convert/full/immutable/.gitignore b/tests/convert/full/immutable/.gitignore new file mode 100644 index 0000000..754f776 --- /dev/null +++ b/tests/convert/full/immutable/.gitignore @@ -0,0 +1,23 @@ +################################ +## White list based gitignore ## +################################ + +# forbidden +* +.* + +# allowed +!.gitignore +!.gitattributes +!.gitea/ +!.gitea/issue_template/ +!.gitea/workflows/ +!*.yaml +!Makefile +!CMakeLists.txt +!h[0-8]/ +!*.m +!*.c +!*.cpp +!*.h +!*.md diff --git a/tests/convert/full/task.json b/tests/convert/full/task.json index f74a5bf..2903715 100644 --- a/tests/convert/full/task.json +++ b/tests/convert/full/task.json @@ -64,8 +64,8 @@ "-repoSize=10.0", "-meta=README.md", "-meta=Changelog.md", - "-checkFileSumList=", - "-checkFileNameList=" + "-checkFileSumList=b1bbad25b830db0a77b15a033f9ca1b7ab44c1d2d05056412bd3e4421645f0bf,2ba059f3977e2e3dee6cacbfbf0ba2578baa1b8e04b4977aec400868b6e49856,3db23f7fb2ca9814617e767ddc41b77073180b3b0b73e87b5f2a6d3129f88f3a,a5b63323a692d3d8b952442969649b4f823d58dae26429494f613df160710dfc", + "-checkFileNameList=.gitattributes,.gitea/workflows/push.yaml,.gitea/workflows/release.yaml,.gitignore" ] }, {