jdx/mise · error

pacman -Q returned no package for satisfied requirement '{}'

Error message

pacman -Q returned no package for satisfied requirement '{}'

What it means

During installed() resolution, pacman -T (deptest) said a requirement is satisfied, so mise re-queries `pacman -Q <name>` to attribute it to a provider package; apply_provider_query (src/system/packages/pacman.rs:104) expects a 'name version' line on stdout and bails when there is none. It signals pacman giving inconsistent answers — the dependency is satisfied per -T but unfindable by the name-only local query — typical for virtual/provided packages and versioned provides.

Source

Thrown at src/system/packages/pacman.rs:104

        .map(str::trim)
        .filter(|line| !line.is_empty())
        .collect()
}

fn deptest_requirement(req: &PackageRequest) -> String {
    match &req.version {
        Some(version) => format!("{}={version}", req.name),
        None => req.name.clone(),
    }
}

fn apply_provider_query<'a>(
    status: &mut PackageStatus,
    output: &'a str,
    constraint_satisfied: bool,
) -> Result<&'a str> {
    let Some((provider, version)) = parse_pacman_package(output) else {
        bail!(
            "pacman -Q returned no package for satisfied requirement '{}'",
            status.request.name
        );
    };
    // The provider's package version is display metadata; pacman -T evaluates
    // the requested version against the version declared in Provides.
    status.state = if constraint_satisfied {
        PackageState::Installed {
            version: version.to_string(),
        }
    } else {
        PackageState::VersionMismatch {
            installed: version.to_string(),
        }
    };
    Ok(provider)
}

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Reproduce with both commands: `pacman -T <name>` (expect success) then `pacman -Q <name>` (expect the failure)
  2. Replace the virtual name in config with the real provider package (request gawk instead of awk)
  3. Refresh the local db (`pacman -Syu`) to clear stale state and retry
  4. If reproducible, report to mise with both command outputs
Defensive patterns

Strategy: try-catch

Validate before calling

# reproduce the inconsistency before trusting the manager
pacman -T "$req" >/dev/null; echo "deptest exit: $?"   # 0 = satisfied
pacman -Q "$name"                       # must print "name version" for the provider

Try / catch

if let Err(err) = pacman_manager.installed(&pkgs).await {
    if format!("{err:#}").contains("returned no package for satisfied requirement") {
        // pacman -T/-Q disagree on a virtual: replace the entry with the real provider name
    } else {
        return Err(err);
    }
}

Prevention

When it happens

Trigger: A [bootstrap.packages] entry naming a virtual package (a capability like 'awk' or a versioned 'foo=1.2') where `pacman -T` exits satisfied but `pacman -Q <name>` prints no parseable package line, because -Q resolves installed names rather than provides.

Common situations: Requesting capability-style virtuals instead of real package names; stale local databases after partial updates; unusual versioned provides in AUR-adjacent packages.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/bef70f239fffbe5d. Report an issue: GitHub.