Morganamilo/paru · warning

timed out looking for devel update

Error message

timed out looking for devel update: {}

What it means

src/devel.rs:306 (ls_remote) enforces a timeout on the git ls-remote lookup used for VCS devel-update checks. When the git subprocess/network does not complete in time, the helper prints "timed out looking for devel update: {remote}" and bails with an empty message. This prevents a hung remote from stalling the entire update run.

Solutions

  1. Retry the update when the network is stable — the timeout is transient in most cases.
  2. Test the specific remote with `git ls-remote <url>` to confirm whether it responds at all; remove or replace dead remotes in the VCS package's PKGBUILD.
  3. Check proxy/VPN/firewall settings that may block or throttle git traffic (https_proxy / GIT_SSH_COMMAND).
  4. Skip devel checks temporarily (e.g. run a plain non-devel update) if the remote is known-slow.
Defensive patterns

Strategy: retry

Validate before calling

// Preflight: cap the probe so slow remotes are known upfront
let probe = tokio::time::timeout(
    Duration::from_secs(10),
    tokio::process::Command::new("git").args(["ls-remote", remote]).output(),
).await;
if probe.is_err() { eprintln!("{remote} too slow; will retry or skip"); }

Try / catch

match ls_remote(&pkg).await {
    Ok(info) => use(info),
    Err(e) if e.to_string().contains("timed out") => {
        // transient: back off and retry once, else skip this package
        tokio::time::sleep(Duration::from_secs(5)).await;
        retry_or_skip(&pkg);
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling ls_remote (via has_update or fetch_devel_info) against a remote that is slow or unreachable: flaky network, unresponsive git server, huge repository with slow ref advertisement, or a host that blackholes packets so git never exits before the timeout.

Common situations: Bulk update checks over a poor connection; a mirror or forge (GitHub/GitLab) outage; corporate proxy dropping long-lived connections; VPN drop mid-update.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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

Appendix: source

Thrown at src/devel.rs:306

    style: Style,
    git: &str,
    flags: &[String],
    remote: String,
    branch: Option<&str>,
) -> Result<String> {
    let remote = &remote;
    let time = Duration::from_secs(15);
    let future = ls_remote_internal(git, flags, remote, branch);
    let future = timeout(time, future);

    if let Ok(v) = future.await {
        v
    } else {
        print_error(
            style,
            anyhow!("timed out looking for devel update: {}", remote),
        );
        bail!("")
    }
}

fn parse_url(source: &str) -> Option<(String, &'_ str, Option<&'_ str>)> {
    let url = source.splitn(2, "::").last().unwrap();

    if !url.starts_with("git") || !url.contains("://") {
        return None;
    }

    let mut split = url.splitn(2, "://");
    let protocol = split.next().unwrap();
    let protocol = protocol.rsplit('+').next().unwrap();
    let rest = split.next().unwrap();

    let mut split = rest.splitn(2, '#');
    let remote = split.next().unwrap();
    let remote = remote.split_once('?').map_or(remote, |(x, _)| x);

View on GitHub (pinned to 9ac3578807)