fix(void): carry python3-pysocks and constrain the audio and SOCKS floors
Void's stock python3-PyAudio (0.2.12_5) and python3-pysocks (1.7.0_8) sit below the project floors (pyaudio>=0.2.13, PySocks>=1.7.1). voculinux depended on both by bare name, which an installed stock package already satisfies, so a user who had the stock packages was never upgraded. - add packaging/void/srcpkgs/python3-pysocks: PySocks 1.7.1 from the PyPI sdist that uv.lock pins (sha256 3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0) - voculinux depends on python3-PyAudio>=0.2.14_1 and python3-pysocks>=1.7.1_1 - the install smoke installs the stock packages first, then voculinux, and fails unless each reads back as its carried pkgver - tests: each constraint must name its carried template's current version and revision; the stock version must sit below the floor; the depends parser refuses malformed tokens instead of stripping them - docs: "Version floors" in packaging/void/README.md; a pointer in docs/RELEASE_PROCESS.md Refs #16
This commit is contained in:
@@ -21,6 +21,7 @@ packaging/void/
|
||||
├── python3-pywhispercpp/ ticket #26: whisper.cpp Python binding
|
||||
├── python3-pynput/ ticket #25: the input library Void does not ship
|
||||
├── python3-PyAudio/ ticket #25: the audio binding, updated past Void's copy
|
||||
├── python3-pysocks/ spec #16 gap: the SOCKS module, updated past Void's copy
|
||||
└── voculinux ticket #27: the application
|
||||
```
|
||||
|
||||
@@ -33,9 +34,45 @@ packaging/void/
|
||||
| Template | Ticket | Notes |
|
||||
|---|---|---|
|
||||
| `python3-pywhispercpp` | #26 | Vulkan backend on by default; see below |
|
||||
| `python3-pynput`, `python3-PyAudio` | #25 | Dependencies Void does not ship at the needed version |
|
||||
| `python3-pynput` | #25 | A dependency Void does not ship |
|
||||
| `python3-PyAudio`, `python3-pysocks` | spec #16 gap | Void's copies are below the project floors; see [Version floors](#version-floors) |
|
||||
| `voculinux` | #27 | The app, from the canonical release sdist; see below |
|
||||
|
||||
## Version floors
|
||||
|
||||
`pyproject.toml` declares floors that Void's own packages do not meet. On
|
||||
2026-11-06 the stock packages on void-packages master were:
|
||||
|
||||
| Package | Stock Void | Project floor | Carried template | `voculinux` depends |
|
||||
|---|---|---|---|---|
|
||||
| `python3-PyAudio` | 0.2.12_5 | `pyaudio>=0.2.13` | 0.2.14_1 | `python3-PyAudio>=0.2.14_1` |
|
||||
| `python3-pysocks` | 1.7.0_8 | `PySocks>=1.7.1,<2` | 1.7.1_1 | `python3-pysocks>=1.7.1_1` |
|
||||
|
||||
The gap is closed in the personal repository, not hidden. The carried
|
||||
templates build the versions `uv.lock` pins, and `voculinux` names each one
|
||||
with a `>=` constraint in the xbps `name>=version_revision` form (the xbps-src
|
||||
manual lists `<`, `>`, `<=` and `>=`). A bare name would be satisfied by the
|
||||
stock package a user already has, so xbps would leave it in place and the app
|
||||
would run below its floor. With the constraint, xbps takes the carried
|
||||
template from the signed repository instead. Dependency verification stays on.
|
||||
|
||||
The install smoke checks the upgrade, not just a clean install: it installs
|
||||
the stock packages from Void first, then `voculinux`, and fails unless each
|
||||
package reads back as its carried pkgver.
|
||||
`tests/test_void_app_template.py` requires every constraint to name its
|
||||
template's current version and revision, so a template bump without a
|
||||
`depends` bump fails offline. `tests/test_void_small_deps.py` requires the
|
||||
stock version below the floor and the carried version at or above it.
|
||||
|
||||
Known limit: xbps has one comparator per dependency, so PySocks' `<2` cannot
|
||||
be written. The carried 1.7.1 satisfies it. A future Void `python3-pysocks`
|
||||
2.x would also satisfy `>=1.7.1_1`, so it is not excluded by the dependency.
|
||||
|
||||
When a project floor rises, or Void's stock package reaches the floor, change
|
||||
the carried template and its constraint in the same pull request. The
|
||||
stock-below-floor test fails once Void catches up, which is the signal to
|
||||
retire the carried template deliberately.
|
||||
|
||||
## python3-pywhispercpp
|
||||
|
||||
Version `1.5.0`, pinned to the same version `install.sh`
|
||||
@@ -70,9 +107,11 @@ upstream. Read [Version mapping](#version-mapping) and [Checksum](#checksum)
|
||||
before changing `version`, `_tag` or `checksum`.
|
||||
|
||||
- **Runtime deps** are Void's own interpreter, GTK and desktop bindings,
|
||||
the packaged Python libraries, the three templates from tickets #25
|
||||
and #26 (`python3-pynput`, `python3-PyAudio`, `python3-pywhispercpp`),
|
||||
and the helper tools the app shells out to: PipeWire (capture), `wtype`
|
||||
the packaged Python libraries, the carried templates (`python3-pynput`,
|
||||
`python3-PyAudio`, `python3-pysocks` and `python3-pywhispercpp`; the audio
|
||||
binding and SOCKS module are version-constrained, see
|
||||
[Version floors](#version-floors)), and the helper tools the app shells
|
||||
out to: PipeWire (capture), `wtype`
|
||||
(direct typing on niri), `wl-clipboard`, `xdotool` and
|
||||
`pulseaudio-utils`. `ibus` is not a dependency: it cannot inject on
|
||||
niri. Every name was verified to exist in current void-packages; the
|
||||
@@ -156,11 +195,14 @@ host Void install and nothing is published. Stages, in order, each fails the run
|
||||
with `xlint`, built with `xbps-src`, the sdist resolved by `xbps-src show`;
|
||||
4. `sign`: the packages indexed and signed, with no network;
|
||||
5. `install`: in a clean image with no key, an unsigned install is refused, the
|
||||
signed repository is trusted, `voculinux` installs, `voculinux --version`
|
||||
shows the version, the payload checks pass (desktop entry, icon, marker, no
|
||||
models, no pre-rename names, the Vulkan backend, no host-native CPU tuning),
|
||||
and the imports load (`pynput` through its dummy backend, `evdev`, `gi` with
|
||||
Gtk 3, `pywhispercpp.model`, `pyaudio`, and the app's own modules, which keep their retained internal name).
|
||||
signed repository is trusted, Void's stock `python3-PyAudio` and
|
||||
`python3-pysocks` are installed, then `voculinux` installs and upgrades both
|
||||
to the carried versions (see [Version floors](#version-floors)),
|
||||
`voculinux --version` shows the version, the payload checks pass (desktop
|
||||
entry, icon, marker, no models, no pre-rename names, the Vulkan backend, no
|
||||
host-native CPU tuning), and the imports load (`pynput` through its dummy
|
||||
backend, `evdev`, `gi` with Gtk 3, `pywhispercpp.model`, `pyaudio`, `socks`,
|
||||
and the app's own modules, which keep their retained internal name).
|
||||
|
||||
`tests/test_void_smoke_gate.py` asserts offline that the gate stays wired to
|
||||
every `srcpkgs` template.
|
||||
|
||||
@@ -137,12 +137,24 @@ phase_install() {
|
||||
xbps-query voculinux >/dev/null 2>&1 && fail "voculinux was installed by the untrusted attempt"
|
||||
echo "refused without the key, as required (rc=$REFUSAL_RC)"
|
||||
|
||||
echo "== trust the staged key, then install voculinux from the signed repository"
|
||||
echo "== trust the staged key"
|
||||
cp "$XBPS_STAGE"/keys/*.plist /var/db/xbps/keys/
|
||||
|
||||
echo "== stock Void packages below the project floors, as a user who has them already"
|
||||
xbps-install -y --repository="$OFFICIAL" -S python3-PyAudio python3-pysocks >/dev/null
|
||||
|
||||
echo "== install voculinux from the signed repository; the floors must upgrade the stock packages"
|
||||
xbps-install -y --repository="$XBPS_STAGE/repo" --repository="$OFFICIAL" -S voculinux >/dev/null
|
||||
xbps-query voculinux | grep -qx "pkgver: voculinux-${XBPS_VERSION}_1" ||
|
||||
fail "installed package is not voculinux-${XBPS_VERSION}_1"
|
||||
echo "installed: voculinux-${XBPS_VERSION}_1"
|
||||
for PKG in python3-PyAudio python3-pysocks; do
|
||||
PKGFILE=$(ls "$PKG_STAGE"/"$PKG"-[0-9]*.x86_64.xbps | head -n1)
|
||||
PKGVER=$(basename "$PKGFILE" .x86_64.xbps)
|
||||
xbps-query "$PKG" | grep -qx "pkgver: $PKGVER" ||
|
||||
fail "$PKG is not $PKGVER after voculinux: the stock package was not upgraded"
|
||||
echo "upgraded to the carried template: $PKGVER"
|
||||
done
|
||||
|
||||
echo "== the renamed binary reports its version"
|
||||
VERSION_OUT=$(voculinux --version 2>&1) || fail "voculinux --version exited non-zero"
|
||||
@@ -155,7 +167,7 @@ phase_install() {
|
||||
case "$PKG" in
|
||||
voculinux) payload_voculinux "$PKGFILE" ;;
|
||||
python3-pywhispercpp) payload_pywhispercpp "$PKGFILE" ;;
|
||||
python3-pynput | python3-PyAudio) ;; # checked by import below
|
||||
python3-pynput | python3-PyAudio | python3-pysocks) ;; # checked by import below
|
||||
*) fail "no smoke recipe for package $PKG; add one alongside its template" ;;
|
||||
esac
|
||||
done
|
||||
@@ -168,6 +180,7 @@ phase_install() {
|
||||
python3 -c "import gi; gi.require_version('Gtk', '3.0'); from gi.repository import Gtk; print('gi ok: Gtk', Gtk.get_major_version(), Gtk.get_minor_version())"
|
||||
python3 -c "from pywhispercpp.model import Model; print('pywhispercpp.model ok')"
|
||||
python3 -c "import pyaudio; print('pyaudio ok')"
|
||||
python3 -c "import socks; print('pysocks ok')"
|
||||
python3 -c "import vocalinux.main, vocalinux.speech_recognition.recognition_manager; print('vocalinux imports ok')"
|
||||
echo "INSTALL SMOKE OK: voculinux $VERSION installed from the signed repository"
|
||||
}
|
||||
|
||||
@@ -20,6 +20,6 @@ HERE=$(cd -- "$HERE" && pwd)
|
||||
# Dependency order: the app last. tests/test_void_smoke_gate.py fails if this
|
||||
# list drifts from packaging/void/srcpkgs.
|
||||
# shellcheck disable=SC2034 # read as data by build-release.sh, which parses this line
|
||||
PKGS="python3-PyAudio python3-pynput python3-pywhispercpp voculinux"
|
||||
PKGS="python3-PyAudio python3-pynput python3-pysocks python3-pywhispercpp voculinux"
|
||||
|
||||
exec "$HERE/build-release.sh" smoke
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Template file for 'python3-pysocks'
|
||||
# Carried for the personal repository: Void's python3-pysocks is 1.7.0, below
|
||||
# the project floor PySocks>=1.7.1 (pyproject.toml). The version and checksum
|
||||
# are the PyPI sdist that uv.lock pins. See packaging/void/README.md.
|
||||
pkgname=python3-pysocks
|
||||
version=1.7.1
|
||||
revision=1
|
||||
build_style=python3-module
|
||||
hostmakedepends="python3-setuptools"
|
||||
depends="python3"
|
||||
short_desc="Python3 SOCKS client module"
|
||||
maintainer="Orphaned <orphan@voidlinux.org>"
|
||||
license="BSD-3-Clause"
|
||||
homepage="https://github.com/Anorov/PySocks"
|
||||
distfiles="${PYPI_SITE}/P/PySocks/PySocks-${version}.tar.gz"
|
||||
checksum=3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0
|
||||
|
||||
post_install() {
|
||||
vlicense LICENSE
|
||||
}
|
||||
@@ -15,7 +15,12 @@ makedepends="python3-devel"
|
||||
# direct typing on niri, wl-clipboard (wl-copy, wl-paste) for clipboard
|
||||
# paths, xdotool for X11 and the XWayland fallback, pulseaudio-utils for
|
||||
# pactl source listing. ibus is not a dependency: it is excluded on niri.
|
||||
depends="python3 python3-gobject python3-cairo gtk+3 libayatana-appindicator gobject-introspection python3-numpy python3-requests python3-pysocks python3-psutil python3-evdev python3-xlib python3-tqdm python3-platformdirs python3-PyAudio python3-pynput python3-pywhispercpp pipewire wtype wl-clipboard xdotool pulseaudio-utils"
|
||||
# python3-PyAudio and python3-pysocks are version-constrained. Void's stock
|
||||
# packages (0.2.12_5, 1.7.0_8) sit below the project floors, and a bare name is
|
||||
# already satisfied by a stock package a user has installed, so it would never
|
||||
# be upgraded to the carried template. Each >= names the carried template's
|
||||
# version and revision; tests/test_void_app_template.py keeps them in step.
|
||||
depends="python3 python3-gobject python3-cairo gtk+3 libayatana-appindicator gobject-introspection python3-numpy python3-requests python3-pysocks>=1.7.1_1 python3-psutil python3-evdev python3-xlib python3-tqdm python3-platformdirs python3-PyAudio>=0.2.14_1 python3-pynput python3-pywhispercpp pipewire wtype wl-clipboard xdotool pulseaudio-utils"
|
||||
short_desc="Free, offline voice dictation for Linux"
|
||||
maintainer="Xavier Karma <xavier@bongbetic.com>"
|
||||
license="AGPL-3.0-only"
|
||||
|
||||
Reference in New Issue
Block a user