From 0d1e83098d768b8212bd832f06210b9ad5c3f667 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 13:07:12 +0300 Subject: [PATCH 1/8] Add pyupgrade to pre-commit --- .pre-commit-config.yaml | 6 ++++++ src/PIL/BdfFontFile.py | 4 ++-- src/PIL/EpsImagePlugin.py | 4 ++-- src/PIL/ImageGrab.py | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 460661166..5bd004001 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,10 @@ repos: + - repo: https://github.com/asottile/pyupgrade + rev: v3.13.0 + hooks: + - id: pyupgrade + args: [--py38-plus] + - repo: https://github.com/psf/black rev: 23.7.0 hooks: diff --git a/src/PIL/BdfFontFile.py b/src/PIL/BdfFontFile.py index 075d46290..161954831 100644 --- a/src/PIL/BdfFontFile.py +++ b/src/PIL/BdfFontFile.py @@ -68,11 +68,11 @@ def bdf_char(f): # followed by the width in x (BBw), height in y (BBh), # and x and y displacement (BBxoff0, BByoff0) # of the lower left corner from the origin of the character. - width, height, x_disp, y_disp = [int(p) for p in props["BBX"].split()] + width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) # The word DWIDTH # followed by the width in x and y of the character in device pixels. - dwx, dwy = [int(p) for p in props["DWIDTH"].split()] + dwx, dwy = (int(p) for p in props["DWIDTH"].split()) bbox = ( (dwx, dwy), diff --git a/src/PIL/EpsImagePlugin.py b/src/PIL/EpsImagePlugin.py index b96ce9603..404c8f6a7 100644 --- a/src/PIL/EpsImagePlugin.py +++ b/src/PIL/EpsImagePlugin.py @@ -339,9 +339,9 @@ class EpsImageFile(ImageFile.ImageFile): # data start identifier (the image data follows after a single line # consisting only of this quoted value) image_data_values = byte_arr[11:bytes_read].split(None, 7) - columns, rows, bit_depth, mode_id = [ + columns, rows, bit_depth, mode_id = ( int(value) for value in image_data_values[:4] - ] + ) if bit_depth == 1: self._mode = "1" diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 43019f74a..bcfffc3dc 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -166,7 +166,7 @@ def grabclipboard(): msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" raise NotImplementedError(msg) - p = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p = subprocess.run(args, capture_output=True) err = p.stderr if err: msg = f"{args[0]} error: {err.strip().decode()}" From 9d104b241ee671cd0ce704c9a3343656f7137a1a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 13:16:25 +0300 Subject: [PATCH 2/8] Use black-pre-commit-mirror for faster mypyc-compiled wheels --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5bd004001..f952534a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,8 +5,8 @@ repos: - id: pyupgrade args: [--py38-plus] - - repo: https://github.com/psf/black - rev: 23.7.0 + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 23.9.1 hooks: - id: black args: [--target-version=py38] From 507b7d519a013ccbbda2b4d94c63acd1e056976c Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:03:39 +0300 Subject: [PATCH 3/8] Fix LOG011 avoid pre-formatting log messages --- Tests/helper.py | 4 ++-- src/PIL/TiffImagePlugin.py | 45 ++++++++++++++++++++------------------ 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/Tests/helper.py b/Tests/helper.py index 69246bfcf..677a0981b 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -91,7 +91,7 @@ def assert_image_equal(a, b, msg=None): if HAS_UPLOADER: try: url = test_image_results.upload(a, b) - logger.error(f"Url for test images: {url}") + logger.error("URL for test images: %s", url) except Exception: pass @@ -126,7 +126,7 @@ def assert_image_similar(a, b, epsilon, msg=None): if HAS_UPLOADER: try: url = test_image_results.upload(a, b) - logger.error(f"Url for test images: {url}") + logger.error("URL for test images: %s", url) except Exception: pass raise e diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 5d3bc4f83..96de03a3e 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -823,7 +823,7 @@ class ImageFileDirectory_v2(MutableMapping): try: unit_size, handler = self._load_dispatch[typ] except KeyError: - logger.debug(msg + f" - unsupported type {typ}") + logger.debug("%s - unsupported type %s", msg, typ) continue # ignore unsupported type size = count * unit_size if size > (8 if self._bigtiff else 4): @@ -880,7 +880,7 @@ class ImageFileDirectory_v2(MutableMapping): if tag == STRIPOFFSETS: stripoffsets = len(entries) typ = self.tagtype.get(tag) - logger.debug(f"Tag {tag}, Type: {typ}, Value: {repr(value)}") + logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) is_ifd = typ == TiffTags.LONG and isinstance(value, dict) if is_ifd: if self._endian == "<": @@ -929,7 +929,7 @@ class ImageFileDirectory_v2(MutableMapping): # pass 2: write entries to file for tag, typ, count, value, data in entries: - logger.debug(f"{tag} {typ} {count} {repr(value)} {repr(data)}") + logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) result += self._pack("HHL4s", tag, typ, count, value) # -- overwrite here for multi-page -- @@ -1098,8 +1098,8 @@ class TiffImageFile(ImageFile.ImageFile): self._n_frames = None logger.debug("*** TiffImageFile._open ***") - logger.debug(f"- __first: {self.__first}") - logger.debug(f"- ifh: {repr(ifh)}") # Use repr to avoid str(bytes) + logger.debug("- __first: %s", self.__first) + logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) # and load the first frame self._seek(0) @@ -1137,12 +1137,15 @@ class TiffImageFile(ImageFile.ImageFile): msg = "no more images in TIFF file" raise EOFError(msg) logger.debug( - f"Seeking to frame {frame}, on frame {self.__frame}, " - f"__next {self.__next}, location: {self.fp.tell()}" + "Seeking to frame %s, on frame %s, __next %s, location: %s", + frame, + self.__frame, + self.__next, + self.fp.tell(), ) self.fp.seek(self.__next) self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s" % self.fp.tell()) + logger.debug("Loading tags, location: %s", self.fp.tell()) self.tag_v2.load(self.fp) if self.tag_v2.next in self._frame_pos: # This IFD has already been processed @@ -1330,18 +1333,18 @@ class TiffImageFile(ImageFile.ImageFile): fillorder = self.tag_v2.get(FILLORDER, 1) logger.debug("*** Summary ***") - logger.debug(f"- compression: {self._compression}") - logger.debug(f"- photometric_interpretation: {photo}") - logger.debug(f"- planar_configuration: {self._planar_configuration}") - logger.debug(f"- fill_order: {fillorder}") - logger.debug(f"- YCbCr subsampling: {self.tag.get(YCBCRSUBSAMPLING)}") + logger.debug("- compression: %s", self._compression) + logger.debug("- photometric_interpretation: %s", photo) + logger.debug("- planar_configuration: %s", self._planar_configuration) + logger.debug("- fill_order: %s", fillorder) + logger.debug("- YCbCr subsampling: %s", self.tag.get(YCBCRSUBSAMPLING)) # size xsize = int(self.tag_v2.get(IMAGEWIDTH)) ysize = int(self.tag_v2.get(IMAGELENGTH)) self._size = xsize, ysize - logger.debug(f"- size: {self.size}") + logger.debug("- size: %s", self.size) sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 1: @@ -1397,7 +1400,7 @@ class TiffImageFile(ImageFile.ImageFile): bps_tuple, extra_tuple, ) - logger.debug(f"format key: {key}") + logger.debug("format key: %s", key) try: self._mode, rawmode = OPEN_INFO[key] except KeyError as e: @@ -1405,8 +1408,8 @@ class TiffImageFile(ImageFile.ImageFile): msg = "unknown pixel mode" raise SyntaxError(msg) from e - logger.debug(f"- raw mode: {rawmode}") - logger.debug(f"- pil mode: {self.mode}") + logger.debug("- raw mode: %s", rawmode) + logger.debug("- pil mode: %s", self.mode) self.info["compression"] = self._compression @@ -1447,7 +1450,7 @@ class TiffImageFile(ImageFile.ImageFile): if fillorder == 2: # Replace fillorder with fillorder=1 key = key[:3] + (1,) + key[4:] - logger.debug(f"format key: {key}") + logger.debug("format key: %s", key) # this should always work, since all the # fillorder==2 modes have a corresponding # fillorder=1 mode @@ -1610,7 +1613,7 @@ def _save(im, fp, filename): info = exif else: info = {} - logger.debug("Tiffinfo Keys: %s" % list(info)) + logger.debug("Tiffinfo Keys: %s", list(info)) if isinstance(info, ImageFileDirectory_v1): info = info.to_v2() for key in info: @@ -1743,7 +1746,7 @@ def _save(im, fp, filename): ifd[JPEGQUALITY] = quality logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s" % sorted(ifd.items())) + logger.debug("Items: %s", sorted(ifd.items())) _fp = 0 if hasattr(fp, "fileno"): try: @@ -1811,7 +1814,7 @@ def _save(im, fp, filename): if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - logger.debug("Converted items: %s" % sorted(atts.items())) + logger.debug("Converted items: %s", sorted(atts.items())) # libtiff always expects the bytes in native order. # we're storing image byte order. So, if the rawmode From 36d0bf044b53080b09fcca13998960e4ab2f6035 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:04:38 +0300 Subject: [PATCH 4/8] Fix LOG005 use exception() within an exception handler --- Tests/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/helper.py b/Tests/helper.py index 677a0981b..de5468d84 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -126,7 +126,7 @@ def assert_image_similar(a, b, epsilon, msg=None): if HAS_UPLOADER: try: url = test_image_results.upload(a, b) - logger.error("URL for test images: %s", url) + logger.exception("URL for test images: %s", url) except Exception: pass raise e From 3891e9e228a40c140a23215c53e010a3c3b92b58 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:04:47 +0300 Subject: [PATCH 5/8] Add flake8-logging to pre-commit --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f952534a2..4cb991bbe 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -39,7 +39,7 @@ repos: hooks: - id: flake8 additional_dependencies: - [flake8-2020, flake8-errmsg, flake8-implicit-str-concat] + [flake8-2020, flake8-errmsg, flake8-implicit-str-concat, flake8-logging] - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 From f76b63d016b20d6829e80fb82c4bdfd481a7438a Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:08:40 +0300 Subject: [PATCH 6/8] Add end-of-file-fixer to pre-commit --- .pre-commit-config.yaml | 2 ++ Tests/fonts/DejaVuSans/LICENSE.txt | 2 +- Tests/icc/LICENSE.txt | 1 - depends/install_raqm.sh | 1 - depends/install_raqm_cmake.sh | 1 - depends/termux.sh | 1 - docs/newer-versions.csv | 2 +- docs/older-versions.csv | 2 +- docs/releasenotes/3.0.0.rst | 1 - docs/releasenotes/3.3.2.rst | 4 ---- docs/releasenotes/4.1.1.rst | 2 -- docs/releasenotes/4.2.1.rst | 1 - docs/releasenotes/8.0.0.rst | 3 --- src/libImaging/Sgi.h | 2 +- 14 files changed, 6 insertions(+), 19 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4cb991bbe..49b60497f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -54,6 +54,8 @@ repos: - id: check-json - id: check-toml - id: check-yaml + - id: end-of-file-fixer + exclude: ^Tests/images/ - repo: https://github.com/sphinx-contrib/sphinx-lint rev: v0.6.8 diff --git a/Tests/fonts/DejaVuSans/LICENSE.txt b/Tests/fonts/DejaVuSans/LICENSE.txt index 30516578f..be6a4d84c 100644 --- a/Tests/fonts/DejaVuSans/LICENSE.txt +++ b/Tests/fonts/DejaVuSans/LICENSE.txt @@ -37,4 +37,4 @@ The Font Software may be sold as part of a larger software package but no copy o THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. \ No newline at end of file +Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. diff --git a/Tests/icc/LICENSE.txt b/Tests/icc/LICENSE.txt index 7d289c331..7119461ed 100644 --- a/Tests/icc/LICENSE.txt +++ b/Tests/icc/LICENSE.txt @@ -22,4 +22,3 @@ and that the name of ICC shall not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. ICC makes no representations about the suitability of this software for any purpose. - diff --git a/depends/install_raqm.sh b/depends/install_raqm.sh index 24c1f9c30..070ba23a1 100755 --- a/depends/install_raqm.sh +++ b/depends/install_raqm.sh @@ -11,4 +11,3 @@ pushd $archive meson build --prefix=/usr && sudo ninja -C build install popd - diff --git a/depends/install_raqm_cmake.sh b/depends/install_raqm_cmake.sh index 7d2c399df..37d9d1160 100755 --- a/depends/install_raqm_cmake.sh +++ b/depends/install_raqm_cmake.sh @@ -15,4 +15,3 @@ make && sudo make install cd .. popd - diff --git a/depends/termux.sh b/depends/termux.sh index 1acc09c44..d437029fd 100755 --- a/depends/termux.sh +++ b/depends/termux.sh @@ -2,4 +2,3 @@ pkg install -y python ndk-sysroot clang make \ libjpeg-turbo - diff --git a/docs/newer-versions.csv b/docs/newer-versions.csv index 1457d59de..e21caf520 100644 --- a/docs/newer-versions.csv +++ b/docs/newer-versions.csv @@ -5,4 +5,4 @@ Pillow 9.3 - 9.5,,Yes,Yes,Yes,Yes,Yes,, Pillow 9.0 - 9.2,,,Yes,Yes,Yes,Yes,, Pillow 8.3.2 - 8.4,,,Yes,Yes,Yes,Yes,Yes, Pillow 8.0 - 8.3.1,,,,Yes,Yes,Yes,Yes, -Pillow 7.0 - 7.2,,,,,Yes,Yes,Yes,Yes \ No newline at end of file +Pillow 7.0 - 7.2,,,,,Yes,Yes,Yes,Yes diff --git a/docs/older-versions.csv b/docs/older-versions.csv index 6058f0524..aa696bc18 100644 --- a/docs/older-versions.csv +++ b/docs/older-versions.csv @@ -5,4 +5,4 @@ Pillow 5.2 - 5.4,,Yes,Yes,Yes,Yes,,,Yes,,, Pillow 5.0 - 5.1,,,Yes,Yes,Yes,,,Yes,,, Pillow 4,,,Yes,Yes,Yes,Yes,,Yes,,, Pillow 2 - 3,,,,Yes,Yes,Yes,Yes,Yes,Yes,, -Pillow < 2,,,,,,,,Yes,Yes,Yes,Yes \ No newline at end of file +Pillow < 2,,,,,,,,Yes,Yes,Yes,Yes diff --git a/docs/releasenotes/3.0.0.rst b/docs/releasenotes/3.0.0.rst index 67569d337..e8eada73c 100644 --- a/docs/releasenotes/3.0.0.rst +++ b/docs/releasenotes/3.0.0.rst @@ -49,4 +49,3 @@ The external dependencies on libjpeg and zlib are now required by default. If the headers or libraries are not found, then installation will abort with an error. This behaviour can be disabled with the ``--disable-libjpeg`` and ``--disable-zlib`` flags. - diff --git a/docs/releasenotes/3.3.2.rst b/docs/releasenotes/3.3.2.rst index 68a09a3c8..8845b976a 100644 --- a/docs/releasenotes/3.3.2.rst +++ b/docs/releasenotes/3.3.2.rst @@ -34,7 +34,3 @@ image size can lead to a smaller allocation than expected, leading to arbitrary writes. This issue was found by Cris Neckar at Divergent Security. - - - - diff --git a/docs/releasenotes/4.1.1.rst b/docs/releasenotes/4.1.1.rst index 7aa3c1fbf..1b5757015 100644 --- a/docs/releasenotes/4.1.1.rst +++ b/docs/releasenotes/4.1.1.rst @@ -20,5 +20,3 @@ CPython 3.6.1 to not work on installations of C-Python 3.6.0. This fix undefines PySlice_GetIndicesEx if it exists to restore compatibility with both 3.6.0 and 3.6.1. See https://bugs.python.org/issue29943 for more details. - - diff --git a/docs/releasenotes/4.2.1.rst b/docs/releasenotes/4.2.1.rst index c9e953da4..0730936fe 100644 --- a/docs/releasenotes/4.2.1.rst +++ b/docs/releasenotes/4.2.1.rst @@ -8,4 +8,3 @@ Fixed Windows PyPy Build A change in the 4.2.0 cycle broke the Windows PyPy build. This has been fixed, and PyPy is now part of the Windows CI matrix. - diff --git a/docs/releasenotes/8.0.0.rst b/docs/releasenotes/8.0.0.rst index fe2658047..00c691a74 100644 --- a/docs/releasenotes/8.0.0.rst +++ b/docs/releasenotes/8.0.0.rst @@ -175,6 +175,3 @@ Dark theme for docs ^^^^^^^^^^^^^^^^^^^ The https://pillow.readthedocs.io documentation will use a dark theme if the user has requested the system use one. Uses the ``prefers-color-scheme`` CSS media query. - - - diff --git a/src/libImaging/Sgi.h b/src/libImaging/Sgi.h index 39dd68825..797e5cbf9 100644 --- a/src/libImaging/Sgi.h +++ b/src/libImaging/Sgi.h @@ -36,4 +36,4 @@ typedef struct { /* image data size from file descriptor */ long bufsize; -} SGISTATE; \ No newline at end of file +} SGISTATE; From 1f188f5bb40c504849b06995e4ee5779cac4cd33 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:12:47 +0300 Subject: [PATCH 7/8] Add trailing-whitespace to pre-commit --- .github/workflows/release-drafter.yml | 2 +- .github/workflows/stale.yml | 2 +- .pre-commit-config.yaml | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 9e2fdc096..8fc7bd379 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -10,7 +10,7 @@ on: permissions: contents: read -concurrency: +concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 24b8f85d1..31f63e1c6 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -8,7 +8,7 @@ on: permissions: issues: write -concurrency: +concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 49b60497f..f0957c73a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,6 +56,8 @@ repos: - id: check-yaml - id: end-of-file-fixer exclude: ^Tests/images/ + - id: trailing-whitespace + exclude: ^.github/.*TEMPLATE|^Tests/(fonts|images)/ - repo: https://github.com/sphinx-contrib/sphinx-lint rev: v0.6.8 From 132357ac46ea4d3850bf4bb7e0fb14ad7807f1c6 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Sat, 9 Sep 2023 14:32:42 +0300 Subject: [PATCH 8/8] Add check-executables-have-shebangs to pre-commit and remove executable flags --- .pre-commit-config.yaml | 1 + Tests/check_j2k_leaks.py | 0 Tests/images/negative_size.ppm | Bin _custom_build/backend.py | 0 4 files changed, 1 insertion(+) mode change 100755 => 100644 Tests/check_j2k_leaks.py mode change 100755 => 100644 Tests/images/negative_size.ppm mode change 100755 => 100644 _custom_build/backend.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f0957c73a..7fe5aacbe 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -50,6 +50,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: + - id: check-executables-have-shebangs - id: check-merge-conflict - id: check-json - id: check-toml diff --git a/Tests/check_j2k_leaks.py b/Tests/check_j2k_leaks.py old mode 100755 new mode 100644 diff --git a/Tests/images/negative_size.ppm b/Tests/images/negative_size.ppm old mode 100755 new mode 100644 diff --git a/_custom_build/backend.py b/_custom_build/backend.py old mode 100755 new mode 100644