aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororbea <orbea@riseup.net>2024-10-30 10:45:43 -0700
committerorbea <orbea@riseup.net>2024-10-30 10:58:24 -0700
commit665ce736b959607432136613500201dc13a0c5b0 (patch)
treee5ef458ff97d7384f3cb7daf0e0b232bfe6be220
parentdev-python/cryptography: stabilize 43.0.0 for ppc64 (diff)
downloadlibressl-665ce736b959607432136613500201dc13a0c5b0.tar.gz
libressl-665ce736b959607432136613500201dc13a0c5b0.tar.bz2
libressl-665ce736b959607432136613500201dc13a0c5b0.zip
dev-python/cryptography: add 43.0.1, 43.0.3
Signed-off-by: orbea <orbea@riseup.net>
-rw-r--r--dev-python/cryptography/Manifest6
-rw-r--r--dev-python/cryptography/cryptography-43.0.1.ebuild138
-rw-r--r--dev-python/cryptography/cryptography-43.0.3.ebuild138
-rw-r--r--dev-python/cryptography/files/cryptography-43.0.3-libressl-openssl-sys.patch10
4 files changed, 292 insertions, 0 deletions
diff --git a/dev-python/cryptography/Manifest b/dev-python/cryptography/Manifest
index d9047bf..65ae174 100644
--- a/dev-python/cryptography/Manifest
+++ b/dev-python/cryptography/Manifest
@@ -14,8 +14,12 @@ DIST cc-1.1.6.crate 81585 BLAKE2B 412ef9d62c32a42164f8c2b827c10f0d41e75faa77e6d1
DIST cfg-if-1.0.0.crate 7934 BLAKE2B e99a5589c11d79d77a4537b34ce0a45d37b981c123b79b807cea836c89fc3926d693458893baca2882448d3d44e3f64e06141f6d916b748daa10b8cc1ae16d1b SHA512 0fb16a8882fd30e86b62c5143b1cb18ab564e84e75bd1f28fd12f24ffdc4a42e0d2e012a99abb606c12efe3c11061ff5bf8e24ab053e550ae083f7d90f6576ff
DIST cryptography-42.0.8.tar.gz 671250 BLAKE2B 77de79a8f6e78cc375c604e5d7045130c00bb3d2ac5293f5b16dc81e5d58210711943d3e217baea84d7f5348121f15a8326e6228e161cae87f1f7ecd1bfbe321 SHA512 db56db956649c05dea9f405341164126147e94e09ecef3535b63e2fecdb3d64a008c23aedc868406eea0dc1ea8a8efbc2fb29b74b7f04cc50454039e2d2e647f
DIST cryptography-43.0.0.tar.gz 686873 BLAKE2B 09e1f73ed47a3ab03b49e6a65eceb0ee506b4e1c50b44cd0f971243159b27ea5f725350fcf2c702945438545a89d96ec026441b6b6151a9022bd61b926ca26cd SHA512 0a93a217bf09afca32df5ed6792b8e9de210ca4143697b8b97aa2c41b8e8382ffdce1bae47bf51a6319f03d9ec70933218030ab21d642a0ef907cac3e816929c
+DIST cryptography-43.0.1.tar.gz 686927 BLAKE2B 5abc6fd0f06fdca735455c812b089f864457c379ae9a4d646b0a5633285be692e1b17eab0ec50e99b41d1c1238a4f81a4b2b0801777e8e41e25a4faa9285af15 SHA512 db33cc8930492ccdf1aa6466026e4a3ab50382c863fa2c3c454a554cd53f74592e06fb021b2bd6bc16981c8230089c7a076a352a9d7d982a824ef4c7b1895414
+DIST cryptography-43.0.3.tar.gz 686989 BLAKE2B 60efc12c020563aa0d229941d237a39e7d7243045433c7c4cf4c57a8f031569d32bfcd0e43316dd9eb3d6dd3b4e6ad8106b7bdca53c2e6c4ebb094391759da66 SHA512 965ecdbdac09ba4cf3d3289cb7f0997bfb9abd61aa663554f27651328e5da1c92edadba521b1bf779e245255e5db3da7ea8092496f845b73278ffcdd91076bbc
DIST cryptography_vectors-42.0.8.tar.gz 35277813 BLAKE2B 89c3ce911ee65a634c2bb647c57ba99c27f846dcbdf70889f5c589412b50218641ee83e7426ffaa001ed059fab4439c15e9abdb30062f7c0a82bca18c66e6247 SHA512 c81fb4a3773e84504e2f4f935cbf572ed056531671a66c65e55a6377ac8ae9006e0d7d0cc24141c32cbded74bccce487e21290afbe8548318951d4c4de00a84f
DIST cryptography_vectors-43.0.0.tar.gz 35306242 BLAKE2B d1dceec0dbe02ad500c73bd94791c6b47320534268cc4fffdb799a632f37b27bd3de837a725c79f733f86eda813a1a512778615c62144275ca5e7aaaa3d65d08 SHA512 ca5221a390ebea4eda5d72f9ac9632849ce2174db51385405b1b41b702c0dcd2f24f7fbfaa027bb6eb8c63588ac1eae5fdc7978a08c1561dcaaaaa998b67eaef
+DIST cryptography_vectors-43.0.1.tar.gz 35306252 BLAKE2B 0ff68e6c1088656491e474f8770f61c0a2c45a318e565325c9259ffd938a765ea9306f13ba25d5e2097d7d113d8a4556914aa07e016ee90ae78d7157cf6d5e6a SHA512 934c4fadba915b10f3216c08cdb862968d138a40c0a3ea2aed6605685730d1d2b60767660356236b519ff98d52c2f21bf9ead4bc247eab80db27257d671037f2
+DIST cryptography_vectors-43.0.3.tar.gz 35306415 BLAKE2B daf21d6bc7ba81bac2b38e0459c104117c17c3b5c6d74c3f0ba5c0da961999bc2f0fc0a088e6d3498960de70b2862867c6dd10b6e05db99352c0adc9d65104f8 SHA512 7ffbf439b84ea85a8178f6b41a349c8d3ba6586cf6513a6b13d01f55bc0fa8bb5635de2ee9afd334c5660c60cd2fc286f85b2c9c364b6e85bf4164c32fb6ca7e
DIST foreign-types-0.3.2.crate 7504 BLAKE2B 520818b702d990d296ecd31a8646850202509ccfa18edd0e1b260289619a6c351e758f317ec0824bd76eccb209b6f087057c25f1bd01a47897715013dd834867 SHA512 bf27b8243ed482c202d120383374f19ff09422535e24b9c1aebccc66529bf300ca17b8bbc76d67f98ac092e614497afe3add9dc68aa69c93074df05762f91232
DIST foreign-types-shared-0.1.1.crate 5672 BLAKE2B d2e42e04b6657e7a69fe0bd20c672176629c743e49a55fd007bb30e289710b70045d445ae9cae0eeaa747ee708c90e8abd9b5fc39bad8ec0666befe1b696d4f1 SHA512 bafdb2143e136fb0818e2ffd90b5c862b7181647d6568947d4e4531012bbf7a57b597221ec7056c1b562dfc0c3b5dead26d1a4111ebc15e7863737a873518a4a
DIST heck-0.4.1.crate 11567 BLAKE2B 520aeea740cfa30b0cca12f73594ffa655f32959673b1c9caaca1ea0162e455546ae3033881394c0ba0516bcd5c9a997da02162e1585522d665813b9096eabd9 SHA512 8c80e959d2f10a2893f9a71994720f90747742bb5b61fc0a539eed3ea5679b140c48fd7f7690d7122cd6af5f7f20a19d412e3569fe741c6d31f6b2ce1e0b80e8
@@ -30,9 +34,11 @@ DIST memoffset-0.9.1.crate 9032 BLAKE2B 0aab55fe084134bb599c52d77c96400db40949b1
DIST once_cell-1.19.0.crate 33046 BLAKE2B c14b374eaf4ac0f60acc2e02f7bba270a0e8e0a6978d749cd3cb0ab3eb26907e4fbea70dd5132982f90290381ed18ff8a87fd530f1415fabffac864f157ea380 SHA512 4154876afd34a699ee650d1a8a1c5ee5a25f0ebd9388b8bef2564e33629fae68f113d7507488c68abbe7ea1acf9bbc41813cbbf3ef3e464e3f3b9cc7a51d870c
DIST openssl-0.10.64.crate 272306 BLAKE2B a8b618aa403cdb06a7f135cd966775f21c99739365c55aabde2680a6154d03c7d554bfae6c62a069841c70ed82ece6c3f0cd589da8c26022b7022c3c4d79a6d8 SHA512 a1fa9f71cfebbb37ed9d4a902360f2cc95a78f55b5da5d51eef69db38cef016fc03236485158d689ccf054e04937b8cddf88e3f0f31672997fb30c6cac73cbf6
DIST openssl-0.10.66.crate 273705 BLAKE2B 7892e96dac3b24ad5622833b4061bd82028210f9f26ec9772cebb65905ff6e45da8b21ad1aabfb87bb5610f534018da6bd20c10eaee8c189dd08a7ebfbf12b4b SHA512 2f4dd6e40dd8aff8c04563517fabeecd5ac0d986764649cc9af9bf4ce25757a67f75655eee207703b46fe57661a216ff00144358ffcbc70525447a063fa086c1
+DIST openssl-0.10.68.crate 276578 BLAKE2B da7c42f8a87150c76cde12316fe1c170593e76a4bd55176ca5ab7a43c57d5457246bfa91bf7bbf73ca47c87a066789226529fb7ad57c5e93c551baa67f6a9eba SHA512 2b0c7f5a888b0e398ebee9c0fffb6fdb8408c36f96eb99182ebb9e162106c012334554304ddaaa6689d3ae41cdf638ba08187a40088efb95a5e9f6aca032a22f
DIST openssl-macros-0.1.1.crate 5601 BLAKE2B 69dc1c1f3b7bc4f934cae0dce64c3efa501162e5279efd6af3b74f7a7716c04b6996b306b310f1c045cfa2eff2895314a47ecbb020a817e461c6d77d0bc11e92 SHA512 57e75c84f78fb83f884eeaedb0dd135ecb40192dad2facd908e6a575c9b65b38a2c93bca4630e09ea5a82c77d8bc8364cb2f5778cbfe9d8f484cafe3346b883c
DIST openssl-sys-0.9.102.crate 68622 BLAKE2B 0d3d3c9ef8e2542c7f35db1d8feaf512cc7313481bfcc99354d601e8d6332adfc2e7ee8b35599a9241de35c163efd840186e904375bdc9c65ee743abbc154cba SHA512 7ecfaa0b49cea5c60f6f063fe5217252a65b27c5e6d1185e0aa1bb4b59c4cf9bf326840e8795a870a537c18ee5a987feedaaf2dd767cd6f1380f25468a1622bd
DIST openssl-sys-0.9.103.crate 71552 BLAKE2B 4cc1ab93f5a444b4b985c84f6ae90f345da4639e4ff7c5502dc1ae59f842d46e3855057a7c05855f7cd739b5311f330dff361480ef2a0102fe46471506956148 SHA512 61b802f6baf918ec055be90ee47c69fe0184f6d9a1d29c748386192a11d4df115758961ec9b636126a6b42d7d8f7509248c59f7c035905558c4cc35b804a8eaf
+DIST openssl-sys-0.9.104.crate 72287 BLAKE2B d9af8f2ae8a8dfd53b3bb68433a4dd2a4b30038858ac58aa98d7a23b2d23e0b7c7d8fc36c1733d0330bcb9f51284667b2c32fc5a5bd4d9e1a5df7b98d610a997 SHA512 e812d5323bc0ec7376f176a980dd9856dad6d36513e854d333b93ce8a14c20a9ca61be88db82ba2a8ae4e086df5c3fe6965ed10ac155eb7b502e0225c0124278
DIST parking_lot-0.12.1.crate 40967 BLAKE2B 940a112a066e3cbd15e2f6df89bfff37e4ece2194118618a96fa14871813c91798f93181ab0f768d3e1f3d60805508f216724013afb7e3da95678d0d951a42d4 SHA512 07327d3b737a913508dffb66023766348ce7f9d555c224a099cabb05baefd16a28e15fec638e3a148a5169dbd980c4541b0f8820ae9d06dfe0704482838fbd5c
DIST parking_lot_core-0.9.9.crate 32445 BLAKE2B 811d8de671bf6e0911cf0df7dcaee4fb03a3b223173a3bb8cee65a28724eeb7bac87f62aa7b1df5ea3fc93af3cee3ef30b83d06c6773d6b856a7e6fa5fa197ea SHA512 7f0df70f9f1ca8d3da0b9dcc96e49daf05d95c3a995289266b5333f68818d686d32b0c733dfe3a0f62da78fa45caa843a963923b2d0c80899c33413dc749c032
DIST pem-3.0.3.crate 13035 BLAKE2B a9a5b7f9860ad9ee7b355e54c7e885126790e5298715234cc8247ceef8b997311bd1f916d113358cdfb22cbaa3fdae2ed4e3ee139bb1eb969185dbf468148c86 SHA512 7bc100eb0494ef2a86fcc4ba67c328d0cd791718f0c4eb67e66ac998d13e5624dfb6a1919862f684052bf61c7169c5065bde23b30640fe56651cf377fa573b30
diff --git a/dev-python/cryptography/cryptography-43.0.1.ebuild b/dev-python/cryptography/cryptography-43.0.1.ebuild
new file mode 100644
index 0000000..fada6ba
--- /dev/null
+++ b/dev-python/cryptography/cryptography-43.0.1.ebuild
@@ -0,0 +1,138 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+CARGO_OPTIONAL=yes
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=maturin
+PYTHON_COMPAT=( python3_{10..13} pypy3 )
+PYTHON_REQ_USE="threads(+)"
+
+CRATES="
+ asn1@0.16.2
+ asn1_derive@0.16.2
+ autocfg@1.3.0
+ base64@0.22.1
+ bitflags@2.6.0
+ cc@1.1.6
+ cfg-if@1.0.0
+ foreign-types-shared@0.1.1
+ foreign-types@0.3.2
+ heck@0.5.0
+ indoc@2.0.5
+ libc@0.2.155
+ memoffset@0.9.1
+ once_cell@1.19.0
+ openssl-macros@0.1.1
+ openssl-sys@0.9.103
+ openssl@0.10.66
+ pem@3.0.4
+ pkg-config@0.3.30
+ portable-atomic@1.7.0
+ proc-macro2@1.0.86
+ pyo3-build-config@0.22.2
+ pyo3-ffi@0.22.2
+ pyo3-macros-backend@0.22.2
+ pyo3-macros@0.22.2
+ pyo3@0.22.2
+ quote@1.0.36
+ self_cell@1.0.4
+ syn@2.0.71
+ target-lexicon@0.12.15
+ unicode-ident@1.0.12
+ unindent@0.2.3
+ vcpkg@0.2.15
+"
+
+inherit cargo distutils-r1 flag-o-matic multiprocessing pypi
+
+VEC_P=cryptography_vectors-$(ver_cut 1-3)
+DESCRIPTION="Library providing cryptographic recipes and primitives"
+HOMEPAGE="
+ https://github.com/pyca/cryptography/
+ https://pypi.org/project/cryptography/
+"
+SRC_URI+="
+ ${CARGO_CRATE_URIS}
+ test? (
+ $(pypi_sdist_url cryptography_vectors "$(ver_cut 1-3)")
+ )
+"
+
+LICENSE="|| ( Apache-2.0 BSD ) PSF-2"
+# Dependent crate licenses
+LICENSE+="
+ Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD MIT Unicode-DFS-2016
+"
+SLOT="0"
+KEYWORDS="amd64 ~arm ~arm64 ~loong ~mips ~ppc ppc64 ~riscv ~s390 sparc x86"
+
+RDEPEND="
+ >=dev-libs/openssl-1.0.2o-r6:0=
+ $(python_gen_cond_dep '
+ >=dev-python/cffi-1.8:=[${PYTHON_USEDEP}]
+ ' 'python*')
+"
+DEPEND="
+ ${RDEPEND}
+"
+# XXX: Drop explicit >=virtual/rust-1.56.0 dep once that's the minimum in cargo.eclass
+# and replace it with ${RUST_DEPEND}
+BDEPEND="
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ >=virtual/rust-1.56.0
+ test? (
+ dev-python/certifi[${PYTHON_USEDEP}]
+ >=dev-python/hypothesis-1.11.4[${PYTHON_USEDEP}]
+ dev-python/iso8601[${PYTHON_USEDEP}]
+ dev-python/pretend[${PYTHON_USEDEP}]
+ dev-python/pyasn1-modules[${PYTHON_USEDEP}]
+ dev-python/pytest-subtests[${PYTHON_USEDEP}]
+ dev-python/pytest-xdist[${PYTHON_USEDEP}]
+ dev-python/pytz[${PYTHON_USEDEP}]
+ )
+"
+
+# Files built without CFLAGS/LDFLAGS, acceptable for rust
+QA_FLAGS_IGNORED="usr/lib.*/py.*/site-packages/cryptography/hazmat/bindings/_rust.*.so"
+
+distutils_enable_tests pytest
+
+src_unpack() {
+ cargo_src_unpack
+}
+
+src_prepare() {
+ pushd "${ECARGO_HOME}"/gentoo/openssl-sys-0.9.103 > /dev/null || die
+ eapply "${FILESDIR}/${PN}-42.0.8-libressl-openssl-sys.patch"
+ popd > /dev/null || die
+
+ default
+
+ sed -i -e 's:--benchmark-disable::' pyproject.toml || die
+
+ # work around availability macros not supported in GCC (yet)
+ if [[ ${CHOST} == *-darwin* ]] ; then
+ local darwinok=0
+ if [[ ${CHOST##*-darwin} -ge 16 ]] ; then
+ darwinok=1
+ fi
+ sed -i -e 's/__builtin_available(macOS 10\.12, \*)/'"${darwinok}"'/' \
+ src/_cffi_src/openssl/src/osrandom_engine.c || die
+ fi
+}
+
+python_configure_all() {
+ filter-lto # bug #903908
+
+ export UNSAFE_PYO3_SKIP_VERSION_CHECK=1
+}
+
+python_test() {
+ local -x PYTHONPATH="${PYTHONPATH}:${WORKDIR}/cryptography_vectors-${PV}"
+ local EPYTEST_IGNORE=(
+ tests/bench
+ )
+ epytest -n "$(makeopts_jobs)"
+}
diff --git a/dev-python/cryptography/cryptography-43.0.3.ebuild b/dev-python/cryptography/cryptography-43.0.3.ebuild
new file mode 100644
index 0000000..9df5069
--- /dev/null
+++ b/dev-python/cryptography/cryptography-43.0.3.ebuild
@@ -0,0 +1,138 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+CARGO_OPTIONAL=yes
+DISTUTILS_EXT=1
+DISTUTILS_USE_PEP517=maturin
+PYTHON_COMPAT=( python3_{10..13} pypy3 )
+PYTHON_REQ_USE="threads(+)"
+
+CRATES="
+ asn1@0.16.2
+ asn1_derive@0.16.2
+ autocfg@1.3.0
+ base64@0.22.1
+ bitflags@2.6.0
+ cc@1.1.6
+ cfg-if@1.0.0
+ foreign-types-shared@0.1.1
+ foreign-types@0.3.2
+ heck@0.5.0
+ indoc@2.0.5
+ libc@0.2.155
+ memoffset@0.9.1
+ once_cell@1.19.0
+ openssl-macros@0.1.1
+ openssl-sys@0.9.104
+ openssl@0.10.68
+ pem@3.0.4
+ pkg-config@0.3.30
+ portable-atomic@1.7.0
+ proc-macro2@1.0.86
+ pyo3-build-config@0.22.2
+ pyo3-ffi@0.22.2
+ pyo3-macros-backend@0.22.2
+ pyo3-macros@0.22.2
+ pyo3@0.22.2
+ quote@1.0.36
+ self_cell@1.0.4
+ syn@2.0.71
+ target-lexicon@0.12.15
+ unicode-ident@1.0.12
+ unindent@0.2.3
+ vcpkg@0.2.15
+"
+
+inherit cargo distutils-r1 flag-o-matic multiprocessing pypi
+
+VEC_P=cryptography_vectors-$(ver_cut 1-3)
+DESCRIPTION="Library providing cryptographic recipes and primitives"
+HOMEPAGE="
+ https://github.com/pyca/cryptography/
+ https://pypi.org/project/cryptography/
+"
+SRC_URI+="
+ ${CARGO_CRATE_URIS}
+ test? (
+ $(pypi_sdist_url cryptography_vectors "$(ver_cut 1-3)")
+ )
+"
+
+LICENSE="|| ( Apache-2.0 BSD ) PSF-2"
+# Dependent crate licenses
+LICENSE+="
+ Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD MIT Unicode-DFS-2016
+"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~loong ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
+
+RDEPEND="
+ >=dev-libs/openssl-1.0.2o-r6:0=
+ $(python_gen_cond_dep '
+ >=dev-python/cffi-1.8:=[${PYTHON_USEDEP}]
+ ' 'python*')
+"
+DEPEND="
+ ${RDEPEND}
+"
+# XXX: Drop explicit >=virtual/rust-1.56.0 dep once that's the minimum in cargo.eclass
+# and replace it with ${RUST_DEPEND}
+BDEPEND="
+ dev-python/setuptools[${PYTHON_USEDEP}]
+ >=virtual/rust-1.56.0
+ test? (
+ dev-python/certifi[${PYTHON_USEDEP}]
+ >=dev-python/hypothesis-1.11.4[${PYTHON_USEDEP}]
+ dev-python/iso8601[${PYTHON_USEDEP}]
+ dev-python/pretend[${PYTHON_USEDEP}]
+ dev-python/pyasn1-modules[${PYTHON_USEDEP}]
+ dev-python/pytest-subtests[${PYTHON_USEDEP}]
+ dev-python/pytest-xdist[${PYTHON_USEDEP}]
+ dev-python/pytz[${PYTHON_USEDEP}]
+ )
+"
+
+# Files built without CFLAGS/LDFLAGS, acceptable for rust
+QA_FLAGS_IGNORED="usr/lib.*/py.*/site-packages/cryptography/hazmat/bindings/_rust.*.so"
+
+distutils_enable_tests pytest
+
+src_unpack() {
+ cargo_src_unpack
+}
+
+src_prepare() {
+ pushd "${ECARGO_HOME}"/gentoo/openssl-sys-0.9.104 > /dev/null || die
+ eapply "${FILESDIR}/${PN}-43.0.3-libressl-openssl-sys.patch"
+ popd > /dev/null || die
+
+ default
+
+ sed -i -e 's:--benchmark-disable::' pyproject.toml || die
+
+ # work around availability macros not supported in GCC (yet)
+ if [[ ${CHOST} == *-darwin* ]] ; then
+ local darwinok=0
+ if [[ ${CHOST##*-darwin} -ge 16 ]] ; then
+ darwinok=1
+ fi
+ sed -i -e 's/__builtin_available(macOS 10\.12, \*)/'"${darwinok}"'/' \
+ src/_cffi_src/openssl/src/osrandom_engine.c || die
+ fi
+}
+
+python_configure_all() {
+ filter-lto # bug #903908
+
+ export UNSAFE_PYO3_SKIP_VERSION_CHECK=1
+}
+
+python_test() {
+ local -x PYTHONPATH="${PYTHONPATH}:${WORKDIR}/cryptography_vectors-${PV}"
+ local EPYTEST_IGNORE=(
+ tests/bench
+ )
+ epytest -n "$(makeopts_jobs)"
+}
diff --git a/dev-python/cryptography/files/cryptography-43.0.3-libressl-openssl-sys.patch b/dev-python/cryptography/files/cryptography-43.0.3-libressl-openssl-sys.patch
new file mode 100644
index 0000000..7e40720
--- /dev/null
+++ b/dev-python/cryptography/files/cryptography-43.0.3-libressl-openssl-sys.patch
@@ -0,0 +1,10 @@
+--- a/build/main.rs.orig
++++ b/build/main.rs
+@@ -382,6 +382,7 @@
+ (3, 9, _) => ('3', '9', 'x'),
+ (4, 0, 0) => ('4', '0', '0'),
+ (4, 0, _) => ('4', '0', 'x'),
++ (_, _, _) => ('x', 'x', 'x'),
+ _ => version_error(),
+ };
+