From 6e5bcf444ddc8b62bbb973b5e2f3cada738a322f Mon Sep 17 00:00:00 2001 From: BanceDev Date: Sat, 28 Feb 2026 00:25:26 -0500 Subject: add package collect helpers to reduce duplicity --- src/util.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/util.rs') diff --git a/src/util.rs b/src/util.rs index 0958764..8508377 100644 --- a/src/util.rs +++ b/src/util.rs @@ -4,8 +4,57 @@ use std::fs; use std::io; use std::io::Write; use std::path::Path; +use std::path::PathBuf; use std::process::Command; +pub const BASE_REPO_PATH: &str = "/var/db/forge"; +pub const BASE_CONFIG_PATH: &str = "/etc/forge/packages"; +pub type PackageList = Vec<(String, PathBuf, PathBuf)>; + +pub fn collect_packages() -> Result { + let pkgs: PackageList = fs::read_dir(BASE_CONFIG_PATH) + .map_err(|e| format!("failed to iterate package directory: {}", e))? + .map(|p| { + let entry = p.map_err(|e| e.to_string())?; + let path = entry.path(); + + let pkgname = path + .file_stem() + .ok_or_else(|| format!("invalid filename: {:?}", path))? + .to_string_lossy() + .into_owned(); + + let path = PathBuf::from(BASE_REPO_PATH).join(&pkgname); + let cfg_path = PathBuf::from(BASE_CONFIG_PATH).join(format!("{}.toml", &pkgname)); + + if !path.exists() || !cfg_path.exists() { + Err(format!("no installed package: {}", pkgname)) + } else { + Ok((pkgname, path, cfg_path)) + } + }) + .collect::>()?; + + Ok(pkgs) +} + +pub fn collect_named_packages(packages: Vec) -> Result { + let pkgs: PackageList = packages + .into_iter() + .map(|p| { + let path = PathBuf::from(BASE_REPO_PATH).join(&p); + let cfg_path = PathBuf::from(BASE_CONFIG_PATH).join(format!("{}.toml", p)); + if !path.exists() || !cfg_path.exists() { + Err(format!("no installed package: {}", p)) + } else { + Ok((p, path, cfg_path)) + } + }) + .collect::>()?; + + Ok(pkgs) +} + pub fn dir_size(path: &Path) -> std::io::Result { let mut size = 0; if path.is_dir() { @@ -41,6 +90,18 @@ pub fn open_in_editor(editor: &str, file: &str) -> Result<(), String> { Ok(()) } +pub fn print_collected_packages(packages: &PackageList, message: &str) { + println!( + "{message} ({}): {}\n", + packages.len(), + packages + .iter() + .map(|(p, _, _)| p.as_str()) + .collect::>() + .join(", ") + ); +} + pub fn pull_repo(path: &Path) -> Result<(), git2::Error> { let repo = Repository::open(path)?; -- cgit v1.2.3-59-g8ed1b