{"record":{"id":"c714fc06c500c1f1","repo":"Morganamilo/paru","slug":"timed-out-looking-for-devel-update","errorCode":null,"errorMessage":"timed out looking for devel update: {}","messagePattern":"timed out looking for devel update: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/devel.rs","lineNumber":306,"sourceCode":"    style: Style,\n    git: &str,\n    flags: &[String],\n    remote: String,\n    branch: Option<&str>,\n) -> Result<String> {\n    let remote = &remote;\n    let time = Duration::from_secs(15);\n    let future = ls_remote_internal(git, flags, remote, branch);\n    let future = timeout(time, future);\n\n    if let Ok(v) = future.await {\n        v\n    } else {\n        print_error(\n            style,\n            anyhow!(\"timed out looking for devel update: {}\", remote),\n        );\n        bail!(\"\")\n    }\n}\n\nfn parse_url(source: &str) -> Option<(String, &'_ str, Option<&'_ str>)> {\n    let url = source.splitn(2, \"::\").last().unwrap();\n\n    if !url.starts_with(\"git\") || !url.contains(\"://\") {\n        return None;\n    }\n\n    let mut split = url.splitn(2, \"://\");\n    let protocol = split.next().unwrap();\n    let protocol = protocol.rsplit('+').next().unwrap();\n    let rest = split.next().unwrap();\n\n    let mut split = rest.splitn(2, '#');\n    let remote = split.next().unwrap();\n    let remote = remote.split_once('?').map_or(remote, |(x, _)| x);","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/Morganamilo/paru/blob/9ac3578807a87858651e81a02586ceb947686e7c/src/devel.rs#L288-L324","documentation":"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.","triggerScenarios":"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.","commonSituations":"Bulk update checks over a poor connection; a mirror or forge (GitHub/GitLab) outage; corporate proxy dropping long-lived connections; VPN drop mid-update.","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."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Preflight: cap the probe so slow remotes are known upfront\nlet probe = tokio::time::timeout(\n    Duration::from_secs(10),\n    tokio::process::Command::new(\"git\").args([\"ls-remote\", remote]).output(),\n).await;\nif probe.is_err() { eprintln!(\"{remote} too slow; will retry or skip\"); }","typeGuard":null,"tryCatchPattern":"match ls_remote(&pkg).await {\n    Ok(info) => use(info),\n    Err(e) if e.to_string().contains(\"timed out\") => {\n        // transient: back off and retry once, else skip this package\n        tokio::time::sleep(Duration::from_secs(5)).await;\n        retry_or_skip(&pkg);\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["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."],"tags":["git","timeout","network","devel-package"],"backgroundTag":"request-timeout","analyzedSha":"9ac3578807a87858651e81a02586ceb947686e7c","analyzedAt":"2026-09-12T04:57:59.861Z","contentChangedAt":"2026-09-12T04:57:59.861Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}