summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/packages.rs18
-rw-r--r--src/packages/portage.rs57
2 files changed, 56 insertions, 19 deletions
diff --git a/src/packages.rs b/src/packages.rs
index 2eadcfc..de818f4 100644
--- a/src/packages.rs
+++ b/src/packages.rs
@@ -6,9 +6,7 @@ use serde::{Deserialize, Serialize};
6 6
7use crate::error::{Error, Result}; 7use crate::error::{Error, Result};
8 8
9#[cfg(feature = "pacman")]
10mod pacman; 9mod pacman;
11#[cfg(feature = "portage")]
12mod portage; 10mod portage;
13 11
14#[derive(Debug, Serialize, Deserialize)] 12#[derive(Debug, Serialize, Deserialize)]
@@ -19,7 +17,9 @@ pub struct PackageList {
19 17
20impl PackageList { 18impl PackageList {
21 pub fn install(&self) -> Result<()> { 19 pub fn install(&self) -> Result<()> {
22 self.manager.to_package_manager().install(self.packages.clone()) 20 self.manager
21 .to_package_manager()
22 .install(self.packages.clone())
23 } 23 }
24} 24}
25 25
@@ -32,19 +32,14 @@ pub struct Package {
32 32
33#[derive(Debug, Clone, clap::ValueEnum, Serialize, Deserialize)] 33#[derive(Debug, Clone, clap::ValueEnum, Serialize, Deserialize)]
34pub enum Manager { 34pub enum Manager {
35 #[cfg(feature = "pacman")]
36 Pacman, 35 Pacman,
37 #[cfg(feature = "portage")]
38 Portage, 36 Portage,
39} 37}
40 38
41
42impl Manager { 39impl Manager {
43 pub fn get_manager(manager: Option<Manager>) -> Result<Box<dyn PackageManager>> { 40 pub fn get_manager(manager: Option<Manager>) -> Result<Box<dyn PackageManager>> {
44 #[cfg(not(target_os = "linux"))] 41 #[cfg(not(target_os = "linux"))]
45 { 42 return Err(Error::Unsupported);
46 return Err(Error::Unsupported);
47 }
48 43
49 #[cfg(target_os = "linux")] 44 #[cfg(target_os = "linux")]
50 { 45 {
@@ -70,9 +65,7 @@ impl Manager {
70 65
71 fn from_str(value: &str) -> Result<Box<dyn PackageManager>> { 66 fn from_str(value: &str) -> Result<Box<dyn PackageManager>> {
72 Ok(match value { 67 Ok(match value {
73 #[cfg(feature = "pacman")]
74 "arch" => Box::new(Pacman), 68 "arch" => Box::new(Pacman),
75 #[cfg(feature = "portage")]
76 "gentoo" => Box::new(Portage), 69 "gentoo" => Box::new(Portage),
77 _ => return Err(Error::Unsupported), 70 _ => return Err(Error::Unsupported),
78 }) 71 })
@@ -80,15 +73,12 @@ impl Manager {
80 73
81 fn to_package_manager(&self) -> Box<dyn PackageManager> { 74 fn to_package_manager(&self) -> Box<dyn PackageManager> {
82 match self { 75 match self {
83 #[cfg(feature = "pacman")]
84 Self::Pacman => Box::new(Pacman), 76 Self::Pacman => Box::new(Pacman),
85 #[cfg(feature = "portage")]
86 Self::Portage => Box::new(Portage), 77 Self::Portage => Box::new(Portage),
87 } 78 }
88 } 79 }
89} 80}
90 81
91
92pub trait PackageManager { 82pub trait PackageManager {
93 fn get_installed(&self) -> Result<PackageList>; 83 fn get_installed(&self) -> Result<PackageList>;
94 84
diff --git a/src/packages/portage.rs b/src/packages/portage.rs
index 7fa09a8..dac0c2f 100644
--- a/src/packages/portage.rs
+++ b/src/packages/portage.rs
@@ -1,16 +1,63 @@
1use tracing::error; 1use std::process::{Command, Stdio};
2 2
3use super::{PackageList, PackageManager}; 3use crate::error::Error;
4
5use super::{Package, PackageList, PackageManager};
4 6
5pub struct Portage; 7pub struct Portage;
6 8
7impl PackageManager for Portage { 9impl PackageManager for Portage {
8 fn get_installed(&self) -> crate::error::Result<PackageList> { 10 fn get_installed(&self) -> crate::error::Result<PackageList> {
9 todo!() 11 let eix_pkgs = Command::new("eix")
12 .args(["--world", "-c*"])
13 .output()
14 .unwrap();
15
16 let eix_pkgs_out = String::from_utf8(eix_pkgs.stdout).unwrap();
17
18 let mut pkgs: Vec<Package> = Vec::new();
19 let portage_pkgs: Vec<&str> = eix_pkgs_out.split('\n').collect();
20 for pkg in portage_pkgs {
21 if pkg.is_empty() {
22 continue;
23 };
24 let split = pkg.split_once('@');
25 let info = if let Some(sp) = split {
26 sp.0
27 } else {
28 return Err(Error::UnknownOutput);
29 };
30
31 let (id, version) = if let Some(res) = info.split_once('(') {
32 (res.0.split_at(4).1.trim().to_string(), res.1.to_string())
33 } else {
34 return Err(Error::UnknownOutput);
35 };
36
37 pkgs.push(Package {
38 id,
39 version,
40 explicit: true,
41 });
42 }
43
44 Ok(PackageList {
45 packages: pkgs,
46 manager: super::Manager::Portage,
47 })
10 } 48 }
11 49
12 fn install(&self, pkgs: Vec<super::Package>) -> crate::error::Result<()> { 50 fn install(&self, pkgs: Vec<super::Package>) -> crate::error::Result<()> {
13 error!("Install {pkgs:?}"); 51 let mut args = vec!["emerge".to_string()];
14 todo!() 52
53 for pkg in pkgs {
54 args.push(pkg.id);
55 }
56 Command::new("doas")
57 .stdout(Stdio::inherit())
58 .args(args)
59 .spawn()?
60 .wait_with_output()?;
61 Ok(())
15 } 62 }
16} 63}