diff options
| author | pablu <me@pablu.de> | 2026-05-07 17:19:01 +0200 |
|---|---|---|
| committer | pablu <me@pablu.de> | 2026-05-07 17:19:01 +0200 |
| commit | 4025459d8405e2dfb3d54d6c49fdf2cf8c990bc5 (patch) | |
| tree | 00e754014229e150a5fb6054cf79a63c57d68a76 /src/gentoo | |
| parent | 673853a8857c06a1b3e38122818e4eb0a3a77bb6 (diff) | |
Metadata field
Diffstat (limited to 'src/gentoo')
| -rw-r--r-- | src/gentoo/package.rs | 21 | ||||
| -rw-r--r-- | src/gentoo/portage.rs | 79 |
2 files changed, 97 insertions, 3 deletions
diff --git a/src/gentoo/package.rs b/src/gentoo/package.rs index 0fe9a6c..1d7b3f3 100644 --- a/src/gentoo/package.rs +++ b/src/gentoo/package.rs @@ -6,15 +6,34 @@ pub struct Package { pub name: String, pub use_flags: Vec<UseFlag>, pub version: String, + pub repository: String, + pub maintainer: Option<String>, + pub description: Option<String>, + pub homepage: Option<Vec<String>>, + pub license: Option<String>, } #[allow(dead_code)] impl Package { - pub fn new(name: String, version: String, use_flags: Vec<UseFlag>) -> Self { + pub fn new( + name: String, + version: String, + repository: String, + homepage: Option<Vec<String>>, + license: Option<String>, + description: Option<String>, + maintainer: Option<String>, + use_flags: Vec<UseFlag>, + ) -> Self { Package { name: name, use_flags: use_flags, version: version, + repository: repository, + maintainer: maintainer, + description: description, + homepage: homepage, + license: license, } } } diff --git a/src/gentoo/portage.rs b/src/gentoo/portage.rs index 40b03c0..882cc5f 100644 --- a/src/gentoo/portage.rs +++ b/src/gentoo/portage.rs @@ -1,4 +1,6 @@ -use std::fs; +use std::{fs, io, path::PathBuf}; + +use quick_xml::{Reader, events::Event}; use crate::gentoo::{Package, UseFlag}; @@ -25,6 +27,45 @@ fn split_pkg(input: &str) -> (&str, Option<&str>) { (input, None) } +fn extract_maintainer(path: &PathBuf) -> io::Result<Option<String>> { + let s = fs::read_to_string(path)?; + let mut reader = Reader::from_str(s.as_str()); + reader.config_mut().trim_text(true); + + let mut buf = Vec::new(); + let mut in_maintainer = false; + + loop { + match reader.read_event_into(&mut buf) { + Ok(Event::Start(e)) if e.name().as_ref() == b"maintainer" => { + in_maintainer = true; + } + + Ok(Event::Text(e)) if in_maintainer => { + match e.xml_content() { + Ok(s) => { + return Ok(Some(s.into())); + } + Err(_) => return Ok(None), + }; + } + + Ok(Event::End(e)) if e.name().as_ref() == b"maintainer" => { + in_maintainer = false; + } + + Ok(Event::Eof) => break, + Err(_) => break, + + _ => {} + } + + buf.clear(); + } + + Ok(None) +} + impl Portage { pub fn new() -> Self { Self { @@ -32,7 +73,7 @@ impl Portage { } } - pub fn load_installed_packages(&mut self) -> Result<(), std::io::Error> { + pub fn load_installed_packages(&mut self) -> io::Result<()> { let categories = fs::read_dir("/var/db/pkg")?; for category in categories { @@ -72,9 +113,43 @@ impl Portage { }) .collect(); + // let category = fs::read_to_string(pkg.path().join("CATEGORY"))?; + let repository = fs::read_to_string(pkg.path().join("repository"))? + .trim() + .to_string(); + let homepage: Option<Vec<String>> = + match fs::read_to_string(pkg.path().join("HOMEPAGE")) { + Ok(homepage) => Some(homepage.split('\n').map(|s| s.to_string()).collect()), + Err(_) => None, + }; + + let license: Option<String> = match fs::read_to_string(pkg.path().join("LICENSE")) { + Ok(license) => Some(license.trim().to_string()), + Err(_) => None, + }; + + let description: Option<String> = + match fs::read_to_string(pkg.path().join("DESCRIPTION")) { + Ok(description) => Some(description.trim().to_string()), + Err(_) => None, + }; + + let repo_path = PathBuf::from("/var/db/repos/") + .join(&repository) + .join(cat_name.to_str().unwrap()) + .join(pkg_name) + .join("metadata.xml"); + + let maintainer = extract_maintainer(&repo_path)?; + self.installed_packages.push(Package::new( format!("{}/{}", cat_name.to_str().unwrap(), pkg_name), pkg_version.unwrap().into(), + repository, + homepage, + license, + description, + maintainer, use_flags, )); } |
