mirror of
https://github.com/TECHNOFAB11/pay-respects.git
synced 2025-12-11 22:10:09 +01:00
feat: nix and guix shell
This commit is contained in:
parent
2699238bb1
commit
9d90f7ce21
4 changed files with 42 additions and 12 deletions
|
|
@ -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"
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue