From be532d95731dc067302e7910164120a2e4fdf745 Mon Sep 17 00:00:00 2001 From: Kornel Date: Mon, 20 Nov 2023 17:51:12 +0000 Subject: [PATCH] crevette: export guix crates --- Cargo.lock | 9 ++++++++ crevette/Cargo.toml | 3 +++ crevette/src/bin/crevette.rs | 13 ++++++++++++ crevette/src/lib.rs | 41 ++++++++++++++++++++++++++++++++++-- 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8461e32..7ab97e02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -910,6 +910,7 @@ dependencies = [ "directories-next", "flate2", "index-debcargo", + "index-guix", "reqwest", "semver", "serde", @@ -3337,6 +3338,14 @@ dependencies = [ "toml 0.8.8", ] +[[package]] +name = "index-guix" +version = "1.0.0" +dependencies = [ + "gix 0.55.2", + "nom", +] + [[package]] name = "indexmap" version = "2.1.0" diff --git a/crevette/Cargo.toml b/crevette/Cargo.toml index 452632bc..f40ed638 100644 --- a/crevette/Cargo.toml +++ b/crevette/Cargo.toml @@ -23,8 +23,11 @@ toml_edit = { version = "0.21.0", features = ["serde"] } cargo_author = { version = "1.0.6", optional = true } flate2 = { version = "1.0.28", optional = true } index-debcargo = { version = "1.1.0", optional = true } +index-guix = { version = "1.0.0", optional = true, path = "../../index-guix" } reqwest = { version = "0.11.22", features = ["blocking"], optional = true } [features] # Ability to export list of crates vetted by Debian debcargo = ["dep:index-debcargo", "dep:cargo_author", "dep:reqwest", "dep:flate2"] +# Ability to export list of crates included in Guix +guix = ["dep:index-guix"] diff --git a/crevette/src/bin/crevette.rs b/crevette/src/bin/crevette.rs index 1d1bce4e..7d1d9298 100644 --- a/crevette/src/bin/crevette.rs +++ b/crevette/src/bin/crevette.rs @@ -38,6 +38,19 @@ Run with --debcargo to make a vet file from Debian package list.", env!("CARGO_P return Ok(()) } }, + Some("--guix") => { + if !cfg!(feature = "guix") { + eprintln!("Reinstall with guix enabled:\ncargo install crevette --features=guix"); + return Err(Error::UnsupportedVersion(0)); + } + #[cfg(feature = "guix")] + { + let dirs = directories_next::BaseDirs::new().unwrap(); + let cache_dir = dirs.cache_dir().join("crevette"); + println!("{}", Crevette::from_guix_repo(&cache_dir)?); + return Ok(()) + } + }, Some(other) => { eprintln!("unknown argument: {other}"); }, diff --git a/crevette/src/lib.rs b/crevette/src/lib.rs index 3c9abdc3..11734f81 100644 --- a/crevette/src/lib.rs +++ b/crevette/src/lib.rs @@ -107,7 +107,7 @@ impl Crevette { /// Here's your cargo-vet-compatible `audits.toml` file pub fn convert_to_toml(&self) -> Result { let mut toml = toml_edit::ser::to_string_pretty(&self.convert_to_document()?) - .map_err(|toml| Error::IO(std::io::Error::new(std::io::ErrorKind::Other, toml)))?; + .map_err(|toml| Error::IO(io::Error::new(io::ErrorKind::Other, toml)))?; toml.insert_str(0, &format!("# Automatically generated by https://lib.rs/crevette {} from cargo-crev reviews\n\n", env!("CARGO_PKG_VERSION"))); @@ -186,13 +186,50 @@ impl Crevette { }; let mut toml = toml_edit::ser::to_string_pretty(&audits) - .map_err(|toml| Error::IO(std::io::Error::new(std::io::ErrorKind::Other, toml)))?; + .map_err(|toml| Error::IO(io::Error::new(io::ErrorKind::Other, toml)))?; toml.insert_str(0, &format!("# Automatically generated by https://lib.rs/crevette {} from debcargo-conf repo\n\n", env!("CARGO_PKG_VERSION"))); Ok(toml) } + #[cfg(feature = "guix")] + pub fn from_guix_repo(temp_dir_path: &std::path::Path) -> Result { + let _ = std::fs::create_dir_all(&temp_dir_path); + + let g_err = |e: index_guix::Error| Error::ErrorIteratingLocalProofStore(Box::new((temp_dir_path.into(), e.to_string()))); + let g = index_guix::Index::new(temp_dir_path).map_err(g_err)?; + + let all = g.list_all().map_err(g_err)?; + + let mut audits = BTreeMap::new(); + for (category, packages) in all { + for p in packages { + audits.entry(p.name).or_insert_with(Vec::new).push(vet::AuditEntry { + criteria: vec!["safe-to-run"], + aggregated_from: vec![index_guix::GUIX_REPO_URL.to_string()], + notes: Some(format!("Packaged for Guix ({category})")), + delta: None, + version: Some(p.version), + violation: None, + who: vet::StringOrVec::Vec(vec![]), + }); + } + } + + let audits = vet::AuditsFile { + criteria: Default::default(), + audits, + }; + + let mut toml = toml_edit::ser::to_string_pretty(&audits) + .map_err(|toml| Error::IO(io::Error::new(io::ErrorKind::Other, toml)))?; + + toml.insert_str(0, &format!("# Automatically generated by https://lib.rs/crevette {} from guix repo\n\n", env!("CARGO_PKG_VERSION"))); + + Ok(toml) + } + pub fn convert_to_document(&self) -> Result { // audits BTreeMap will sort reviews by crate let mut all = HashMap::new();