From 4969177893027037e48eba3110544d97bb84caaa Mon Sep 17 00:00:00 2001 From: John Turner Date: Sat, 13 Dec 2025 04:49:28 +0000 Subject: [PATCH] read global package.mask --- src/repo/mod.rs | 28 +++++++++++++++++++- src/repo/profile/mod.rs | 2 +- tests/profile/mockrepo/profiles/package.mask | 1 + tests/profile/read_mock_profile.rs | 10 +++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tests/profile/mockrepo/profiles/package.mask diff --git a/src/repo/mod.rs b/src/repo/mod.rs index cbfa87a..250825b 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -13,7 +13,7 @@ use crate::{ atom::{self, Atom}, repo::{ ebuild::{Depend, Eapi, Ebuild, Eclass, License, SrcUri}, - profile::Profile, + profile::{LineBasedFileExpr, Profile}, }, useflag::IUseFlag, }; @@ -43,6 +43,8 @@ pub struct Repo { path: PathBuf, #[get(kind = "deref")] name: String, + #[get(kind = "deref")] + package_mask: Vec, } #[derive(Debug, Clone, Get)] @@ -69,9 +71,19 @@ impl Repo { Err(e) => return Err(Error::Io(name_path, e)), }; + let package_mask_path = path.as_ref().join("profiles/package.mask"); + let package_mask = + match fs::read_to_string(&package_mask_path).map(|s| read_package_mask(&s)) { + Ok(Ok(package_mask)) => package_mask, + Ok(Err(e)) => return Err(e), + Err(e) if matches!(e.kind(), io::ErrorKind::NotFound) => Vec::new(), + Err(e) => return Err(Error::Io(package_mask_path, e)), + }; + Ok(Self { path: path.as_ref().to_path_buf(), name, + package_mask, }) } @@ -340,6 +352,20 @@ fn read_idepend(input: &str) -> Option>, Error>> { Some(parse_depends(line)) } +fn read_package_mask(input: &str) -> Result, Error> { + Ok(profile::LineBasedFileExpr::::parser() + .separated_by_with_opt_trailing(ascii_whitespace1()) + .many() + .parse_finished(InputIter::new(input)) + .map_err(|it| Error::Parser(it.rest().to_string()))? + .into_iter() + .filter_map(|expr| match expr { + LineBasedFileExpr::Comment => None, + LineBasedFileExpr::Expr(atom) => Some(atom), + }) + .collect()) +} + fn parse_depends(line: &str) -> Result>, Error> { Depend::::parser() .separated_by(ascii_whitespace1()) diff --git a/src/repo/profile/mod.rs b/src/repo/profile/mod.rs index 28c6b06..37909c7 100644 --- a/src/repo/profile/mod.rs +++ b/src/repo/profile/mod.rs @@ -32,7 +32,7 @@ mod parsers; mod useflags; #[derive(Debug, Clone)] -enum LineBasedFileExpr { +pub(super) enum LineBasedFileExpr { Comment, Expr(T), } diff --git a/tests/profile/mockrepo/profiles/package.mask b/tests/profile/mockrepo/profiles/package.mask new file mode 100644 index 0000000..11ca885 --- /dev/null +++ b/tests/profile/mockrepo/profiles/package.mask @@ -0,0 +1 @@ +app-editors/vim \ No newline at end of file diff --git a/tests/profile/read_mock_profile.rs b/tests/profile/read_mock_profile.rs index 82c3c1c..da50216 100644 --- a/tests/profile/read_mock_profile.rs +++ b/tests/profile/read_mock_profile.rs @@ -8,6 +8,16 @@ fn main() { .nth(1) .expect("expected path to mockrepo as first argument"); let repo = Repo::new(&repo_path).expect("failed to read repo"); + + let global_package_mask = repo + .package_mask() + .iter() + .map(Atom::to_string) + .sorted() + .collect::>(); + + assert_eq!(global_package_mask, vec!["app-editors/vim"]); + let profile = repo .evaluate_profile("gentoo-desktop") .expect("failed to evaluate profile");