diff --git a/pyproject.toml b/pyproject.toml index 4b05c38..7e93eab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "toltecmk" -version = "0.5.2" +version = "0.5.3" authors = [ { name="Mattéo Delabre", email="git.matteo@delab.re" }, { name="Eeems", email="eeems@eeems.email" }, diff --git a/toltec/hooks/patch_rm2fb.py b/toltec/hooks/patch_rm2fb.py index 81c6e4c..484a1d0 100644 --- a/toltec/hooks/patch_rm2fb.py +++ b/toltec/hooks/patch_rm2fb.py @@ -82,5 +82,5 @@ def docker_file_path(file_path: str) -> str: + " ".join(docker_file_path(file_path) for file_path in binaries) ) - script += restore_mtime_script(original_mtime) + script += restore_mtime_script(src_dir, MOUNT_SRC, original_mtime) run_in_container(builder, src_dir, logger, script) diff --git a/toltec/hooks/strip.py b/toltec/hooks/strip.py index dca1dd3..e582670 100644 --- a/toltec/hooks/strip.py +++ b/toltec/hooks/strip.py @@ -8,6 +8,8 @@ import os import logging +import random +import string import shlex from typing import Callable import docker @@ -60,17 +62,35 @@ def run_in_container( bash.pipe_logs(_logger, logs) -def restore_mtime_script(original_mtime: dict[str, int]) -> list[str]: +def restore_mtime_script( + src_dir: str, mnt_dir: str, original_mtime: dict[str, int] +) -> list[str]: """Restore original mtimes for files after they have been modified""" - script: list[str] = [] + if not original_mtime: + return [] + + script: list[str] = ["import os"] for file_path, mtime in original_mtime.items(): - script.append( - 'echo "import os; os.utime(' - + f'\\"{file_path}\\", ns=({mtime}, {mtime})' - + ')" | python3 -u' - ) + script.append(f'os.utime("{file_path}", ns=({mtime}, {mtime}))') + + while os.path.exists( + (script_path := os.path.join(src_dir, f".{randomword(10)}.py")) + ): + pass + + with open(script_path, "w", encoding="utf-8") as f: + _ = f.write("\n".join(script)) + + docker_path = shlex.quote( + os.path.join(mnt_dir, os.path.relpath(script_path, src_dir)) + ) + return [f"python3 -u {docker_path}", f"rm {docker_path}"] + - return script +def randomword(length: int) -> str: + """Create a random string""" + letters = string.ascii_lowercase + return "".join(random.choice(letters) for i in range(length)) def register(builder: Builder) -> None: @@ -177,5 +197,5 @@ def docker_file_path(file_path: str) -> str: os.path.relpath(file_path, src_dir), ) - script += restore_mtime_script(original_mtime) + script += restore_mtime_script(src_dir, MOUNT_SRC, original_mtime) run_in_container(builder, src_dir, logger, script)