Morganamilo/paru · error

{}: {}: {}

Error message

{}: {}: {}

What it means

show_comments fetches the AUR package web page and parses its comment section. If the HTTP response status is not a success code, it bails with '{base}: {url}: {status}', surfacing the failing package, the requested URL, and the HTTP status code.

Solutions

  1. Verify the package base name exists on the AUR (e.g. browse https://aur.archlinux.org/packages/<name>)
  2. Retry later if the AUR is down or rate-limiting you
  3. Check proxy/VPN settings that could inject error responses
  4. Inspect the status code in the message to decide whether it's 404 (bad name) vs 5xx (server issue)
Defensive patterns

Strategy: try-catch

Validate before calling

// check the package exists before fetching comments
let st = reqwest::Client::new()
    .head(format!("https://aur.archlinux.org/packages/{base}"))
    .send().await?.status();
if !st.is_success() { eprintln!("package {base} not available: {st}"); }

Try / catch

match result {
    Err(e) if e.to_string().contains("404") => eprintln!("package not found on AUR"),
    Err(e) => eprintln!("comment fetch failed: {e}"),
    Ok(_) => {},
}

Prevention

When it happens

Trigger: Calling show_comments (e.g. via a comment-viewing CLI flag) where client.get(url).send() returns a response whose status().is_success() is false — 404 for a nonexistent package, 403/rate-limit, 5xx from the AUR servers.

Common situations: Viewing comments for a package name that was deleted from the AUR; AUR web outage or maintenance returning 5xx; being rate-limited or blocked (403) by the AUR web frontend; network proxy returning non-200 pages.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of Morganamilo/paru@9ac3578807 (2026-09-12). Data as JSON: /api/errors/8b6dced9a34c023e. Report an issue: GitHub.

Appendix: source

Thrown at src/download.rs:465

    let bases = Bases::from_iter(warnings.pkgs);
    let c = config.color;

    for base in &bases.bases {
        let mut url = config
            .aur_url
            .join(&format!("packages/{}", base.package_base()))?;

        if config.comments >= 2 {
            url.set_query(Some("PP=250"));
        }

        let response = client
            .get(url.clone())
            .send()
            .await
            .with_context(|| format!("{}: {}", base, url))?;
        if !response.status().is_success() {
            bail!("{}: {}: {}", base, url, response.status());
        }

        let document = scraper::Html::parse_document(&response.text().await?);
        let titles_selector = scraper::Selector::parse("div.comments h4.comment-header").unwrap();
        let comments_selector =
            scraper::Selector::parse("div.comments div.article-content").unwrap();

        let titles = document
            .select(&titles_selector)
            .map(|node| node.text().collect::<String>());

        let comments = document
            .select(&comments_selector)
            .map(|node| node.text().collect::<String>());

        let iter = titles.zip(comments).collect::<Vec<_>>();

        if config.sort_mode == SortMode::TopDown {

View on GitHub (pinned to 9ac3578807)