feat: nix and guix shell

This commit is contained in:
iff 2025-06-11 13:22:51 +02:00
parent 2699238bb1
commit 9d90f7ce21
4 changed files with 42 additions and 12 deletions

View file

@ -19,6 +19,8 @@ sudo = "run0"
package_manager = "pacman" package_manager = "pacman"
# preferred installation method, can be limited with the package manager # preferred installation method, can be limited with the package manager
# available options are: System, User, Temp # available options are:
# - System
# - Shell (nix and guix only)
install_method = "System" install_method = "System"
``` ```

View file

@ -1,8 +1,7 @@
use serde::Deserialize; use serde::Deserialize;
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Deserialize)] #[derive(Deserialize, Default)]
#[derive(Default)]
pub struct Config { pub struct Config {
pub sudo: Option<String>, pub sudo: Option<String>,
#[serde(default)] #[serde(default)]
@ -12,16 +11,13 @@ pub struct Config {
} }
#[allow(dead_code)] #[allow(dead_code)]
#[derive(Deserialize)] #[derive(Deserialize, Default)]
#[derive(Default)]
pub struct PackageManagerConfig { pub struct PackageManagerConfig {
pub package_manager: Option<String>, pub package_manager: Option<String>,
#[serde(default)] #[serde(default)]
pub install_method: InstallMethod, pub install_method: InstallMethod,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Timeout(pub u64); pub struct Timeout(pub u64);
impl Default for Timeout { impl Default for Timeout {
@ -30,13 +26,14 @@ impl Default for Timeout {
} }
} }
#[derive(Deserialize)] #[derive(Deserialize, Default, PartialEq)]
#[derive(Default)]
pub enum InstallMethod { pub enum InstallMethod {
#[default] #[default]
System, System,
User, // !TODO: Implement other install methods
Temp, // User,
// Temp,
Shell,
} }
pub fn load_config() -> Config { pub fn load_config() -> Config {

View file

@ -9,9 +9,9 @@ use pay_respects_utils::files::best_match_file;
use crate::data::Data; use crate::data::Data;
use crate::shell::shell_evaluated_commands; use crate::shell::shell_evaluated_commands;
use crate::style::highlight_difference; use crate::style::highlight_difference;
use crate::suggestions;
use crate::suggestions::suggest_candidates; use crate::suggestions::suggest_candidates;
use crate::system; use crate::system;
use crate::{config, suggestions};
pub fn suggestion(data: &mut Data) { pub fn suggestion(data: &mut Data) {
let mut last_command; let mut last_command;
@ -191,6 +191,17 @@ pub fn cnf(data: &mut Data) {
.prompt() .prompt()
.unwrap_or_else(|_| std::process::exit(1)); .unwrap_or_else(|_| std::process::exit(1));
let install_method = &data.config.package_manager.install_method;
if install_method == &config::InstallMethod::Shell {
// let the shell handle the installation and place the user in a shell
// environment with the package installed
println!(
"{}",
system::shell_package(data, &package_manager, &package)
);
return;
}
// retry after installing package // retry after installing package
if system::install_package(data, &package_manager, &package) { if system::install_package(data, &package_manager, &package) {
let status = suggestions::run_suggestion(data, &data.command); let status = suggestions::run_suggestion(data, &data.command);

View file

@ -14,6 +14,13 @@ pub fn get_package_manager(data: &mut Data) -> Option<String> {
return Some(package_manager); return Some(package_manager);
} }
if let Some(package_manager) = data.config.package_manager.package_manager.as_ref() {
if package_manager.is_empty() {
return None;
}
return Some(package_manager.to_string());
}
if let Some(package_manager) = option_env!("_DEF_PR_PACKAGE_MANAGER") { if let Some(package_manager) = option_env!("_DEF_PR_PACKAGE_MANAGER") {
if package_manager.is_empty() { if package_manager.is_empty() {
return None; return None;
@ -245,3 +252,16 @@ pub fn install_package(data: &mut Data, package_manager: &str, package: &str) ->
result.success() result.success()
} }
pub fn shell_package(data: &Data, package_manager: &str, package: &str) -> String {
let command = data.command.clone();
match package_manager {
"guix" => format!("guix shell {} -- {}", package, command),
"nix" => format!(
r#"nix shell nixpkgs#{} --command "{};return""#,
package, command
),
_ => unreachable!("Only `nix` and `guix` are supported for shell installation"),
}
}