From 65a21c24dc7a774b2ae0143b6ae5c80761137463 Mon Sep 17 00:00:00 2001 From: Arvid Norlander Date: Wed, 31 Jul 2024 19:05:47 +0200 Subject: [PATCH] refactor: Use type aliases properly --- crates/konfigkoll/src/apply.rs | 6 ++---- crates/konfigkoll/src/pkgs.rs | 7 ++----- crates/konfigkoll_core/src/apply.rs | 6 ++---- crates/konfigkoll_core/src/save.rs | 5 ++--- crates/konfigkoll_core/src/state.rs | 1 + crates/konfigkoll_script/src/engine.rs | 5 ++--- .../src/plugins/package_managers.rs | 3 ++- crates/konfigkoll_script/src/plugins/passwd.rs | 4 ++-- crates/paketkoll_cache/src/from_archives.rs | 3 ++- crates/paketkoll_cache/src/original_files.rs | 5 +++-- crates/paketkoll_core/src/backend/arch.rs | 10 ++++++---- crates/paketkoll_core/src/backend/deb.rs | 10 ++++++---- crates/paketkoll_core/src/backend/deb/divert.rs | 7 +++---- .../paketkoll_core/src/backend/systemd_tmpfiles.rs | 2 +- crates/paketkoll_core/src/file_ops.rs | 3 ++- crates/paketkoll_core/src/utils.rs | 2 +- crates/paketkoll_types/src/backend.rs | 12 +++++++++--- 17 files changed, 48 insertions(+), 43 deletions(-) diff --git a/crates/konfigkoll/src/apply.rs b/crates/konfigkoll/src/apply.rs index 9708872c..370ff11b 100644 --- a/crates/konfigkoll/src/apply.rs +++ b/crates/konfigkoll/src/apply.rs @@ -1,16 +1,14 @@ //! Code for applying the configuration to the system. -use std::collections::BTreeMap; use std::sync::Arc; use either::Either; use konfigkoll::cli::Paranoia; use konfigkoll_core::apply::Applicator; -use paketkoll_types::backend::Backend; use paketkoll_types::backend::Files; use paketkoll_types::backend::PackageBackendMap; -use paketkoll_types::backend::PackageMap; +use paketkoll_types::backend::PackageMapMap; use paketkoll_types::intern::Interner; #[allow(clippy::too_many_arguments)] @@ -19,7 +17,7 @@ pub(crate) fn create_applicator( force_dry_run: bool, backend_map: &PackageBackendMap, interner: &Arc, - package_maps: &BTreeMap>, + package_maps: &PackageMapMap, files_backend: &Arc, diff_command: Vec, pager_command: Vec, diff --git a/crates/konfigkoll/src/pkgs.rs b/crates/konfigkoll/src/pkgs.rs index e58ec876..bb99236e 100644 --- a/crates/konfigkoll/src/pkgs.rs +++ b/crates/konfigkoll/src/pkgs.rs @@ -1,6 +1,5 @@ //! Package scanning functions -use std::collections::BTreeMap; use std::sync::Arc; use anyhow::Context; @@ -8,9 +7,7 @@ use itertools::Itertools; use rayon::prelude::*; use konfigkoll_types::PkgInstructions; -use paketkoll_types::backend::Backend; use paketkoll_types::backend::PackageBackendMap; -use paketkoll_types::backend::PackageMap; use paketkoll_types::backend::PackageMapMap; use paketkoll_types::intern::Interner; use paketkoll_types::package::PackageInstallStatus; @@ -20,8 +17,8 @@ pub(crate) fn load_packages( interner: &Arc, backends_pkg: &PackageBackendMap, ) -> anyhow::Result<(PkgInstructions, PackageMapMap)> { - let mut pkgs_sys = BTreeMap::new(); - let mut package_maps: BTreeMap> = BTreeMap::new(); + let mut pkgs_sys = PkgInstructions::new(); + let mut package_maps: PackageMapMap = PackageMapMap::new(); let backend_maps: Vec<_> = backends_pkg .values() .par_bridge() diff --git a/crates/konfigkoll_core/src/apply.rs b/crates/konfigkoll_core/src/apply.rs index 0192de97..e95034d0 100644 --- a/crates/konfigkoll_core/src/apply.rs +++ b/crates/konfigkoll_core/src/apply.rs @@ -1,6 +1,5 @@ //! Apply a stream of instructions to the current system -use std::collections::BTreeMap; use std::fs::Permissions; use std::os::unix::fs::PermissionsExt; use std::sync::Arc; @@ -21,7 +20,6 @@ use paketkoll_types::backend::Backend; use paketkoll_types::backend::Files; use paketkoll_types::backend::OriginalFileQuery; use paketkoll_types::backend::PackageBackendMap; -use paketkoll_types::backend::PackageMap; use paketkoll_types::backend::PackageMapMap; use paketkoll_types::intern::Interner; use paketkoll_types::intern::PackageRef; @@ -83,7 +81,7 @@ pub struct InProcessApplicator { package_backends: PackageBackendMap, file_backend: Arc, interner: Arc, - package_maps: BTreeMap>, + package_maps: PackageMapMap, id_resolver: NameToNumericResolveCache, } @@ -91,7 +89,7 @@ impl InProcessApplicator { pub fn new( package_backends: PackageBackendMap, interner: &Arc, - package_maps: &BTreeMap>, + package_maps: &PackageMapMap, file_backend: &Arc, ) -> Self { Self { diff --git a/crates/konfigkoll_core/src/save.rs b/crates/konfigkoll_core/src/save.rs index 36c98437..9edf15f9 100644 --- a/crates/konfigkoll_core/src/save.rs +++ b/crates/konfigkoll_core/src/save.rs @@ -160,8 +160,7 @@ pub fn save_packages<'instructions>( #[cfg(test)] mod tests { - use std::collections::HashMap; - + use ahash::AHashMap; use camino::Utf8Path; use camino::Utf8PathBuf; use pretty_assertions::assert_eq; @@ -180,7 +179,7 @@ mod tests { #[test] fn test_save_fs_changes() { let mut output = Vec::new(); - let mut file_data = HashMap::new(); + let mut file_data = AHashMap::new(); let file_data_saver = |path: &Utf8Path, contents: &FileContents| { file_data.insert(path.to_owned(), contents.clone()); Ok(()) diff --git a/crates/konfigkoll_core/src/state.rs b/crates/konfigkoll_core/src/state.rs index b23078dd..8ea2fdf8 100644 --- a/crates/konfigkoll_core/src/state.rs +++ b/crates/konfigkoll_core/src/state.rs @@ -172,6 +172,7 @@ enum FsEntry { #[derive(Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct FsEntries { + /// This must be an ordered map, [`diff`] depends on it fs: BTreeMap, } diff --git a/crates/konfigkoll_script/src/engine.rs b/crates/konfigkoll_script/src/engine.rs index 17c886ec..3506e73f 100644 --- a/crates/konfigkoll_script/src/engine.rs +++ b/crates/konfigkoll_script/src/engine.rs @@ -1,4 +1,3 @@ -use std::collections::BTreeMap; use std::fmt::Display; use std::io::Write; use std::panic::catch_unwind; @@ -18,7 +17,7 @@ use rune::Vm; use paketkoll_types::backend::Backend; use paketkoll_types::backend::Files; use paketkoll_types::backend::PackageBackendMap; -use paketkoll_types::backend::PackageMap; +use paketkoll_types::backend::PackageMapMap; use paketkoll_types::intern::Interner; use crate::plugins::command::Commands; @@ -97,7 +96,7 @@ impl EngineState { package_backends: &PackageBackendMap, file_backend_id: Backend, files_backend: &Arc, - package_maps: &BTreeMap>, + package_maps: &PackageMapMap, interner: &Arc, ) { self.package_managers = Some(PackageManagers::create_from( diff --git a/crates/konfigkoll_script/src/plugins/package_managers.rs b/crates/konfigkoll_script/src/plugins/package_managers.rs index b72ebf68..b7fd39fb 100644 --- a/crates/konfigkoll_script/src/plugins/package_managers.rs +++ b/crates/konfigkoll_script/src/plugins/package_managers.rs @@ -18,6 +18,7 @@ use paketkoll_types::backend::Files; use paketkoll_types::backend::OriginalFileQuery; use paketkoll_types::backend::PackageBackendMap; use paketkoll_types::backend::PackageMap; +use paketkoll_types::backend::PackageMapMap; use paketkoll_types::backend::Packages; use paketkoll_types::intern::Interner; @@ -38,7 +39,7 @@ impl PackageManagers { package_backends: &PackageBackendMap, file_backend_id: Backend, files_backend: &Arc, - package_maps: &BTreeMap>, + package_maps: &PackageMapMap, interner: &Arc, ) -> Self { let files_backends = [(file_backend_id, files_backend)]; diff --git a/crates/konfigkoll_script/src/plugins/passwd.rs b/crates/konfigkoll_script/src/plugins/passwd.rs index ecc6d48c..ce1e655c 100644 --- a/crates/konfigkoll_script/src/plugins/passwd.rs +++ b/crates/konfigkoll_script/src/plugins/passwd.rs @@ -175,8 +175,8 @@ impl Passwd { log_and_error!("Duplicate group IDs in group ID mapping"); } Ok(Self { - users: BTreeMap::new(), - groups: BTreeMap::new(), + users: Users::new(), + groups: Groups::new(), user_ids: uids, group_ids: gids, }) diff --git a/crates/paketkoll_cache/src/from_archives.rs b/crates/paketkoll_cache/src/from_archives.rs index 2b43f953..3407a7e5 100644 --- a/crates/paketkoll_cache/src/from_archives.rs +++ b/crates/paketkoll_cache/src/from_archives.rs @@ -17,6 +17,7 @@ use paketkoll_types::backend::Files; use paketkoll_types::backend::Name; use paketkoll_types::backend::OriginalFileError; use paketkoll_types::backend::OriginalFileQuery; +use paketkoll_types::backend::OriginalFilesResult; use paketkoll_types::backend::PackageManagerError; use paketkoll_types::backend::PackageMap; use paketkoll_types::files::FileEntry; @@ -135,7 +136,7 @@ impl Files for FromArchiveCache { queries: &[OriginalFileQuery], packages: &PackageMap, interner: &Interner, - ) -> Result>, OriginalFileError> { + ) -> Result { self.inner.original_files(queries, packages, interner) } diff --git a/crates/paketkoll_cache/src/original_files.rs b/crates/paketkoll_cache/src/original_files.rs index bf0bd92d..0d2cab4d 100644 --- a/crates/paketkoll_cache/src/original_files.rs +++ b/crates/paketkoll_cache/src/original_files.rs @@ -16,6 +16,7 @@ use paketkoll_types::backend::Files; use paketkoll_types::backend::Name; use paketkoll_types::backend::OriginalFileError; use paketkoll_types::backend::OriginalFileQuery; +use paketkoll_types::backend::OriginalFilesResult; use paketkoll_types::backend::PackageManagerError; use paketkoll_types::backend::PackageMap; use paketkoll_types::files::FileEntry; @@ -105,9 +106,9 @@ impl Files for OriginalFilesCache { queries: &[OriginalFileQuery], packages: &PackageMap, interner: &Interner, - ) -> Result>, OriginalFileError> { + ) -> Result { // Build up lists of cached and uncached queries - let mut results = AHashMap::new(); + let mut results = OriginalFilesResult::new(); let mut uncached_queries = Vec::new(); let mut cache_keys = AHashMap::new(); let inner_name = self.name(); diff --git a/crates/paketkoll_core/src/backend/arch.rs b/crates/paketkoll_core/src/backend/arch.rs index de6dea60..98affce2 100644 --- a/crates/paketkoll_core/src/backend/arch.rs +++ b/crates/paketkoll_core/src/backend/arch.rs @@ -16,6 +16,8 @@ use dashmap::DashMap; use dashmap::DashSet; use either::Either; use paketkoll_types::backend::OriginalFileError; +use paketkoll_types::backend::OriginalFilesResult; +use paketkoll_types::backend::OwningPackagesResult; use rayon::prelude::*; use regex::RegexSet; @@ -149,7 +151,7 @@ impl Files for ArchLinux { &self, paths: &AHashSet<&Path>, interner: &Interner, - ) -> anyhow::Result, ahash::RandomState>> { + ) -> anyhow::Result { // Optimise for speed, go directly into package cache and look for files that // contain the given string let file_to_package = DashMap::with_hasher(ahash::RandomState::new()); @@ -185,10 +187,10 @@ impl Files for ArchLinux { queries: &[OriginalFileQuery], packages: &PackageMap, interner: &Interner, - ) -> Result>, OriginalFileError> { + ) -> Result { let queries_by_pkg = group_queries_by_pkg(queries); - let mut results = ahash::AHashMap::new(); + let mut results = OriginalFilesResult::new(); // List of directories to search for the package let dir_candidates = smallvec::smallvec_inline![self.pacman_config.cache_dir.as_str()]; @@ -342,7 +344,7 @@ fn find_files( interner: &Interner, re: &RegexSet, paths: &[String], - output: &DashMap, ahash::RandomState>, + output: &OwningPackagesResult, ) -> anyhow::Result<()> { if !entry.file_type()?.is_dir() { return Ok(()); diff --git a/crates/paketkoll_core/src/backend/deb.rs b/crates/paketkoll_core/src/backend/deb.rs index 10ec9a00..c2390ac0 100644 --- a/crates/paketkoll_core/src/backend/deb.rs +++ b/crates/paketkoll_core/src/backend/deb.rs @@ -13,6 +13,8 @@ use compact_str::format_compact; use compact_str::CompactString; use dashmap::DashMap; use paketkoll_types::backend::OriginalFileError; +use paketkoll_types::backend::OriginalFilesResult; +use paketkoll_types::backend::OwningPackagesResult; use rayon::prelude::*; use regex::RegexSet; @@ -164,7 +166,7 @@ impl Files for Debian { &self, paths: &ahash::AHashSet<&Path>, interner: &Interner, - ) -> anyhow::Result, ahash::RandomState>> { + ) -> anyhow::Result { // Optimise for speed, go directly into package cache and look for files that // contain the given string let file_to_package = DashMap::with_hasher(ahash::RandomState::new()); @@ -204,9 +206,9 @@ impl Files for Debian { queries: &[OriginalFileQuery], packages: &PackageMap, interner: &Interner, - ) -> Result>, OriginalFileError> { + ) -> Result { let queries_by_pkg = group_queries_by_pkg(queries); - let mut results = ahash::AHashMap::new(); + let mut results = OriginalFilesResult::new(); // List of directories to search for the package let dir_candidates = smallvec::smallvec_inline![CACHE_PATH]; @@ -437,7 +439,7 @@ fn is_file_match( interner: &Interner, re: &RegexSet, paths: &[String], - output: &DashMap, ahash::RandomState>, + output: &OwningPackagesResult, ) -> anyhow::Result<()> { let contents = std::fs::read_to_string(list_path) .with_context(|| format!("Failed to read {list_path:?}"))?; diff --git a/crates/paketkoll_core/src/backend/deb/divert.rs b/crates/paketkoll_core/src/backend/deb/divert.rs index 859f2141..0ae95914 100644 --- a/crates/paketkoll_core/src/backend/deb/divert.rs +++ b/crates/paketkoll_core/src/backend/deb/divert.rs @@ -32,7 +32,7 @@ pub(super) fn get_diversions(interner: &Interner) -> anyhow::Result /// Parse output from dpkg-divert --list fn parse_diversions(mut input: impl BufRead, interner: &Interner) -> anyhow::Result { - let mut results = BTreeMap::new(); + let mut results = Diversions::new(); let re = regex::Regex::new(r"^diversion of (?.+) to (?.+) by (?.+)$")?; @@ -84,8 +84,6 @@ fn parse_diversions(mut input: impl BufRead, interner: &Interner) -> anyhow::Res #[cfg(test)] mod tests { - use std::collections::BTreeMap; - use pretty_assertions::assert_eq; use paketkoll_types::intern::Interner; @@ -93,6 +91,7 @@ mod tests { use super::parse_diversions; use super::Diversion; + use super::Diversions; #[test] fn test_parse_diversions() { @@ -108,7 +107,7 @@ mod tests { let interner = Interner::new(); let parsed = parse_diversions(input.as_bytes(), &interner).unwrap(); - let expected = BTreeMap::from_iter(vec![ + let expected = Diversions::from_iter(vec![ ( "/usr/lib/python3.11/EXTERNALLY-MANAGED".into(), Diversion { diff --git a/crates/paketkoll_core/src/backend/systemd_tmpfiles.rs b/crates/paketkoll_core/src/backend/systemd_tmpfiles.rs index 594d3682..6ae016c8 100644 --- a/crates/paketkoll_core/src/backend/systemd_tmpfiles.rs +++ b/crates/paketkoll_core/src/backend/systemd_tmpfiles.rs @@ -112,7 +112,7 @@ impl Files for SystemdTmpfiles { _queries: &[OriginalFileQuery], _packages: &PackageMap, _interner: &paketkoll_types::intern::Interner, - ) -> Result>, OriginalFileError> { + ) -> Result { Err(anyhow::anyhow!( "Original file queries are not supported for systemd-tmpfiles" ))? diff --git a/crates/paketkoll_core/src/file_ops.rs b/crates/paketkoll_core/src/file_ops.rs index 9daa5526..df9ca450 100644 --- a/crates/paketkoll_core/src/file_ops.rs +++ b/crates/paketkoll_core/src/file_ops.rs @@ -8,6 +8,7 @@ use ignore::overrides::OverrideBuilder; use ignore::Match; use ignore::WalkBuilder; use ignore::WalkState; +use paketkoll_types::backend::OriginalFilesResult; use rayon::prelude::*; use paketkoll_types::backend::OriginalFileQuery; @@ -25,7 +26,7 @@ pub fn original_files( backend: &crate::backend::ConcreteBackend, backend_config: &crate::backend::BackendConfiguration, queries: &[OriginalFileQuery], -) -> anyhow::Result>> { +) -> anyhow::Result { let interner = Interner::new(); let backend_impl = backend .create_full(backend_config, &interner) diff --git a/crates/paketkoll_core/src/utils.rs b/crates/paketkoll_core/src/utils.rs index b2985bce..48f810ac 100644 --- a/crates/paketkoll_core/src/utils.rs +++ b/crates/paketkoll_core/src/utils.rs @@ -215,7 +215,7 @@ pub(crate) fn missing_packages<'strings>( pub(crate) fn extract_files( mut archive: tar::Archive, queries: &AHashSet<&str>, - results: &mut AHashMap>, + results: &mut paketkoll_types::backend::OriginalFilesResult, pkg: &str, name_map_filter: impl Fn(&str) -> Option, ) -> Result<(), paketkoll_types::backend::OriginalFileError> { diff --git a/crates/paketkoll_types/src/backend.rs b/crates/paketkoll_types/src/backend.rs index 0ee91237..9716118b 100644 --- a/crates/paketkoll_types/src/backend.rs +++ b/crates/paketkoll_types/src/backend.rs @@ -48,6 +48,12 @@ pub type PackageBackendMap = BTreeMap>; /// Type of map of file backends pub type FilesBackendMap = BTreeMap>; +/// Type of return value of owning packages queries +pub type OwningPackagesResult = DashMap, ahash::RandomState>; + +/// Type of return value of original files queries +pub type OriginalFilesResult = AHashMap>; + /// Get the name of a backend (useful in dynamic dispatch for generating /// reports) pub trait Name: Send + Sync + std::fmt::Debug { @@ -92,7 +98,7 @@ pub trait Files: Name { &self, paths: &AHashSet<&Path>, interner: &Interner, - ) -> anyhow::Result, ahash::RandomState>>; + ) -> anyhow::Result; /// Get the original contents of files fn original_files( @@ -100,7 +106,7 @@ pub trait Files: Name { queries: &[OriginalFileQuery], packages: &PackageMap, interner: &Interner, - ) -> Result>, OriginalFileError>; + ) -> Result; } /// Query type for original file contents @@ -169,7 +175,7 @@ pub fn packages_to_package_map<'a>( packages: impl Iterator, ) -> PackageMap { let mut package_map = - AHashMap::with_capacity_and_hasher(packages.size_hint().0, ahash::RandomState::new()); + PackageMap::with_capacity_and_hasher(packages.size_hint().0, ahash::RandomState::new()); for package in packages { if package.ids.is_empty() { package_map.insert(package.name, package.clone());