From 2d5eabe413365c941f09665e31f5eb7ec3d77290 Mon Sep 17 00:00:00 2001 From: Fabio Forni Date: Wed, 28 Feb 2024 19:24:09 +0100 Subject: [PATCH] Drop the bitflags dependency --- Cargo.lock | 1 - Cargo.toml | 27 ++++++----- moss/Cargo.toml | 1 - moss/src/cli/info.rs | 4 +- moss/src/cli/list.rs | 18 ++++--- moss/src/cli/remove.rs | 6 ++- moss/src/cli/sync.rs | 8 ++-- moss/src/client/install.rs | 8 +++- moss/src/package/mod.rs | 65 ++++++++++++++++++++------ moss/src/registry/mod.rs | 32 +++++++------ moss/src/registry/plugin/active.rs | 14 ++---- moss/src/registry/plugin/cobble.rs | 4 +- moss/src/registry/plugin/repository.rs | 6 +-- moss/src/registry/transaction.rs | 6 +-- 14 files changed, 125 insertions(+), 75 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 941ce32dc..894a551ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1273,7 +1273,6 @@ dependencies = [ name = "moss" version = "0.1.0" dependencies = [ - "bitflags 2.4.2", "bytes", "chrono", "clap", diff --git a/Cargo.toml b/Cargo.toml index b56573bf5..f8dd4d62a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,19 +1,12 @@ [workspace] -members = [ - "boulder", - "moss", - "crates/*", -] -default-members = [ - "moss" -] +members = ["boulder", "moss", "crates/*"] +default-members = ["moss"] resolver = "2" [workspace.package] edition = "2021" [workspace.dependencies] -bitflags = "2.4.1" bytes = "1.5.0" chrono = "0.4.30" clap = { version = "4.4.11", features = ["derive", "string"] } @@ -28,11 +21,23 @@ glob = "0.3.1" hex = "0.4.3" log = "0.4" nom = "7.1.3" -nix = { version = "0.27.1", features = ["user", "fs", "sched", "process", "mount", "hostname", "signal", "term"] } +nix = { version = "0.27.1", features = [ + "user", + "fs", + "sched", + "process", + "mount", + "hostname", + "signal", + "term", +] } once_cell = "1.19.0" petgraph = "0.6.4" rayon = "1.8" -reqwest = { version = "0.11.23", default-features = false, features = ["rustls-tls", "stream"] } +reqwest = { version = "0.11.23", default-features = false, features = [ + "rustls-tls", + "stream", +] } serde = { version = "1", features = ["derive"] } serde_json = "1" serde_yaml = "0.9" diff --git a/moss/Cargo.toml b/moss/Cargo.toml index 781720580..6bbef5edc 100644 --- a/moss/Cargo.toml +++ b/moss/Cargo.toml @@ -10,7 +10,6 @@ stone = { path = "../crates/stone" } tui = { path = "../crates/tui" } vfs = { path = "../crates/vfs" } -bitflags.workspace = true bytes.workspace = true chrono.workspace = true clap.workspace = true diff --git a/moss/src/cli/info.rs b/moss/src/cli/info.rs index b851aa086..02d8001cb 100644 --- a/moss/src/cli/info.rs +++ b/moss/src/cli/info.rs @@ -45,7 +45,7 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { let lookup = Provider::from_name(&pkg).unwrap(); let resolved = client .registry - .by_provider(&lookup, Flags::NONE) + .by_provider(&lookup, Flags::default()) .collect::>() .await; if resolved.is_empty() { @@ -54,7 +54,7 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { for candidate in resolved { print_package(&candidate); - if candidate.flags.contains(Flags::INSTALLED) && show_files { + if candidate.flags.installed && show_files { let vfs = client.vfs([&candidate.id]).await?; print_files(vfs); } diff --git a/moss/src/cli/list.rs b/moss/src/cli/list.rs index ccbb86dec..4c31b237d 100644 --- a/moss/src/cli/list.rs +++ b/moss/src/cli/list.rs @@ -50,12 +50,12 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { let root = args.get_one::("root").unwrap().clone(); let (filter_flags, sync) = match args.subcommand() { - Some(("available", _)) => (Flags::AVAILABLE, None), + Some(("available", _)) => (Flags::new().with_available(), None), Some(("installed", args)) => { let flags = if *args.get_one::("explicit").unwrap() { - Flags::INSTALLED | Flags::EXPLICIT + Flags::new().with_installed().with_explicit() } else { - Flags::INSTALLED + Flags::new().with_installed() }; (flags, None) } @@ -66,7 +66,7 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { Sync::All }; - (Flags::INSTALLED, Some(sync)) + (Flags::new().with_installed(), Some(sync)) } _ => unreachable!(), }; @@ -76,7 +76,11 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { let pkgs = client.registry.list(filter_flags).collect::>().await; let sync_available = if sync.is_some() { - client.registry.list(Flags::AVAILABLE).collect::>().await + client + .registry + .list(Flags::new().with_available()) + .collect::>() + .await } else { vec![] }; @@ -114,8 +118,8 @@ pub async fn handle(args: &ArgMatches) -> Result<(), Error> { release: p.meta.source_release.to_string(), }, summary: p.meta.summary, - explicit: if filter_flags == Flags::INSTALLED { - p.flags.contains(Flags::EXPLICIT) + explicit: if filter_flags == Flags::new().with_installed() { + p.flags.explicit } else { true }, diff --git a/moss/src/cli/remove.rs b/moss/src/cli/remove.rs index ef47aac6c..d13f002c3 100644 --- a/moss/src/cli/remove.rs +++ b/moss/src/cli/remove.rs @@ -43,7 +43,11 @@ pub async fn handle(args: &ArgMatches, root: &Path) -> Result<(), Error> { // Grab a client for the target, enumerate packages let client = Client::new(environment::NAME, root).await?; - let installed = client.registry.list_installed(Flags::NONE).collect::>().await; + let installed = client + .registry + .list_installed(Flags::default()) + .collect::>() + .await; let installed_ids = installed.iter().map(|p| p.id.clone()).collect::>(); // Separate packages between installed / not installed (or invalid) diff --git a/moss/src/cli/sync.rs b/moss/src/cli/sync.rs index 7c7edc320..8d052a05d 100644 --- a/moss/src/cli/sync.rs +++ b/moss/src/cli/sync.rs @@ -13,7 +13,7 @@ use moss::registry::transaction; use moss::state::Selection; use moss::{ client::{self, Client}, - package::{self, Flags}, + package::{self}, Package, }; use thiserror::Error; @@ -53,7 +53,7 @@ pub async fn handle(args: &ArgMatches, root: &Path) -> Result<(), Error> { // Grab all the existing installed packages let installed = client .registry - .list_installed(package::Flags::NONE) + .list_installed(package::Flags::default()) .collect::>() .await; if installed.is_empty() { @@ -180,7 +180,7 @@ async fn resolve_with_sync( let with_sync = stream::iter(packages.iter()) .filter(|p| async { match resolution { - Resolution::Explicit => p.flags.contains(Flags::EXPLICIT), + Resolution::Explicit => p.flags.explicit, Resolution::All => true, } }) @@ -188,7 +188,7 @@ async fn resolve_with_sync( // Get first available = use highest priority if let Some(lookup) = client .registry - .by_name(&p.meta.name, package::Flags::AVAILABLE) + .by_name(&p.meta.name, package::Flags::new().with_available()) .boxed() .next() .await diff --git a/moss/src/client/install.rs b/moss/src/client/install.rs index 1c81ac64f..04c41e1ec 100644 --- a/moss/src/client/install.rs +++ b/moss/src/client/install.rs @@ -30,7 +30,11 @@ pub async fn install(client: &mut Client, pkgs: &[&str], yes: bool) -> Result<() let resolved = client.resolve_packages(tx.finalize()).await?; // Get installed packages to check against - let installed = client.registry.list_installed(Flags::NONE).collect::>().await; + let installed = client + .registry + .list_installed(Flags::default()) + .collect::>() + .await; let is_installed = |p: &Package| installed.iter().any(|i| i.meta.name == p.meta.name); // Get missing packages that are: @@ -128,7 +132,7 @@ async fn find_packages<'a>(id: &'a str, client: &Client) -> (String, Option>() .await; diff --git a/moss/src/package/mod.rs b/moss/src/package/mod.rs index e918d7f9b..4b99f56ae 100644 --- a/moss/src/package/mod.rs +++ b/moss/src/package/mod.rs @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: MPL-2.0 -use bitflags::bitflags; use itertools::Itertools; pub use self::meta::{Meta, MissingMetaFieldError, Name}; @@ -67,20 +66,56 @@ impl Ord for Package { } } -bitflags! { - /// Flags indicating the status of a [`Package`] - #[derive(Debug, Clone,Copy, PartialEq, Eq)] - pub struct Flags: u8 { - /// No filter flags - const NONE = 0; - /// Package is available for installation - const AVAILABLE = 1 << 1; - /// Package is already installed - const INSTALLED = 1 << 2; - /// Available as from-source build - const SOURCE = 1 << 3; - /// Package is explicitly installed (use with [`Flags::INSTALLED`]) - const EXPLICIT = 1 << 4; +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub struct Flags { + /// Package is available for installation. + pub available: bool, + /// Package is already installed. + pub installed: bool, + /// Available as from-source build. + pub source: bool, + /// Package is explicitly installed (use with [`Flags::installed`]). + pub explicit: bool, +} + +impl Flags { + pub fn new() -> Self { + Self::default() + } + + /// Returns a copy of [`Flags`] with available set to true. + pub fn with_available(self) -> Self { + Self { + available: true, + ..self + } + } + + /// Returns a copy of [`Flags`] with installed set to true. + pub fn with_installed(self) -> Self { + Self { + installed: true, + ..self + } + } + + /// Returns a copy of [`Flags`] with source set to true. + pub fn with_source(self) -> Self { + Self { source: true, ..self } + } + + /// Returns a copy of [`Flags`] with explicit set to true. + pub fn with_explicit(self) -> Self { + Self { explicit: true, ..self } + } + + /// Returns whether this flag set contains another flag set. + pub fn contains(&self, other: Self) -> bool { + (self.bits() & other.bits()) == other.bits() + } + + fn bits(&self) -> u32 { + (self.available as u32) | (self.installed as u32) << 1 | (self.source as u32) << 2 | (self.explicit as u32) << 3 } } diff --git a/moss/src/registry/mod.rs b/moss/src/registry/mod.rs index 7a6d06e80..f8666177f 100644 --- a/moss/src/registry/mod.rs +++ b/moss/src/registry/mod.rs @@ -88,12 +88,12 @@ impl Registry { /// Return a sorted stream of installed [`Package`] pub fn list_installed(&self, flags: package::Flags) -> impl Stream + '_ { - self.list(flags | package::Flags::INSTALLED) + self.list(flags.with_installed()) } /// Return a sorted stream of available [`Package`] pub fn list_available(&self, flags: package::Flags) -> impl Stream + '_ { - self.list(flags | package::Flags::AVAILABLE) + self.list(flags.with_available()) } /// Return a new transaction for this registry @@ -139,7 +139,7 @@ mod test { hash: Default::default(), download_size: Default::default(), }, - flags: package::Flags::NONE, + flags: package::Flags::default(), }; registry.add_plugin(Plugin::Test(plugin::Test::new( @@ -154,7 +154,7 @@ mod test { vec![package("c", 50), package("d", 1)], ))); - let mut query = registry.list(package::Flags::NONE).enumerate().boxed(); + let mut query = registry.list(package::Flags::default()).enumerate().boxed(); // Packages are sorted by plugin priority, desc -> release number, desc while let Some((idx, package)) = query.next().await { @@ -199,18 +199,24 @@ mod test { registry.add_plugin(Plugin::Test(plugin::test::Test::new( 1, vec![ - package("a", package::Flags::INSTALLED), - package("b", package::Flags::AVAILABLE), - package("c", package::Flags::SOURCE), - package("d", package::Flags::SOURCE | package::Flags::INSTALLED), - package("e", package::Flags::SOURCE | package::Flags::AVAILABLE), + package("a", package::Flags::new().with_installed()), + package("b", package::Flags::new().with_available()), + package("c", package::Flags::new().with_source()), + package("d", package::Flags::new().with_source().with_installed()), + package("e", package::Flags::new().with_source().with_available()), ], ))); - let installed = registry.list_installed(package::Flags::NONE).collect().await; - let available = registry.list_available(package::Flags::NONE).collect().await; - let installed_source = registry.list_installed(package::Flags::SOURCE).collect().await; - let available_source = registry.list_available(package::Flags::SOURCE).collect().await; + let installed = registry.list_installed(package::Flags::default()).collect().await; + let available = registry.list_available(package::Flags::default()).collect().await; + let installed_source = registry + .list_installed(package::Flags::new().with_source()) + .collect() + .await; + let available_source = registry + .list_available(package::Flags::new().with_source()) + .collect() + .await; fn matches(actual: Vec, expected: &[&'static str]) -> bool { let actual = actual diff --git a/moss/src/registry/plugin/active.rs b/moss/src/registry/plugin/active.rs index b285338c7..50d35adc9 100644 --- a/moss/src/registry/plugin/active.rs +++ b/moss/src/registry/plugin/active.rs @@ -41,7 +41,7 @@ impl Active { /// Query, restricted to state async fn query(&self, flags: package::Flags, filter: Option) -> Vec { - if flags.contains(package::Flags::INSTALLED) || flags == package::Flags::NONE { + if flags.installed || flags == package::Flags::default() { // TODO: Error handling let packages = match self.db.query(filter).await { Ok(packages) => packages, @@ -55,13 +55,7 @@ impl Active { .into_iter() .filter_map(|(id, meta)| self.installed_package(id, meta)) // Filter for explicit only packages, if applicable - .filter(|package| { - if flags.contains(package::Flags::EXPLICIT) { - package.flags.contains(package::Flags::EXPLICIT) - } else { - true - } - }) + .filter(|package| if flags.explicit { package.flags.explicit } else { true }) .collect() } else { vec![] @@ -99,9 +93,9 @@ impl Active { id, meta, flags: if selection.explicit { - package::Flags::INSTALLED | package::Flags::EXPLICIT + package::Flags::new().with_installed().with_explicit() } else { - package::Flags::INSTALLED + package::Flags::new().with_installed() }, }), None => None, diff --git a/moss/src/registry/plugin/cobble.rs b/moss/src/registry/plugin/cobble.rs index d08507732..bd929a10c 100644 --- a/moss/src/registry/plugin/cobble.rs +++ b/moss/src/registry/plugin/cobble.rs @@ -55,7 +55,7 @@ impl Cobble { } fn query(&self, flags: package::Flags, filter: impl Fn(&Meta) -> bool) -> Vec { - if flags.contains(package::Flags::AVAILABLE) { + if flags.available { self.packages .iter() .filter(|(_, state)| filter(&state.meta)) @@ -99,7 +99,7 @@ impl State { id, meta: self.meta.clone(), // TODO: Is this correct flag? - flags: package::Flags::AVAILABLE, + flags: package::Flags::new().with_available(), } } } diff --git a/moss/src/registry/plugin/repository.rs b/moss/src/registry/plugin/repository.rs index 458772e7f..46ab76871 100644 --- a/moss/src/registry/plugin/repository.rs +++ b/moss/src/registry/plugin/repository.rs @@ -40,7 +40,7 @@ impl Repository { .map(|url| url.to_string()), ..meta }, - flags: package::Flags::AVAILABLE, + flags: package::Flags::new().with_available(), }), Err(db::meta::Error::RowNotFound) => None, Err(error) => { @@ -51,7 +51,7 @@ impl Repository { } async fn query(&self, flags: package::Flags, filter: Option) -> Vec { - if flags.contains(package::Flags::AVAILABLE) || flags == package::Flags::NONE { + if flags.available || flags == package::Flags::default() { // TODO: Error handling let packages = match self.active.db.query(filter).await { Ok(packages) => packages, @@ -66,7 +66,7 @@ impl Repository { .map(|(id, meta)| Package { id, meta, - flags: package::Flags::AVAILABLE, + flags: package::Flags::new().with_available(), }) .collect() } else { diff --git a/moss/src/registry/transaction.rs b/moss/src/registry/transaction.rs index 47b966e7a..eea01d976 100644 --- a/moss/src/registry/transaction.rs +++ b/moss/src/registry/transaction.rs @@ -138,7 +138,7 @@ impl<'a> Transaction<'a> { match filter { ProviderFilter::All(provider) => self .registry - .by_provider(&provider, package::Flags::AVAILABLE) + .by_provider(&provider, package::Flags::new().with_available()) .boxed() .next() .await @@ -146,7 +146,7 @@ impl<'a> Transaction<'a> { .ok_or(Error::NoCandidate(provider.to_string())), ProviderFilter::InstalledOnly(provider) => self .registry - .by_provider(&provider, package::Flags::INSTALLED) + .by_provider(&provider, package::Flags::new().with_installed()) .boxed() .next() .await @@ -154,7 +154,7 @@ impl<'a> Transaction<'a> { .ok_or(Error::NoCandidate(provider.to_string())), ProviderFilter::Selections(provider) => self .registry - .by_provider(&provider, package::Flags::NONE) + .by_provider(&provider, package::Flags::default()) .filter_map(|f| async { if self.packages.node_exists(&f.id) { Some(f)