Something went wrong. Try again.
A fork of https://github.com/crosspoint-reader/crosspoint-reader
Something went wrong. Try again.
3.1 kB · 92 lines
Python
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293"""PlatformIO pre-build script: apply CrossPoint's JPEGDEC patches via `git apply`.
The upstream JPEGDEC pin still has progressive grayscale bugs inJPEGDecodeMCU_P, including unsafe MCU_SKIP writes and attempts to consumechroma components that are absent from the current scan.The patches in `scripts/jpegdec_patches/` carry the fix; this script applieseach one against the libdep working tree.
Each patch's idempotency is decided by git itself: * `git apply --check --reverse` succeeds -> already applied, skip * `git apply --check` succeeds -> apply * neither succeeds -> abort the build
Patches live in `scripts/jpegdec_patches/` as one-commit-per-fix files(see the file headers for context). Applied in lexical order."""
Import("env") # noqa: F821 (SCons-injected global)import osimport subprocessimport sys
PATCH_DIR = os.path.join(env["PROJECT_DIR"], "scripts", "jpegdec_patches") # noqa: F821
def patch_jpegdec(env): libdeps_dir = os.path.join(env["PROJECT_DIR"], ".pio", "libdeps") if not os.path.isdir(libdeps_dir): return patches = _patch_files() for env_dir in os.listdir(libdeps_dir): jpeg_dir = os.path.join(libdeps_dir, env_dir, "JPEGDEC") if not os.path.isdir(os.path.join(jpeg_dir, ".git")): continue for patch in patches: _apply_one(jpeg_dir, patch)
def _patch_files(): if not os.path.isdir(PATCH_DIR): raise RuntimeError( "JPEGDEC patches missing -- aborting build (expected directory %s)" % PATCH_DIR ) patches = sorted( os.path.join(PATCH_DIR, name) for name in os.listdir(PATCH_DIR) if name.endswith(".patch") ) if not patches: raise RuntimeError( "JPEGDEC patches missing -- aborting build (no .patch files in %s)" % PATCH_DIR ) return patches
def _apply_one(jpeg_dir, patch_path): name = os.path.basename(patch_path) if _git_apply_succeeds(jpeg_dir, patch_path, reverse=True): return if not _git_apply_succeeds(jpeg_dir, patch_path, reverse=False): # Not applied, not appliable -- the libdep source has diverged from # what the patch expects. Don't write a half-patched file. result = subprocess.run( ["git", "apply", "--check", patch_path], cwd=jpeg_dir, capture_output=True, text=True, ) sys.stderr.write( "ERROR: JPEGDEC patch %s does not apply cleanly:\n%s%s\n" % (name, result.stdout, result.stderr) ) raise SystemExit(1) subprocess.run(["git", "apply", patch_path], cwd=jpeg_dir, check=True) print("Applied JPEGDEC patch: %s" % name)
def _git_apply_succeeds(jpeg_dir, patch_path, *, reverse): cmd = ["git", "apply", "--check"] if reverse: cmd.append("--reverse") cmd.append(patch_path) return subprocess.run( cmd, cwd=jpeg_dir, capture_output=True, text=True ).returncode == 0
patch_jpegdec(env) # noqa: F821