From a00a0995bb011c4b37d1185915455fb072f063cf Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Sun, 10 May 2026 23:24:31 -0300 Subject: [PATCH] install: avoid forcing pipewire jack over jack2 --- scripts/install/client.sh | 19 ++++++++++++++- scripts/install/server.sh | 24 ++++++++++++++----- .../install/client_install_script_contract.rs | 8 ++++++- .../install/server_install_script_contract.rs | 11 +++++---- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/scripts/install/client.sh b/scripts/install/client.sh index c04268e..3fefa4f 100755 --- a/scripts/install/client.sh +++ b/scripts/install/client.sh @@ -312,12 +312,28 @@ MSG Good first retry: sudo pacman -Syu --disable-download-timeout If mirrors keep timing out, refresh /etc/pacman.d/mirrorlist before retrying. +MSG + elif grep -Eq "pipewire-jack.*jack2|jack2.*pipewire-jack|are in conflict \\(jack\\)" "$log_file"; then + cat >&2 <<'MSG' +❌ Arch refused to install pipewire-jack because JACK is already provided by jack2. + Lesavka does not require JACK. The installer only keeps pipewire-jack coherent + on hosts that already use it; do not remove jack2 just for Lesavka. + Pull the latest installer and rerun the Lesavka client install. MSG fi echo " pacman log: $log_file" >&2 exit 1 } +pipewire_package_set() { + printf '%s\n' libpipewire pipewire pipewire-audio pipewire-pulse + for package in pipewire-alsa pipewire-jack; do + if pacman -Q "$package" >/dev/null 2>&1; then + printf '%s\n' "$package" + fi + done +} + fetch_client_pki_bundle() { [[ $CLIENT_PKI_AUTO_FETCH != 0 && $CLIENT_PKI_AUTO_FETCH != false && $CLIENT_PKI_AUTO_FETCH != no ]] || return 1 [[ $CLIENT_PKI_SSH_SOURCE == *:* ]] || return 1 @@ -386,9 +402,10 @@ fi REPO_URL=${REPO_URL:-$DEFAULT_REPO_URL} log "1. Installing base packages" +mapfile -t PIPEWIRE_PACKAGES < <(pipewire_package_set) pacman_install \ git rustup protobuf abseil-cpp gcc clang llvm-libs compiler-rt evtest base-devel libpulse \ - libpipewire pipewire pipewire-audio pipewire-alsa pipewire-jack pipewire-pulse wireplumber \ + "${PIPEWIRE_PACKAGES[@]}" wireplumber \ alsa-utils gst-plugin-pipewire \ gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gst-plugins-ugly gst-libav \ wmctrl qt6-tools wl-clipboard xclip xsel desktop-file-utils openssl diff --git a/scripts/install/server.sh b/scripts/install/server.sh index 8978cf8..c3e414b 100755 --- a/scripts/install/server.sh +++ b/scripts/install/server.sh @@ -948,12 +948,28 @@ MSG Good first retry: sudo pacman -Syu --disable-download-timeout If mirrors keep timing out, refresh /etc/pacman.d/mirrorlist before retrying. +MSG + elif grep -Eq "pipewire-jack.*jack2|jack2.*pipewire-jack|are in conflict \\(jack\\)" "$log_file"; then + cat >&2 <<'MSG' +❌ Arch refused to install pipewire-jack because JACK is already provided by jack2. + Lesavka does not require JACK. The installer only keeps pipewire-jack coherent + on hosts that already use it; do not remove jack2 just for Lesavka. + Pull the latest installer and rerun the Lesavka server install. MSG fi echo " pacman log: $log_file" >&2 exit 1 } +pipewire_package_set() { + printf '%s\n' libpipewire pipewire pipewire-audio pipewire-pulse + for package in pipewire-alsa pipewire-jack; do + if pacman -Q "$package" >/dev/null 2>&1; then + printf '%s\n' "$package" + fi + done +} + install_verified_executable() { local src=$1 local dest=$2 @@ -1042,18 +1058,14 @@ fi REPO_URL=${REPO_URL:-$DEFAULT_REPO_URL} echo "==> 1a. Base packages" +mapfile -t PIPEWIRE_PACKAGES < <(pipewire_package_set) pacman_install git \ rustup \ protobuf \ abseil-cpp \ gcc \ alsa-utils \ - libpipewire \ - pipewire \ - pipewire-audio \ - pipewire-alsa \ - pipewire-jack \ - pipewire-pulse \ + "${PIPEWIRE_PACKAGES[@]}" \ tailscale \ base-devel \ v4l-utils \ diff --git a/tests/installer/scripts/install/client_install_script_contract.rs b/tests/installer/scripts/install/client_install_script_contract.rs index 7d4c423..252fc94 100644 --- a/tests/installer/scripts/install/client_install_script_contract.rs +++ b/tests/installer/scripts/install/client_install_script_contract.rs @@ -129,9 +129,15 @@ fn client_install_reports_nvidia_and_open_source_media_routes() { fn client_install_treats_pipewire_as_one_coherent_transaction() { for expected in [ "pacman_install()", - "libpipewire pipewire pipewire-audio pipewire-alsa pipewire-jack pipewire-pulse", + "pipewire_package_set()", + "libpipewire pipewire pipewire-audio pipewire-pulse", + "for package in pipewire-alsa pipewire-jack", + "pacman -Q \"$package\"", + "\"${PIPEWIRE_PACKAGES[@]}\"", "breaks dependency '.*pipewire", "PipeWire packages are at mixed exact versions", + "Lesavka does not require JACK", + "do not remove jack2 just for Lesavka", "sudo pacman -Syu", "failed retrieving file", "sudo pacman -Syu --disable-download-timeout", diff --git a/tests/installer/scripts/install/server_install_script_contract.rs b/tests/installer/scripts/install/server_install_script_contract.rs index d3ada61..b8e6950 100644 --- a/tests/installer/scripts/install/server_install_script_contract.rs +++ b/tests/installer/scripts/install/server_install_script_contract.rs @@ -388,12 +388,15 @@ fn server_install_provisions_non_rebooting_recovery_ladder() { fn server_install_treats_pipewire_as_one_coherent_transaction() { for expected in [ "pacman_install()", - "libpipewire", - "pipewire-audio", - "pipewire-alsa", - "pipewire-jack", + "pipewire_package_set()", + "libpipewire pipewire pipewire-audio pipewire-pulse", + "for package in pipewire-alsa pipewire-jack", + "pacman -Q \"$package\"", + "\"${PIPEWIRE_PACKAGES[@]}\"", "breaks dependency '.*pipewire", "PipeWire packages are at mixed exact versions", + "Lesavka does not require JACK", + "do not remove jack2 just for Lesavka", "failed retrieving file", "sudo pacman -Syu --disable-download-timeout", ] {