From ed528573eec3a5fcdc192ce8339a9d534f53acfa Mon Sep 17 00:00:00 2001 From: Bloxx12 Date: Sun, 4 May 2025 16:09:30 +0200 Subject: [PATCH] src/main.rs: cleanup --- Cargo.toml | 2 + src/main.rs | 120 +++++++++++++++++++++++++--------------------------- 2 files changed, 59 insertions(+), 63 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1c2dc19..ef27f8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,5 @@ edition = "2024" clap = { version = "4.5.37", features = ["derive"] } regex = "1.11.1" +[workspace.lints.clippy] +pedantic = { level = "warn", priority = -1 } diff --git a/src/main.rs b/src/main.rs index c525356..8e32986 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,9 +3,8 @@ use core::str; use regex::Regex; use std::{ collections::{HashMap, HashSet}, - hash::Hash, process::Command, - string::String, + string::{String, ToString}, }; #[derive(Parser, Debug)] @@ -19,12 +18,6 @@ struct Args { paths: bool, } -#[derive(Debug, PartialEq, PartialOrd, Eq, Clone, Hash)] -struct Package<'a> { - name: &'a str, - version: &'a str, -} - // Only there to make the compiler shut up for now. #[derive(Debug)] enum BlaErr { @@ -39,73 +32,72 @@ fn main() { println!("<<< {}", args.path.to_string_lossy()); println!(">>> {}", args.path2.to_string_lossy()); - if check_if_system(&args.path) && check_if_system(&args.path2) { - let packages = get_packages(&args.path); - let packages2 = get_packages(&args.path2); + let packages = get_packages(&args.path); + let packages2 = get_packages(&args.path2); - if let (Ok(packages), Ok(packages2)) = (packages, packages2) { - let mut pre: HashMap = HashMap::new(); - let mut post: HashMap = HashMap::new(); + if let (Ok(packages), Ok(packages2)) = (packages, packages2) { + // Map from packages of the first closure to their version + let mut pre: HashMap = HashMap::new(); - for p in packages.iter() { - let version = get_version(p); - pre.insert(version.0.to_string(), version.1.to_string()); + // Map from packages of the second closure to their version + let mut post: HashMap = HashMap::new(); + + for p in &packages { + let version = get_version(p); + pre.insert(version.0.to_string(), version.1.to_string()); + } + + for p in &packages2 { + let version = get_version(p); + post.insert(version.0.to_string(), version.1.to_string()); + } + + // Compare the package names of both versions + let pre_keys: HashSet = pre.clone().into_keys().collect(); + let post_keys: HashSet = post.clone().into_keys().collect(); + // get the intersection of the package names for version changes + let maybe_changed: HashSet<_> = pre_keys.intersection(&post_keys).collect(); + + // difference gives us added and removed packages + let added: HashSet = &post_keys - &pre_keys; + let removed: HashSet = &pre_keys - &post_keys; + + println!("Difference between the two generations:"); + println!("Packages added: "); + for p in added { + let version = post.get(&p); + if let Some(ver) = version { + println!("A: {p} @ {ver}"); } - - for p in packages2.iter() { - let version = get_version(p); - post.insert(version.0.to_string(), version.1.to_string()); + } + println!(); + println!("Packages removed: "); + for p in removed { + let version = pre.get(&p); + if let Some(ver) = version { + println!("R: {p} @ {ver}"); } - - let pre_keys: HashSet = pre.clone().into_keys().collect(); - let post_keys: HashSet = post.clone().into_keys().collect(); - - let added: HashSet = &post_keys - &pre_keys; - let removed: HashSet = &pre_keys - &post_keys; - let maybe_changed: HashSet<_> = pre_keys.intersection(&post_keys).collect(); - - println!("Difference between the two generations:"); - println!("Packages added: "); - for p in added { - let version = post.get(&p); - if let Some(ver) = version { - println!("A: {} @ {}", p, ver); - } + } + println!(); + println!("Version changes: "); + for p in maybe_changed { + if p.is_empty() { + continue; } - println!(); - println!("Packages removed: "); - for p in removed { - let version = pre.get(&p); - if let Some(ver) = version { - println!("R: {} @ {}", p, ver); - } - } - println!(); - println!("Version changes: "); - for p in maybe_changed { - if p.is_empty() { - continue; - } - let version_pre = pre.get(p); - let version_post = post.get(p); + let version_pre = pre.get(p); + let version_post = post.get(p); - if let (Some(ver_pre), Some(ver_post)) = (version_pre, version_post) { - if ver_pre != ver_post { - println!("C: {} @ {} -> {}", p, ver_pre, ver_post); - } + if let (Some(ver_pre), Some(ver_post)) = (version_pre, version_post) { + if ver_pre != ver_post { + println!("C: {p} @ {ver_pre} -> {ver_post}"); } } } - } else { - println!("One of them is not a system!") } } -fn check_if_system(path: &std::path::Path) -> bool { - path.join("activate").exists() -} - fn get_packages(path: &std::path::Path) -> Result, BlaErr> { + // get the nix store paths using nix-store --query --references let references = Command::new("nix-store") .arg("--query") .arg("--references") @@ -116,7 +108,7 @@ fn get_packages(path: &std::path::Path) -> Result, BlaErr> { let list = str::from_utf8(&query.stdout); if let Ok(list) = list { - let res: Vec = list.lines().map(|s| s.to_string()).collect(); + let res: Vec = list.lines().map(ToString::to_string).collect(); return Ok(res); } } @@ -124,6 +116,7 @@ fn get_packages(path: &std::path::Path) -> Result, BlaErr> { } fn get_version(pack: &str) -> (&str, &str) { + // funny regex to split a nix store path into its name and its version. let re = Regex::new(r"^/nix/store/[a-z0-9]+-(.+?)-([0-9].*?)$").unwrap(); // No cap frfr @@ -137,6 +130,7 @@ fn get_version(pack: &str) -> (&str, &str) { } fn check_nix_available() -> bool { + // Check if nix is available on the host system. let nix_available = Command::new("nix").arg("--version").output().ok(); let nix_query_available = Command::new("nix-store").arg("--version").output().ok();