From a420869e4cdd50c1f6ec03388162d13c115c1cb4 Mon Sep 17 00:00:00 2001 From: fbrv Date: Tue, 6 Aug 2024 09:06:47 +0100 Subject: [PATCH 1/3] support docker compose --- crates/cli/src/docker_cmd.rs | 89 ++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/crates/cli/src/docker_cmd.rs b/crates/cli/src/docker_cmd.rs index 6c686422..372fb6e8 100644 --- a/crates/cli/src/docker_cmd.rs +++ b/crates/cli/src/docker_cmd.rs @@ -1,7 +1,57 @@ -use std::process::{Command, Stdio}; - +use std::{mem, process::Command, str}; +use std::process::Stdio; use eyre::Result; +macro_rules! run_docker_compose { + ($compose_path:expr, $($arg:expr),*) => {{ + let cmd = determine_docker_compose_command(); + match cmd { + Some(mut command) => { + match command.arg("-f").arg($compose_path).args(&[$($arg),*]).output() { + Ok(output) => { + if !output.status.success() { + let stderr = str::from_utf8(&output.stderr).unwrap_or(""); + if stderr.contains("permission denied") { + println!("Warning: Permission denied. Try running with sudo."); + } else { + println!("Command failed with error: {}", stderr); + } + } + } + Err(e) => { + println!("Failed to execute command: {}", e); + } + } + } + None => { + println!("Neither `docker compose` nor `docker-compose` were found on your operating system."); + } + } + }}; +} + +fn determine_docker_compose_command() -> Option { + if is_command_available("docker compose") { + println!("found docker compose"); + let mut docker: Command = Command::new("docker"); + Some(mem::replace(docker.arg("compose").stdout(Stdio::inherit()).stderr(Stdio::inherit()), Command::new("docker"))) + } else if is_command_available("docker-compose") { + println!("docker compose not found, using docker-compose"); + let mut docker: Command = Command::new("docker-compose"); + Some(mem::replace(docker.stdout(Stdio::inherit()).stderr(Stdio::inherit()), Command::new("docker"))) + } else { + None + } +} + +fn is_command_available(command: &str) -> bool { + Command::new("sh") + .arg("-c") + .arg(format!("command -v {}", command)) + .output() + .map_or(false, |output| output.status.success()) +} + pub fn handle_docker_start(compose_path: String, env_path: String) -> Result<()> { println!("Starting Commit-Boost with compose file: {}", compose_path); @@ -10,18 +60,8 @@ pub fn handle_docker_start(compose_path: String, env_path: String) -> Result<()> println!("Loaded env file: {:?}", env_file); - // TODO: if permission denied, print warning to run as sudo - // start docker compose - Command::new("docker") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .arg("compose") - .arg("-f") - .arg(compose_path) - .arg("up") - .arg("-d") - .output()?; + run_docker_compose!(compose_path, "up", "-d"); Ok(()) } @@ -32,17 +72,8 @@ pub fn handle_docker_stop(compose_path: String, env_path: String) -> Result<()> // load env file dotenvy::from_filename_override(env_path)?; - // TODO: if permission denied, print warning to run as sudo - // start docker compose - Command::new("docker") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .arg("compose") - .arg("-f") - .arg(compose_path) - .arg("down") - .output()?; + run_docker_compose!(compose_path, "down"); Ok(()) } @@ -51,18 +82,8 @@ pub fn handle_docker_stop(compose_path: String, env_path: String) -> Result<()> pub fn handle_docker_logs(compose_path: String) -> Result<()> { println!("Querying Commit-Boost with compose file: {}", compose_path); - // TODO: if permission denied, print warning to run as sudo - // start docker compose - Command::new("docker") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .arg("compose") - .arg("-f") - .arg(compose_path) - .arg("logs") - .arg("-f") - .output()?; + run_docker_compose!(compose_path, "logs", "-f"); Ok(()) } From bcff72be846073fd908c71b1f63a5da62e518db8 Mon Sep 17 00:00:00 2001 From: fbrv Date: Tue, 6 Aug 2024 09:07:29 +0100 Subject: [PATCH 2/3] lint --- crates/cli/src/docker_cmd.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/crates/cli/src/docker_cmd.rs b/crates/cli/src/docker_cmd.rs index 372fb6e8..2fb855fe 100644 --- a/crates/cli/src/docker_cmd.rs +++ b/crates/cli/src/docker_cmd.rs @@ -1,5 +1,9 @@ -use std::{mem, process::Command, str}; -use std::process::Stdio; +use std::{ + mem, + process::{Command, Stdio}, + str, +}; + use eyre::Result; macro_rules! run_docker_compose { @@ -34,11 +38,17 @@ fn determine_docker_compose_command() -> Option { if is_command_available("docker compose") { println!("found docker compose"); let mut docker: Command = Command::new("docker"); - Some(mem::replace(docker.arg("compose").stdout(Stdio::inherit()).stderr(Stdio::inherit()), Command::new("docker"))) + Some(mem::replace( + docker.arg("compose").stdout(Stdio::inherit()).stderr(Stdio::inherit()), + Command::new("docker"), + )) } else if is_command_available("docker-compose") { println!("docker compose not found, using docker-compose"); let mut docker: Command = Command::new("docker-compose"); - Some(mem::replace(docker.stdout(Stdio::inherit()).stderr(Stdio::inherit()), Command::new("docker"))) + Some(mem::replace( + docker.stdout(Stdio::inherit()).stderr(Stdio::inherit()), + Command::new("docker"), + )) } else { None } From 6320980588460784f28af2ef9111702354bd5e79 Mon Sep 17 00:00:00 2001 From: fbrv Date: Tue, 6 Aug 2024 09:33:06 +0100 Subject: [PATCH 3/3] update println --- crates/cli/src/docker_cmd.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/cli/src/docker_cmd.rs b/crates/cli/src/docker_cmd.rs index 2fb855fe..cd50f016 100644 --- a/crates/cli/src/docker_cmd.rs +++ b/crates/cli/src/docker_cmd.rs @@ -36,14 +36,13 @@ macro_rules! run_docker_compose { fn determine_docker_compose_command() -> Option { if is_command_available("docker compose") { - println!("found docker compose"); let mut docker: Command = Command::new("docker"); Some(mem::replace( docker.arg("compose").stdout(Stdio::inherit()).stderr(Stdio::inherit()), Command::new("docker"), )) } else if is_command_available("docker-compose") { - println!("docker compose not found, using docker-compose"); + println!("using docker-compose. the command is being deprecated, install docker compose plugin"); let mut docker: Command = Command::new("docker-compose"); Some(mem::replace( docker.stdout(Stdio::inherit()).stderr(Stdio::inherit()),