luci-app-package-manager: handle versioned provides from apk query

'apk query --format json...' outputs the complete provides fields
including the version.
    ...
    "provides": [
      "firewall4-any",
      "uci-firewall=2025.03.17~b6e51575-r2"
    ],
    ...
Versus the previous 'apk info --full'
    ...
    Package: firewall4
    Version: 2025.03.17~b6e51575-r2
    Depends: kmod-nft-core, kmod-nft-fib, kmod-nft-nat, kmod-nft-offload, libc, nftables-json, ucode, ucode-mod-fs, ucode-mod-ubus, ucode-mod-uci
    Provides: firewall4-any, uci-firewall
    ...

Strip the '=<version>' suffix before gathering the providers chain.
This was causing some incorrent dependecy issues (ie. uci-firewall not
detected as satisfied) in the luci package-manager app.

Fixes: https://github.com/openwrt/luci/issues/8563
Fixes: https://github.com/openwrt/luci/issues/8581
Fixes: https://github.com/openwrt/openwrt/issues/23004
Fixes: https://github.com/openwrt/openwrt/issues/23136
Fixes: 1624418f64 ("package-manager: migrate to apk-tools JSON API")
Signed-off-by: Mario Andrés Pérez <mapb_@outlook.com>
(cherry picked from commit 3a3a3196aa)
This commit is contained in:
Mario Andrés Pérez
2026-04-27 21:32:14 +02:00
committed by Paul Donald
parent 51477ec783
commit 012fc3fc3f
@@ -231,7 +231,8 @@ function parseApkQueryJson(s, dest) {
// Determine all provided names (a package always provides itself)
const provides = [name, ...(Array.isArray(pkg.provides) ? pkg.provides : [])];
for (const p of provides) {
for (let p of provides) {
p = p.split('=')[0]; // Handle cases where provides are versioned
dest.providers[p] = dest.providers[p] || [];
if (!dest.providers[p].includes(pkg))
dest.providers[p].push(pkg);