##// END OF EJS Templates
interfaces: make the `peer` mixin not a Protocol to fix Python 3.10 failures...
interfaces: make the `peer` mixin not a Protocol to fix Python 3.10 failures I can't find any documentation on this, but it appears that Protocol class attributes don't get inherited in subclasses that explicitly subclass a Protocol until Python 3.11, which caused a ton of failures in CI on macOS and Windows (which both test using Python 3.9). The problem started with 1df97507c6b8, and typically manifested as most tests failing to access `ui` on various `peer` classes. Here's a short proof of concept: from __future__ import annotations from typing import ( Protocol, ) class peer(Protocol): limitedarguments: bool = False def __init__(self, arg1, arg2, remotehidden: bool = False) -> None: self.arg1 = arg1 self.arg2 = arg2 class subclass(peer): def __init__(self, arg1, arg2): super(subclass, self).__init__(arg1, arg2, False) sub = subclass(1, 2) print("sub.arg1 is %r" % sub.arg1) When run with Python 3.8.10, 3.9.13, and 3.10.11, the result is: $ py -3.8 prot-test.py Traceback (most recent call last): File "prot-test.py", line 20, in <module> print("sub.arg1 is %r" % sub.arg1) AttributeError: 'subclass' object has no attribute 'arg1' On Python 3.11.9, 3.12.7, and 3.13.0, the result is: $ py -3.11 ../prot-test.py sub.arg1 is 1 Explicitly adding annotations to `peer` like `limitedarguments` didn't help.

File last commit:

r53164:81e59988 stable
r53403:199b0e62 default
Show More
build-linux-wheels.sh
47 lines | 1.3 KiB | application/x-sh | BashLexer
#!/bin/bash
# Intended to run within docker using image:
#
# registry.heptapod.net/mercurial/ci-images/core-wheel-x86_64-c:v3.0
#
# we might want to factor most of this with the associated mercurial-core CI
# definition. (i.e. move this script into a place where the CI can directly call it for its purpose)
set -e -x
PYTHON_TARGETS="cp38-cp38 cp39-cp39 cp310-cp310 cp311-cp311 cp312-cp312 cp313-cp313"
export MERCURIAL_SETUP_FORCE_TRANSLATIONS=1
# We need to copy the repository to ensure:
# (1) we don't wrongly write roots files in the repository (or any other wrong
# users)
# (2) we don't reuse pre-compiled extension built outside for manylinux and
# therefor not compatible.
cp -r /src/ /tmp/src/
cd /tmp/src/
# clear potentially cached artifact from the host
# (we could narrow this purge probably)
hg purge \
--ignored \
--no-confirm
if [ ! -e /src/dist/ ]; then
mkdir -p /src/dist
chown `stat /src/ -c %u:%g` /src/dist/
fi
for py in $PYTHON_TARGETS; do
echo 'build wheel for' $py
# cleanup any previous wheel
tmp_wd="/tmp/wheels/$py/repaired"
rm -rf $tmp_wd
mkdir -p $tmp_wd
# build a new wheel
contrib/build-one-linux-wheel.sh $py $tmp_wd
# fix the owner back to the repository owner
chown `stat /src/ -c %u:%g` $tmp_wd/*.whl
mv $tmp_wd/*.whl /src/dist/
done