aboutsummaryrefslogtreecommitdiff
path: root/src/gentoo
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-05-07 17:19:01 +0200
committerpablu <me@pablu.de>2026-05-07 17:19:01 +0200
commit4025459d8405e2dfb3d54d6c49fdf2cf8c990bc5 (patch)
tree00e754014229e150a5fb6054cf79a63c57d68a76 /src/gentoo
parent673853a8857c06a1b3e38122818e4eb0a3a77bb6 (diff)
Metadata field
Diffstat (limited to 'src/gentoo')
-rw-r--r--src/gentoo/package.rs21
-rw-r--r--src/gentoo/portage.rs79
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,
));
}