From 59a031d0e42d1b5e48b1ae3c17d4fa0806baa7c1 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Thu, 24 Sep 2026 01:46:51 +0000 Subject: [PATCH] iregexp-check: Add version 0.1.4 Mirrors upstream's maturin/pyo3 release job, narrowed to riscv64 manylinux. --- .github/workflows/build-iregexp-check.yml | 151 ++++++++++++++++++ docs/packages/iregexp-check.yaml | 5 + .../0001-python-bump-abi3-floor-to-py39.patch | 34 ++++ 3 files changed, 190 insertions(+) create mode 100644 .github/workflows/build-iregexp-check.yml create mode 100644 docs/packages/iregexp-check.yaml create mode 100644 patches/iregexp-check/0.1.4/0001-python-bump-abi3-floor-to-py39.patch diff --git a/.github/workflows/build-iregexp-check.yml b/.github/workflows/build-iregexp-check.yml new file mode 100644 index 00000000000..bf2e823f251 --- /dev/null +++ b/.github/workflows/build-iregexp-check.yml @@ -0,0 +1,151 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on the `linux` job of +# https://github.com/jg-rp/rust-iregexp/blob/v0.1.4/.github/workflows/pypi_release.yml +name: Build iregexp-check wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'Version glob to (re)build; empty builds every version of docs/packages/iregexp-check.yaml not released yet' + required: false + default: '' + pull_request: + branches: [main] + paths: + - '.github/workflows/build-iregexp-check.yml' + - 'docs/packages/iregexp-check.yaml' + - 'patches/iregexp-check/**' + push: + branches: [main] + paths: + - '.github/workflows/build-iregexp-check.yml' + - 'docs/packages/iregexp-check.yaml' + - 'patches/iregexp-check/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +env: + MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 + +jobs: + setup: + uses: $/.github/workflows/_setup.yml + with: + package: iregexp-check + version: ${{ inputs.version }} + + build_wheels: + needs: [setup] + if: needs.setup.outputs.versions != '[]' + name: Build iregexp-check ${{ matrix.version }} ${{ matrix.tag }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 360 + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + include: + # crates/python/Cargo.toml hardcodes pyo3's abi3-py38 feature + # unconditionally; the riscv64 manylinux image's oldest interpreter + # is cp39 (no cp38), so patches/ bumps it to abi3-py39 -- gotcha 96. + # Built on cp39 and re-tested on the newer ones via + # find_compatible_wheel. Upstream ships no free-threaded wheel for + # this release (pyo3 0.22 predates Py_GIL_DISABLED), so there is no + # second matrix leg. + - tag: cp39-abi3 + build: >- + cp39-manylinux_riscv64 cp310-manylinux_riscv64 + cp311-manylinux_riscv64 cp312-manylinux_riscv64 + cp313-manylinux_riscv64 cp314-manylinux_riscv64 + + env: + IREGEXP_CHECK_VERSION: ${{ matrix.version }} + + steps: + - name: Checkout rust-iregexp v${{ env.IREGEXP_CHECK_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: jg-rp/rust-iregexp + ref: v${{ env.IREGEXP_CHECK_VERSION }} + persist-credentials: false + + - name: Checkout python-wheels + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + path: python-wheels + persist-credentials: false + + - name: Patch iregexp-check source + run: git apply python-wheels/patches/iregexp-check/${{ env.IREGEXP_CHECK_VERSION }}/00*.patch + + - name: Stage LICENSE beside crates/python's pyproject.toml + # maturin globs LICEN[CS]E* relative to the pyproject directory, + # which is crates/python -- so upstream's published wheel carries + # no licence text at all. + run: cp LICENSE.txt crates/python/LICENSE.txt + + - name: Build wheels + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 + with: + package-dir: crates/python + output-dir: wheelhouse/ + env: + # musllinux is dropped: rustup.rs ships no riscv64 musl toolchain. + CIBW_BUILD: ${{ matrix.build }} + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + CIBW_BEFORE_ALL_LINUX: >- + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + CIBW_ENVIRONMENT_LINUX: PATH="$PATH:$HOME/.cargo/bin" + # Upstream ships no Python test suite; exercise the RFC 9485 + # valid/invalid patterns from crates/iregexp's own Rust test suite. + CIBW_TEST_COMMAND: >- + python -c "import iregexp_check as m; + assert m.iregexp_check.__file__.endswith('.so'), m.iregexp_check.__file__; + assert m.check(r'a.b') is True; + assert m.check(r'[0-9]') is True; + assert m.check(r'foo|bar') is True; + assert m.check(r'[ab]{3}') is True; + assert m.check(r'[ab]{3,5}') is True; + assert m.check(r'[ab]{3,}') is True; + assert m.check(r'[^ab]') is True; + assert m.check(r'\p{L}') is True; + assert m.check(r'\P{L}') is True; + assert m.check(r'(?[a-z]*)') is False; + assert m.check(r'\d') is False; + assert m.check(r'[\S ]') is False; + assert m.check(r'[0-9]*?') is False; + assert m.check(r'(\w)\1') is False; + assert m.check(r'(?=.*[a-z])(?=.*[A-Z])(?=.*)[a-zA-Z]{8,}') is False; + assert m.check(r'(?<=[a-z]{4})\[a-z]{2}') is False; + print('iregexp_check smoke test OK')" + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: iregexp-check-${{ env.IREGEXP_CHECK_VERSION }}-${{ matrix.tag }}-manylinux_riscv64 + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish iregexp-check ${{ matrix.version }} + needs: [setup, build_wheels] + if: needs.setup.outputs.versions != '[]' + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + permissions: + contents: write + pull-requests: write + uses: $/.github/workflows/_publish-wheel.yml + secrets: + app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }} + with: + artifact-pattern: iregexp-check-${{ matrix.version }}-*-manylinux_riscv64 diff --git a/docs/packages/iregexp-check.yaml b/docs/packages/iregexp-check.yaml new file mode 100644 index 00000000000..a6ec9f7749c --- /dev/null +++ b/docs/packages/iregexp-check.yaml @@ -0,0 +1,5 @@ +package-name: iregexp-check +source-code: https://github.com/jg-rp/rust-iregexp +license: MIT +versions: +- version: 0.1.4 diff --git a/patches/iregexp-check/0.1.4/0001-python-bump-abi3-floor-to-py39.patch b/patches/iregexp-check/0.1.4/0001-python-bump-abi3-floor-to-py39.patch new file mode 100644 index 00000000000..b5802f6bb5a --- /dev/null +++ b/patches/iregexp-check/0.1.4/0001-python-bump-abi3-floor-to-py39.patch @@ -0,0 +1,34 @@ +From fc492200784ef0612c95b101b41ddb8754ef9ba2 Mon Sep 17 00:00:00 2001 +From: Ludovic Henry +Date: Thu, 24 Sep 2026 00:00:00 +0000 +Subject: [PATCH] python: bump abi3 floor to py39 + +Upstream-Status: Inappropriate [manylinux_2_39_riscv64 ships no cp38 interpreter] + +The riscv64 manylinux image's oldest available CPython is cp39 (no +cp38), so a wheel built here and tagged cp38-abi3 (this crate's +abi3-py38 feature) would never actually be compiled or tested against +its own declared floor -- gotcha 96. Bump the pyo3 abi3 feature to +abi3-py39 to make the riscv64 wheel's tag match the oldest interpreter +this repo can build and test it on; every other platform's wheel is +unaffected. + +Signed-off-by: Ludovic Henry +--- + crates/python/Cargo.toml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/crates/python/Cargo.toml b/crates/python/Cargo.toml +index a1a4d95..3ecff24 100644 +--- a/crates/python/Cargo.toml ++++ b/crates/python/Cargo.toml +@@ -9,5 +9,5 @@ name = "iregexp_check" + crate-type = ["cdylib"] + + [dependencies] +-pyo3 = { version = "0.22.2", features = ["extension-module", "abi3-py38"] } ++pyo3 = { version = "0.22.2", features = ["extension-module", "abi3-py39"] } + iregexp = { path = "../iregexp" } +-- +2.43.0 +