Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions .github/workflows/build-hiredis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on: https://github.com/redis/hiredis-py/blob/v3.4.1/.github/workflows/REUSABLE-wheeler.yaml
name: Build hiredis wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'hiredis version to build (git tag without the leading v, e.g. 3.4.1)'
required: true
default: '3.4.1'
pull_request:
paths:
- '.github/workflows/build-hiredis.yml'
- 'patches/hiredis/**'

concurrency:
group: ${{ github.workflow }}-${{ inputs.version || '3.4.1' }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

permissions:
contents: read # to fetch code (actions/checkout)

env:
# `inputs.version` is empty on pull_request events; default to 3.4.1 there.
HIREDIS_VERSION: ${{ inputs.version || '3.4.1' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
build_wheels:
name: Build hiredis ${{ inputs.version || '3.4.1' }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
strategy:
fail-fast: false
matrix:
python: ["cp312", "cp313", "cp314", "cp314t"]

steps:
- name: Checkout hiredis v${{ env.HIREDIS_VERSION }}
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
repository: redis/hiredis-py
ref: v${{ env.HIREDIS_VERSION }}
submodules: recursive
persist-credentials: false

- name: Checkout python-wheels
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
path: python-wheels
persist-credentials: false

- name: Patch hiredis source
run: git apply python-wheels/patches/hiredis/${{ env.HIREDIS_VERSION }}/*.patch

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
only: ${{ matrix.python }}-manylinux_riscv64
env:
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# Upstream's wheel job runs no tests; this is its integration.yaml suite,
# minus pytest-memray, which has no riscv64 build (sdist only, and it needs
# libunwind/liblz4 headers the image does not ship).
CIBW_TEST_REQUIRES: pytest
CIBW_TEST_SOURCES: tests
CIBW_TEST_COMMAND: >-
python -c "import importlib.metadata as m; f = sorted(p.name for p in m.files('hiredis') if '.dist-info/licenses/' in str(p)); assert f == ['LICENSE', 'LICENSE.hiredis'], f"
&& python -m pytest tests

- name: Check the extension made it into the wheel
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
for whl in sys.argv[1:]:
names = zipfile.ZipFile(whl).namelist()
assert any(n.startswith("hiredis/hiredis.") and n.endswith(".so") for n in names), whl
print(whl, "ok")
EOF

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: hiredis-${{ env.HIREDIS_VERSION }}-${{ matrix.python }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish hiredis ${{ inputs.version || '3.4.1' }} to GitLab
needs: [build_wheels]
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write

steps:
- name: Publish wheels and open docs PR
uses: riseproject-dev/python-wheels/actions/publish-wheels@main
with:
artifact-pattern: hiredis-${{ env.HIREDIS_VERSION }}-*-manylinux_riscv64
gitlab-username: ${{ vars.GITLAB_DEPLOY_USER }}
gitlab-token: ${{ secrets.GITLAB_DEPLOY_TOKEN }}
gitlab-project-id: ${{ vars.GITLAB_PROJECT_ID }}
gh-token: ${{ secrets.GITHUB_TOKEN }}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
From 73c6977ad99373e411049acfb781b18d67a55c12 Mon Sep 17 00:00:00 2001
From: Ludovic Henry <git@ludovic.dev>
Date: Wed, 26 Aug 2026 21:11:29 +0200
Subject: [PATCH] add the vendored hiredis licence next to the package's own

Upstream-Status: To upstream [not yet submitted; the same gap exists in every hiredis wheel on PyPI, so this needs a maintainer discussion rather than a drive-by PR]

setup.py compiles vendor/hiredis (hiredis v1.4.1, BSD 3-clause) straight
into the hiredis.hiredis extension, and that licence requires the
copyright notice to be reproduced with binary redistributions. The wheel
ships only the package's own MIT LICENSE: setuptools globs license files
from the project root, and vendor/hiredis/COPYING is not there.

Add the vendored notice at the root as LICENSE.hiredis, which the default
LICEN[CS]E* glob picks up, so it lands in dist-info/licenses/ beside
LICENSE with no packaging change.

Signed-off-by: Ludovic Henry <git@ludovic.dev>
---
LICENSE.hiredis | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 LICENSE.hiredis

diff --git a/LICENSE.hiredis b/LICENSE.hiredis
new file mode 100644
index 0000000..a5fc973
--- /dev/null
+++ b/LICENSE.hiredis
@@ -0,0 +1,29 @@
+Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>
+Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of Redis nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Loading