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
- Retry the update when the network is stable — the timeout is transient in most cases.
- 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.
- Check proxy/VPN/firewall settings that may block or throttle git traffic (https_proxy / GIT_SSH_COMMAND).
- 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
- Run devel checks on a stable connection; avoid sweeping over VPN/mobile links.
- Check forge status pages (GitHub/GitLab) when many timeouts appear at once.
- Configure proxy env vars (https_proxy, GIT_SSH_COMMAND) correctly for corporate networks.
- Parallelize with per-remote timeouts so one slow host can't stall the whole run.
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.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
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)