• Bug#1106059: asyncpg: FTBFS: E ValueError: Invalid IPv6 URL

    From Santiago Vila@21:1/5 to All on Mon May 19 12:00:01 2025
    Package: src:asyncpg
    Version: 0.27.0-1
    Severity: serious
    Control: close -1 0.30.0-1.1
    Tags: ftbfs bookworm

    Dear maintainer:

    During a rebuild of all packages in bookworm, your package failed to build:

    [ Note: The bug is closed with the version in trixie/sid, but
    packages in bookworm must still build in bookworm ].

    --------------------------------------------------------------------------------
    [...]
    debian/rules clean
    dh clean --with python3 --buildsystem=pybuild
    dh_auto_clean -O--buildsystem=pybuild
    I: pybuild base:240: python3.11 setup.py clean
    running clean
    removing '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build' (and everything under it)
    'build/bdist.linux-x86_64' does not exist -- can't clean it 'build/scripts-3.11' does not exist -- can't clean it
    dh_autoreconf_clean -O--buildsystem=pybuild
    dh_clean -O--buildsystem=pybuild
    debian/rules binary
    dh binary --with python3 --buildsystem=pybuild
    dh_update_autotools_config -O--buildsystem=pybuild
    dh_autoreconf -O--buildsystem=pybuild
    dh_auto_configure -O--buildsystem=pybuild
    I: pybuild base:240: python3.11 setup.py config
    running config
    dh_auto_build -O--buildsystem=pybuild
    I: pybuild base:240: /usr/bin/python3 setup.py build build_ext --cython-always running build
    running build_py
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/connection.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/pool.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/_version.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/cluster.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/types.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/prepared_stmt.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/connect_utils.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/compat.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/transaction.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/serverversion.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/utils.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/connresource.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/introspection.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    copying asyncpg/cursor.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/exceptions
    copying asyncpg/exceptions/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/exceptions
    copying asyncpg/exceptions/_base.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/exceptions
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto copying asyncpg/pgproto/types.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/_testbase
    copying asyncpg/_testbase/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/_testbase
    copying asyncpg/_testbase/fuzzer.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/_testbase
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol copying asyncpg/protocol/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    creating /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/__init__.py -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/pgproto/frb.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/buffer.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/pgproto.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/uuid.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/cpythonx.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/hton.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/__init__.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/pgproto.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/buffer.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/tohex.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/frb.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/debug.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/pgproto/consts.pxi -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto
    copying asyncpg/protocol/prepared_stmt.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/coreproto.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/settings.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/scram.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/protocol.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/encodings.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/prepared_stmt.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/settings.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/cpythonx.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/protocol.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/coreproto.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/scram.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/consts.pxi -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/pgtypes.pxi -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol
    copying asyncpg/protocol/codecs/range.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/array.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/base.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/textutils.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/record.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/pgproto.pyx -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    copying asyncpg/protocol/codecs/base.pxd -> /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/codecs
    running build_ext
    building 'asyncpg.pgproto.pgproto' extension
    creating build
    creating build/temp.linux-x86_64-cpython-311
    creating build/temp.linux-x86_64-cpython-311/asyncpg
    creating build/temp.linux-x86_64-cpython-311/asyncpg/pgproto x86_64-linux-gnu-gcc -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-
    time -D_FORTIFY_SOURCE=2 -fPIC -I./asyncpg/pgproto -I/usr/include/python3.11 -c asyncpg/pgproto/pgproto.c -o build/temp.linux-x86_64-cpython-311/asyncpg/pgproto/pgproto.o -O2 -fsigned-char -Wall -Wsign-compare -Wconversion
    x86_64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -g -fwrapv -O2 -Wl,-z,relro -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-
    cpython-311/asyncpg/pgproto/pgproto.o -L/usr/lib/x86_64-linux-gnu -o /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/pgproto/pgproto.cpython-311-x86_64-linux-gnu.so
    building 'asyncpg.protocol.protocol' extension
    creating build/temp.linux-x86_64-cpython-311/asyncpg/protocol
    creating build/temp.linux-x86_64-cpython-311/asyncpg/protocol/record x86_64-linux-gnu-gcc -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-
    time -D_FORTIFY_SOURCE=2 -fPIC -I./asyncpg/pgproto -Iasyncpg/pgproto/ -I/usr/include/python3.11 -c asyncpg/protocol/protocol.c -o build/temp.linux-x86_64-cpython-311/asyncpg/protocol/protocol.o -O2 -fsigned-char -Wall -Wsign-compare -Wconversion
    x86_64-linux-gnu-gcc -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-
    time -D_FORTIFY_SOURCE=2 -fPIC -I./asyncpg/pgproto -Iasyncpg/pgproto/ -I/usr/include/python3.11 -c asyncpg/protocol/record/recordobj.c -o build/temp.linux-x86_64-cpython-311/asyncpg/protocol/record/recordobj.o -O2 -fsigned-char -Wall -Wsign-compare -
    Wconversion
    asyncpg/protocol/record/recordobj.c: In function ‘record_dealloc’: asyncpg/protocol/record/recordobj.c:101:5: warning: ‘UsingDeprecatedTrashcanMacro’ is deprecated [-Wdeprecated-declarations]
    101 | Py_TRASHCAN_SAFE_BEGIN(o)
    | ^~~~~~~~~~~~~~~~~~~~~~
    x86_64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions -g -fwrapv -O2 -Wl,-z,relro -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 build/temp.linux-x86_64-
    cpython-311/asyncpg/protocol/protocol.o build/temp.linux-x86_64-cpython-311/asyncpg/protocol/record/recordobj.o -L/usr/lib/x86_64-linux-gnu -o /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build/asyncpg/protocol/protocol.cpython-311-x86_64-linux-gnu.so
    dh_auto_test -O--buildsystem=pybuild
    I: pybuild base:240: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build; python3.11 -m pytest -k "not test_flake8"
    ============================= test session starts ==============================
    platform linux -- Python 3.11.2, pytest-7.2.1, pluggy-1.0.0+repack
    rootdir: /<<PKGBUILDDIR>>
    collected 293 items / 1 deselected / 292 selected

    tests/test__environment.py ss [ 0%] tests/test_adversity.py ... [ 1%] tests/test_cache_invalidation.py ......... [ 4%] tests/test_cancellation.py .... [ 6%] tests/test_codecs.py .................................... [ 18%] tests/test_connect.py ..............F............................. [ 33%] tests/test_copy.py ....................... [ 41%] tests/test_cursor.py .......... [ 44%] tests/test_exceptions.py ... [ 45%] tests/test_execute.py ................... [ 52%] tests/test_introspection.py ....... [ 54%] tests/test_listeners.py .......... [ 58%] tests/test_pool.py ........................................... [ 72%] tests/test_prepare.py .................................. [ 84%] tests/test_record.py ......................... [ 93%] tests/test_test.py .. [ 93%] tests/test_timeout.py ......... [ 96%] tests/test_transaction.py ...... [ 98%] tests/test_types.py . [ 99%] tests/test_utils.py .. [100%]

    =================================== FAILURES ===================================
    ____________________ TestConnectParams.test_connect_params _____________________

    self = <tests.test_connect.TestConnectParams testMethod=test_connect_params>

    def test_connect_params(self):
    for testcase in self.TESTS:
    self.run_testcase(testcase)

    tests/test_connect.py:881:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_connect.py:810: in run_testcase
    addrs, params = connect_utils._parse_connect_dsn_and_args( asyncpg/connect_utils.py:266: in _parse_connect_dsn_and_args
    parsed = urllib.parse.urlparse(dsn) /usr/lib/python3.11/urllib/parse.py:395: in urlparse
    splitresult = urlsplit(url, scheme, allow_fragments) /usr/lib/python3.11/urllib/parse.py:516: in urlsplit
    _check_bracketed_netloc(netloc)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    netloc = 'user@[2001:db8::1234%25eth0],[::1]'

    def _check_bracketed_netloc(netloc):
    # Note that this function must mirror the splitting
    # done in NetlocResultMixins._hostinfo().
    hostname_and_port = netloc.rpartition('@')[2]
    before_bracket, have_open_br, bracketed = hostname_and_port.partition('[')
    if have_open_br:
    # No data is allowed before a bracket.
    if before_bracket:
    raise ValueError("Invalid IPv6 URL")
    hostname, _, port = bracketed.partition(']')
    # No data is allowed after the bracket but before the port delimiter.
    if port and not port.startswith(":"):
    raise ValueError("Invalid IPv6 URL")
    E ValueError: Invalid IPv6 URL

    /usr/lib/python3.11/urllib/parse.py:451: ValueError
    =========================== short test summary info ============================
    FAILED tests/test_connect.py::TestConnectParams::test_connect_params - ValueE...
    ====== 1 failed, 289 passed, 2 skipped, 1 deselected in 61.09s (0:01:01) =======
    E: pybuild pybuild:388: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncpg/build; python3.11 -m pytest -k "not test_flake8"
    dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.11 returned exit code 13
    make: *** [debian/rules:8: binary] Error 25
    dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 --------------------------------------------------------------------------------

    The above is just how the build ends and not necessarily the most relevant part.
    If required, the full build log is available here:

    https://people.debian.org/~sanvila/build-logs/bookworm/

    About the archive rebuild: The build was made on virtual machines from AWS, using sbuild and a reduced chroot with only build-essential packages.

    If you could not reproduce the bug please contact me privately, as I
    am willing to provide ssh access to a virtual machine where the bug is
    fully reproducible.

    If this is really a bug in one of the build-depends, please use
    reassign and add an affects on src:asyncpg, so that this is still
    visible in the BTS web page for this package.

    Note: The following packages fail in a similar weird way:

    asyncpg
    python-taskflow
    python-w3lib
    yarl

    Maybe there is a common reason, or maybe the packages need to adapt anyway.

    Thanks.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)