Morganamilo/paru · error

could not find .SRCINFO for

Error message

could not find .SRCINFO for '{}'

What it means

download_pkgbuilds expects each requested package to have a .SRCINFO file available locally (after cloning) so it can parse package metadata. If the expected .SRCINFO path does not exist, it bails with "could not find .SRCINFO for '<pkgbase>'".

Solutions

  1. Clear the cached clone directory for that package (usually ~/.cache/<helper>/<pkgbase>) and retry
  2. Verify the package still exists and has .SRCINFO on the AUR
  3. Re-run with a fresh clone so the download step completes fully
  4. Check disk space and permissions on the cache directory

Example fix

// before
rm -rf ~/.cache/paru/paru.db
// after (remove just the broken package clone)
rm -rf ~/.cache/paru/<pkgbase> && paru -S <pkgbase>
Defensive patterns

Strategy: validation

Validate before calling

let path = cache_dir.join(format!("{pkgbase}/.SRCINFO"));
if !path.exists() {
    eprintln!("missing .SRCINFO for {pkgbase}; clearing cache clone");
    std::fs::remove_dir_all(cache_dir.join(pkgbase)).ok();
}

Prevention

When it happens

Trigger: During prepare_build's download step, the cloned/downloaded package directory lacks a .SRCINFO file where the code looks for one — e.g. the download produced an empty or partial directory, or the package on the AUR is malformed.

Common situations: AUR package deleted mid-operation; interrupted or failed git clone leaving no .SRCINFO; stale cache directory missing files after an AUR helper upgrade; package that genuinely never had a valid .SRCINFO.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


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

Appendix: source

Thrown at src/install.rs:207

            }
        }

        download::new_aur_pkgbuilds(config, bases, &self.srcinfos).await?;

        for base in &bases.bases {
            if self.srcinfos.contains_key(base.package_base()) {
                continue;
            }
            let path = config.build_dir.join(base.package_base()).join(".SRCINFO");
            if path.exists() {
                if let Entry::Vacant(vacant) = self.srcinfos.entry(base.package_base().to_string())
                {
                    let srcinfo = Srcinfo::from_path(path)
                        .with_context(|| tr!("failed to parse srcinfo for '{}'", base))?;
                    vacant.insert(srcinfo);
                }
            } else {
                bail!(tr!("could not find .SRCINFO for '{}'", base.package_base()));
            }
        }
        Ok(())
    }

    fn chroot_install(&self, config: &Config, build: &[Base], repo_targs: &[String]) -> Result<()> {
        if !config.chroot {
            return Ok(());
        }

        if !config.args.has_arg("w", "downloadonly") {
            let mut targets = Vec::new();

            let iter = build.iter().filter(|b| {
                !self
                    .failed
                    .iter()
                    .any(|f| b.package_base() == f.package_base())

View on GitHub (pinned to 9ac3578807)