Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release Pillow 8.4.0 on October 15, 2021 #5664

Closed
20 tasks done
hugovk opened this issue Aug 9, 2021 · 20 comments
Closed
20 tasks done

Release Pillow 8.4.0 on October 15, 2021 #5664

hugovk opened this issue Aug 9, 2021 · 20 comments
Assignees
Labels
Milestone

Comments

@hugovk
Copy link
Member

hugovk commented Aug 9, 2021

Release Checklist

See https://pillow.readthedocs.io/en/stable/releasenotes/versioning.html for
information about how the version numbers line up with releases.

Main Release

Released quarterly on January 2nd, April 1st, July 1st and October 15th.

  • Open a release ticket.
  • Develop and prepare release in master branch.
  • Check GitHub Actions and AppVeyor to confirm passing tests in master branch.
  • Check that all of the wheel builds Pillow Wheel Builder pass the tests in Travis CI and GitHub Actions.
  • In compliance with PEP 440, update version identifier in src/PIL/_version.py
  • Update CHANGES.rst.
  • Run pre-release check via make release-test in a freshly cloned repo.
  • Create branch and tag for release e.g.:
    git branch 8.4.x
    git tag 8.4.0
    git push --all
    git push --tags
  • Create and check source distribution:
    make sdist
    twine check dist/*
  • Create binary distributions
  • Check and upload all binaries and source distributions e.g.:
    twine check dist/*
    twine upload dist/Pillow-8.4.0*
  • Publish the release on GitHub
  • In compliance with PEP 440, increment and append .dev0 to version identifier in src/PIL/_version.py

Binary Distributions

Windows

  • Contact @cgohlke for Windows binaries via release ticket.
  • Download and extract tarball from @cgohlke and copy into dist/

Mac and Linux

Publicize Release

Documentation

Docker Images

  • Update Pillow in the Docker Images repository
    git clone https://github.com/python-pillow/docker-images
    cd docker-images
    ./update-pillow-tag.sh 8.4.0
@hugovk hugovk added the Release label Aug 9, 2021
@hugovk hugovk added this to the 8.4.0 milestone Aug 9, 2021
@hugovk hugovk self-assigned this Aug 9, 2021
@hugovk hugovk pinned this issue Aug 9, 2021
@hugovk hugovk unpinned this issue Sep 1, 2021
@hugovk hugovk pinned this issue Sep 6, 2021
@doublex
Copy link

doublex commented Oct 10, 2021

Is there a chance to fix anim-gifs in 8.4? #5656
Thanks for all your efforts!

@hugovk
Copy link
Member Author

hugovk commented Oct 12, 2021

Is there a chance to fix anim-gifs in 8.4? #5656 Thanks for all your efforts!

Yes, #5756 has been merged and will be in 8.4.0.

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

Will begin the release. First a review of the milestone (https://github.com/python-pillow/Pillow/milestone/45):

Also, CIFuzz suddenly started failing yesterday: #5764. Looks like a timeout unrelated to code changes, I'm going to ignore it for this release (and may cancel those builds early to save resources/time).

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

The "MSYS2 MinGW 32-bit" job has a failing Qt test, even after a few restarts:

The previous build passed, and there's no code changes between the two (only removed the Tidelift workflow):

So will continue, something to check later.

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

@cgohlke Please could you build Windows binaries? Thank you!

@cgohlke
Copy link
Contributor

cgohlke commented Oct 15, 2021

Here you go.

Got some QT (PyQt6 6.2.0) related failures:

============================================================= test session starts =============================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 -- X:\Python39\python.exe
cachedir: .pytest_cache
hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('D:\\Build\\Pillow\\Pillow-8.4.0\\.hypothesis\\examples')
--------------------------------------------------------------------
Pillow 8.4.0
Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)]
--------------------------------------------------------------------
Python modules loaded from X:\Python39\lib\site-packages\PIL
Binary modules loaded from X:\Python39\lib\site-packages\PIL
--------------------------------------------------------------------
--- PIL CORE support ok, compiled for 8.4.0
--- TKINTER support ok, loaded 8.6
--- FREETYPE2 support ok, loaded 2.11.0
--- LITTLECMS2 support ok, loaded 2.12
--- WEBP support ok, loaded 1.2.1
--- WEBP Transparency support ok
--- WEBPMUX support ok
--- WEBP Animation support ok
--- JPEG support ok, compiled for libjpeg-turbo 2.1.1
--- OPENJPEG (JPEG2000) support ok, loaded 2.4.0
--- ZLIB (PNG/ZIP) support ok, loaded 1.2.11
--- LIBTIFF support ok, loaded 4.3.0
--- RAQM (Bidirectional Text) support ok, loaded 0.7.2, fribidi 1.0.10, harfbuzz 2.9.1
*** LIBIMAGEQUANT (Quantization method) support not installed
*** XCB (X protocol) support not installed
--------------------------------------------------------------------

rootdir: D:\Build\Pillow\Pillow-8.4.0, configfile: setup.cfg, testpaths: Tests
plugins: anyio-3.3.2, hypothesis-6.21.5, napari-0.4.11, napari-plugin-engine-0.2.0, cov-3.0.0, forked-1.3.0, xdist-2.4.0
collected 1915 items / 1 skipped / 1914 selected

<snip>

================================================================== FAILURES ===================================================================
________________________________________________________________ test_sanity_1 ________________________________________________________________

test_images = [<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=128x128 at 0x20ADDE98FA0>, <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=200x150 at 0x20ADDE98B80>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=7x13 at 0x20ADDE98400>]

    def test_sanity_1(test_images):
        for im in test_images:
>           roundtrip(im.convert("1"))

Tests\test_image_fromqimage.py:40:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_image_fromqimage.py:30: in roundtrip
    result = ImageQt.fromqimage(intermediate)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADDE99350>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
_______________________________________________________________ test_sanity_rgb _______________________________________________________________

test_images = [<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=128x128 at 0x20AEDDD8E50>, <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=200x150 at 0x20AEDDD8AC0>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=7x13 at 0x20AEDDD8F10>]

    def test_sanity_rgb(test_images):
        for im in test_images:
>           roundtrip(im.convert("RGB"))

Tests\test_image_fromqimage.py:45:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_image_fromqimage.py:30: in roundtrip
    result = ImageQt.fromqimage(intermediate)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADDEA67B0>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
______________________________________________________________ test_sanity_rgba _______________________________________________________________

test_images = [<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=128x128 at 0x20AEDE8E1F0>, <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=200x150 at 0x20AEDC02490>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=7x13 at 0x20ADDE33340>]

    def test_sanity_rgba(test_images):
        for im in test_images:
>           roundtrip(im.convert("RGBA"))

Tests\test_image_fromqimage.py:50:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_image_fromqimage.py:30: in roundtrip
    result = ImageQt.fromqimage(intermediate)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADDEA6E40>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
________________________________________________________________ test_sanity_l ________________________________________________________________

test_images = [<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=128x128 at 0x20AEDB7F460>, <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=200x150 at 0x20AEDB7F610>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=7x13 at 0x20AEDB7F130>]

    def test_sanity_l(test_images):
        for im in test_images:
>           roundtrip(im.convert("L"))

Tests\test_image_fromqimage.py:55:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_image_fromqimage.py:30: in roundtrip
    result = ImageQt.fromqimage(intermediate)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADDE99E40>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
________________________________________________________________ test_sanity_p ________________________________________________________________

test_images = [<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=128x128 at 0x20AEDAD7FA0>, <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=200x150 at 0x20AEDAD7610>, <PIL.PngImagePlugin.PngImageFile image mode=RGB size=7x13 at 0x20AEDAD7F70>]

    def test_sanity_p(test_images):
        for im in test_images:
>           roundtrip(im.convert("P"))

Tests\test_image_fromqimage.py:60:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_image_fromqimage.py:30: in roundtrip
    result = ImageQt.fromqimage(intermediate)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADDEAD430>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
_________________________________________________________________ test_sanity _________________________________________________________________

tmp_path = WindowsPath('C:/Users/gohlke/AppData/Local/Temp/pytest-of-gohlke/pytest-8/test_sanity8')

    @pytest.mark.skipif(not ImageQt.qt_is_installed, reason="Qt bindings are not installed")
    def test_sanity(tmp_path):
        # Segfault test
        app = QApplication([])
        ex = Example()
        assert app  # Silence warning
        assert ex  # Silence warning

        for mode in ("1", "RGB", "RGBA", "L", "P"):
            # to QPixmap
            im = hopper(mode)
            data = ImageQt.toqpixmap(im)

            assert isinstance(data, QPixmap)
            assert not data.isNull()

            # Test saving the file
            tempfile = str(tmp_path / f"temp_{mode}.png")
            data.save(tempfile)

            # Render the image
            qimage = ImageQt.ImageQt(im)
            data = QPixmap.fromImage(qimage)
            qt_format = QImage.Format if ImageQt.qt_version == "6" else QImage
            qimage = QImage(128, 128, qt_format.Format_ARGB32)
            painter = QPainter(qimage)
            image_label = QLabel()
            image_label.setPixmap(data)
            image_label.render(painter, QPoint(0, 0), QRegion(0, 0, 128, 128))
            painter.end()
            rendered_tempfile = str(tmp_path / f"temp_rendered_{mode}.png")
            qimage.save(rendered_tempfile)
            assert_image_equal_tofile(im.convert("RGBA"), rendered_tempfile)

            # from QPixmap
>           roundtrip(hopper(mode))

Tests\test_qt_image_qapplication.py:85:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Tests\test_qt_image_qapplication.py:45: in roundtrip
    result = ImageQt.fromqpixmap(ImageQt.toqpixmap(expected))
X:\Python39\lib\site-packages\PIL\ImageQt.py:87: in fromqpixmap
    return fromqimage(im)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PyQt6.QtGui.QPixmap object at 0x0000020ADF342CF0>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
_________________________________________________________________ test_sanity _________________________________________________________________

tmp_path = WindowsPath('C:/Users/gohlke/AppData/Local/Temp/pytest-of-gohlke/pytest-8/test_sanity9')

    def test_sanity(tmp_path):
        for mode in ("RGB", "RGBA", "L", "P", "1"):
            src = hopper(mode)
            data = ImageQt.toqimage(src)

            assert isinstance(data, QImage)
            assert not data.isNull()

            # reload directly from the qimage
>           rt = ImageQt.fromqimage(data)

Tests\test_qt_image_toqimage.py:24:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

im = <PIL.ImageQt.ImageQt object at 0x0000020ADE0A85F0>

    def fromqimage(im):
        """
        :param im: QImage or PIL ImageQt object
        """
        buffer = QBuffer()
>       qt_openmode = QIODevice.OpenMode if qt_version == "6" else QIODevice
E       AttributeError: type object 'QIODevice' has no attribute 'OpenMode'

X:\Python39\lib\site-packages\PIL\ImageQt.py:69: AttributeError
============================================================== warnings summary ===============================================================
Tests\test_file_eps.py:283
  D:\Build\Pillow\Pillow-8.4.0\Tests\test_file_eps.py:283: PytestUnknownMarkWarning: Unknown pytest.mark.timeout - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
    @pytest.mark.timeout(timeout=5)

Tests\test_file_fli.py:135
  D:\Build\Pillow\Pillow-8.4.0\Tests\test_file_fli.py:135: PytestUnknownMarkWarning: Unknown pytest.mark.timeout - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
    @pytest.mark.timeout(timeout=3)

Tests\test_file_pdf.py:315
  D:\Build\Pillow\Pillow-8.4.0\Tests\test_file_pdf.py:315: PytestUnknownMarkWarning: Unknown pytest.mark.timeout - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html
    @pytest.mark.timeout(1)

-- Docs: https://docs.pytest.org/en/stable/warnings.html
=========================================================== short test summary info ===========================================================
SKIPPED [1] Tests\oss-fuzz\test_fuzzers.py:11: Fuzzer is linux only
SKIPPED [1] Tests\test_features.py:68: libimagequant not available
SKIPPED [1] Tests\test_file_gif.py:223: Netpbm not available
SKIPPED [1] Tests\test_file_gif.py:234: Netpbm not available
SKIPPED [4] Tests\test_file_jpeg2k.py:281: Extra image files not installed
SKIPPED [1] Tests\test_file_msp.py:58: Extra image files not installed
SKIPPED [1] Tests\test_file_msp.py:72: Even More Extra image files not installed
SKIPPED [1] Tests\test_file_png.py:770: Requires Unix or macOS
SKIPPED [1] Tests\test_file_sun.py:35: Extra image files not installed
SKIPPED [1] Tests\test_file_tiff.py:716: Extra image files not installed
SKIPPED [1] Tests\test_font_leaks.py:20: Requires Unix or macOS
SKIPPED [1] Tests\test_font_leaks.py:31: Requires Unix or macOS
SKIPPED [1] Tests\test_image.py:196: Test requires opening tempfile twice
SKIPPED [1] Tests\test_image_quantize.py:27: libimagequant support not available
SKIPPED [1] Tests\test_imagedraw.py:974: failing
SKIPPED [2] Tests\test_imagefont.py:495: requires Unix or macOS
SKIPPED [2] Tests\test_imagefont.py:536: requires Unix or macOS
SKIPPED [2] Tests\test_imagefontctl.py:238: fails with this font
SKIPPED [1] Tests\test_imagegrab.py:27: xcb not available
SKIPPED [1] Tests\test_imagegrab.py:50: xcb not available
SKIPPED [1] Tests\test_imageshow.py:44: Only run on CIs; hangs on Windows CIs
SKIPPED [1] Tests\test_shell_injection.py:25: Requires Unix or macOS
SKIPPED [1] Tests\test_shell_injection.py:34: Requires Unix or macOS
SKIPPED [1] Tests\test_shell_injection.py:39: Netpbm not available
SKIPPED [1] Tests\test_shell_injection.py:45: Netpbm not available
SKIPPED [3] Tests\test_tiff_crashes.py:50: test image not found
SKIPPED [1] Tests\test_webp_leaks.py:16: Requires Unix or macOS
XFAIL Tests/test_decompression_bomb.py::TestDecompressionBomb::test_exception_ico
  different exception
XFAIL Tests/test_image_resample.py::TestCoreResampleAlphaCorrect::test_levels_rgba
  Current implementation isn't precise enough
XFAIL Tests/test_image_resample.py::TestCoreResampleAlphaCorrect::test_levels_la
  Current implementation isn't precise enough
XPASS Tests/test_file_palm.py::test_p_mode Palm P image is wrong
FAILED Tests/test_image_fromqimage.py::test_sanity_1 - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_image_fromqimage.py::test_sanity_rgb - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_image_fromqimage.py::test_sanity_rgba - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_image_fromqimage.py::test_sanity_l - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_image_fromqimage.py::test_sanity_p - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_qt_image_qapplication.py::test_sanity - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
FAILED Tests/test_qt_image_toqimage.py::test_sanity - AttributeError: type object 'QIODevice' has no attribute 'OpenMode'
================================ 7 failed, 1870 passed, 35 skipped, 3 xfailed, 1 xpassed, 3 warnings in 45.09s ================================

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

Thank you! Looks similar to the Qt failures with MSYS2 MinGW 32-bit.

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

Forgot to remove this placeholder from the release notes:

image

https://pillow.readthedocs.io/en/stable/releasenotes/8.4.0.html

For clarity, Pillow 8.4.0 does not contain security updates.

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

🚀🐍 Pillow 8.4.0 is released!

Thanks everyone!

@jimaobian
Copy link

Great!
Please also add the wheel for aarch64 :)

@aclark4life aclark4life unpinned this issue Oct 15, 2021
@radarhere
Copy link
Member

@hugovk here are the aarch64 wheels, if it helps - aarch64.zip

@kmilos
Copy link
Contributor

kmilos commented Oct 15, 2021

MINGW32 CI failures could be related to msys2/MINGW-packages#9771 or msys2/MINGW-packages#9736?

@hugovk
Copy link
Member Author

hugovk commented Oct 15, 2021

@hugovk here are the aarch64 wheels, if it helps - aarch64.zip

Thanks, uploaded!

image

https://pypi.org/project/Pillow/8.4.0/#files

@hugovk
Copy link
Member Author

hugovk commented Oct 16, 2021

Opened #5774 for the Qt failures.

@ito-yu
Copy link

ito-yu commented Oct 18, 2021

manylinux 2_12 wheels looks lacking compared to 8.3.2.

@radarhere
Copy link
Member

Correct me if I'm wrong, but the distros supported by manylinux_2_12 are EOL. See https://github.com/mayeut/pep600_compliance#acceptable-distros-to-build-wheels

@ito-yu
Copy link

ito-yu commented Oct 18, 2021

@radarhere No problem. We kept using too much old docker image.

@nulano
Copy link
Contributor

nulano commented Oct 18, 2021

manylinux 2_12 wheels looks lacking compared to 8.3.2.

Correct me if I'm wrong, but the distros supported by manylinux_2_12 are EOL. See https://github.com/mayeut/pep600_compliance#acceptable-distros-to-build-wheels

Related: #5701 (comment)

More concretely, maybe we should also upload old manylinux wheels for the October 8.4.0 release, at least manylinux1 for Python 3.6, as that's the only one that appears to be a problem?

And then for the January 9.0.0 release (post 3.6 EOL): drop manylinux1 and manylinux2010, and only use manylinux2014+?

@hugovk
Copy link
Member Author

hugovk commented Oct 18, 2021

No one answered that suggestion last month :) So maybe we wait to see if there's a concrete need that can't be addressed by upgrading?

In that earlier case last month, it looks like they no longer need it anyway; they're planning on waiting until 3.6 EOL and dropping it and upgrading manylinux and some other stuff.

@nulano
Copy link
Contributor

nulano commented Oct 18, 2021

Yeah, just wanted to make sure the discussion is linked :)

@hugovk hugovk closed this as completed Oct 21, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants