diff options
| author | Ellie Huxtable <ellie@elliehuxtable.com> | 2024-06-17 15:36:38 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-17 15:36:38 +0100 |
| commit | 88633b8994437180afdd66068cc2c8f02aea1db1 (patch) | |
| tree | 6df7ead44d8cb3c219dd43d0ee86256f4a6025ef /ui/backend/src/install.rs | |
| parent | chore(deps): bump lucide-react from 0.394.0 to 0.395.0 in /ui (#2148) (diff) | |
| download | atuin-88633b8994437180afdd66068cc2c8f02aea1db1.zip | |
feat(gui): automatically install and setup the cli/shell (#2139)
* feat(gui): automatically install and setup the cli/shell
* add shell config and toasts
Diffstat (limited to 'ui/backend/src/install.rs')
| -rw-r--r-- | ui/backend/src/install.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/ui/backend/src/install.rs b/ui/backend/src/install.rs new file mode 100644 index 00000000..55877c4b --- /dev/null +++ b/ui/backend/src/install.rs @@ -0,0 +1,67 @@ +// Handle installing the Atuin CLI +// We can use the standard install script for this + +use std::process::Command; + +use tokio::{ + fs::{read_to_string, OpenOptions}, + io::AsyncWriteExt, +}; + +use atuin_common::shell::Shell; + +#[tauri::command] +pub(crate) async fn install_cli() -> Result<(), String> { + let output = Command::new("sh") + .arg("-c") + .arg("curl --proto '=https' --tlsv1.2 -LsSf https://github.com/atuinsh/atuin/releases/latest/download/atuin-installer.sh | sh") + .output().map_err(|e|format!("Failed to execute Atuin installer: {e}")); + + Ok(()) +} + +#[tauri::command] +pub(crate) async fn is_cli_installed() -> Result<bool, String> { + let shell = Shell::default_shell().map_err(|e| format!("Failed to get default shell: {e}"))?; + let output = shell + .run_interactive(&["atuin --version && echo 'ATUIN FOUND'"]) + .map_err(|e| format!("Failed to run interactive command"))?; + + Ok(output.contains("ATUIN FOUND")) +} + +#[tauri::command] +pub(crate) async fn setup_cli() -> Result<(), String> { + let shell = Shell::default_shell().map_err(|e| format!("Failed to get default shell: {e}"))?; + let config_file_path = shell.config_file(); + + if config_file_path.is_none() { + return Err("Failed to fetch default config file".to_string()); + } + + let config_file_path = config_file_path.unwrap(); + let config_file = read_to_string(config_file_path.clone()) + .await + .map_err(|e| format!("Failed to read config file: {e}"))?; + + if config_file.contains("atuin init") { + return Ok(()); + } + + let mut file = OpenOptions::new() + .write(true) + .append(true) + .open(config_file_path) + .await + .unwrap(); + + let config = format!( + "if [ -x \"$(command -v atuin)\" ]; then eval \"$(atuin init {})\"; fi", + shell.to_string() + ); + file.write_all(config.as_bytes()) + .await + .map_err(|e| format!("Failed to write Atuin shell init: {e}")); + + Ok(()) +} |
