aboutsummaryrefslogtreecommitdiffstats
path: root/ui/backend/src/install.rs
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2024-06-17 15:36:38 +0100
committerGitHub <noreply@github.com>2024-06-17 15:36:38 +0100
commit88633b8994437180afdd66068cc2c8f02aea1db1 (patch)
tree6df7ead44d8cb3c219dd43d0ee86256f4a6025ef /ui/backend/src/install.rs
parentchore(deps): bump lucide-react from 0.394.0 to 0.395.0 in /ui (#2148) (diff)
downloadatuin-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.rs67
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(())
+}