From 6b3cdf3e3d4417caa8f9d622561696a8d50c86aa Mon Sep 17 00:00:00 2001 From: fxqnlr Date: Fri, 1 Nov 2024 22:22:18 +0100 Subject: add basic apt compatability --- src/packages/apt.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/packages/apt.rs (limited to 'src/packages') diff --git a/src/packages/apt.rs b/src/packages/apt.rs new file mode 100644 index 0000000..2036559 --- /dev/null +++ b/src/packages/apt.rs @@ -0,0 +1,58 @@ +use std::process::{Command, Stdio}; + +use super::{Package, PackageList, PackageManager}; + +use crate::error::{Error, Result}; + +pub struct Apt; + +impl PackageManager for Apt { + fn get_installed(&self) -> Result { + let list = Command::new("apt").args(["list", "--installed"]).output().unwrap(); + + let mut pkgs: Vec = Vec::new(); + + let list_str = String::from_utf8(list.stdout).unwrap(); + let list_lines: Vec<&str> = list_str.split('\n').collect(); + // Pop first info line + let list_lines = &list_lines[1..list_lines.len()]; + for pkg in list_lines { + if pkg.is_empty() { + continue; + }; + + let split: Vec<&str> = pkg.split_whitespace().collect(); + if split.len() != 4 { + return Err(Error::UnknownOutput); + }; + + let Some(pkg_id) = split[0].split_once('/') else { + return Err(Error::UnknownOutput); + }; + + let explicit = split[3] == "[installed]"; + + pkgs.push(Package { + id: pkg_id.0.to_string(), + version: split[1].to_string(), + explicit + }) + } + + Ok(PackageList { packages: pkgs, manager: super::Manager::Apt }) + } + + fn install(&self, pkgs: Vec) -> Result<()> { + let mut args = vec!["apt".to_string(), "install".to_string(), "--yes".to_string()]; + + for pkg in pkgs { + args.push(pkg.id); + } + Command::new("sudo") + .stdout(Stdio::inherit()) + .args(args) + .spawn()? + .wait_with_output()?; + Ok(()) + } +} -- cgit v1.2.3