From df26eb435f105f8d6abb8c6a6fdc7c5c523ea690 Mon Sep 17 00:00:00 2001 From: Leonard Steppy Date: Thu, 27 Aug 2026 08:27:08 +0200 Subject: [PATCH] Ensure ssh agent is only started once --- src/environment.rs | 18 +++++++++++++++--- src/integration_test.rs | 8 ++++++++ src/main.rs | 7 +++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/environment.rs b/src/environment.rs index 6328bfd..1a95971 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -27,10 +27,14 @@ pub trait Environment { V: AsRef; fn get_home_directory(&self) -> Option; fn read_line(&mut self) -> Result; + fn is_ssh_agent_started(&self) -> bool; + fn set_ssh_agent_started(&mut self, enabled: bool); } #[derive(Debug, Default)] -pub struct Prod; +pub struct Prod { + ssh_agent_started: bool, +} impl Environment for Prod { fn args_os(&self) -> Vec { @@ -38,8 +42,8 @@ impl Environment for Prod { } fn var_os(&self, key: K) -> Option - where - K: AsRef + where + K: AsRef, { env::var_os(key) } @@ -68,6 +72,14 @@ impl Environment for Prod { io::stdin().read_line(&mut buffer)?; Ok(buffer.trim().to_string()) } + + fn is_ssh_agent_started(&self) -> bool { + self.ssh_agent_started + } + + fn set_ssh_agent_started(&mut self, enabled: bool) { + self.ssh_agent_started = enabled; + } } impl ShellInterface for Prod { diff --git a/src/integration_test.rs b/src/integration_test.rs index 46358bf..d66866e 100644 --- a/src/integration_test.rs +++ b/src/integration_test.rs @@ -74,6 +74,14 @@ impl Environment for TestEnvironment { fn read_line(&mut self) -> Result { self.stdin.pop_front().ok_or_else(|| Error::other("Unexpected call to read_line: No input prepared")) } + + fn is_ssh_agent_started(&self) -> bool { + self.ssh_agent_started + } + + fn set_ssh_agent_started(&mut self, enabled: bool) { + self.ssh_agent_started = enabled; + } } impl ShellInterface for TestEnvironment { diff --git a/src/main.rs b/src/main.rs index 834541b..c42d9df 100644 --- a/src/main.rs +++ b/src/main.rs @@ -706,6 +706,10 @@ where fn start_ssh_agent(&mut self, logger: &Logger) -> Result<(), String> { let env = &mut self.environment; + if env.is_ssh_agent_started() { + return Ok(()); + } + //start the ssh agent let agent_output = ShellCommand::SshAgent .in_env(env) @@ -732,6 +736,9 @@ where .and_expect_success() .into_result_with_error_logging(logger) .map_err(|e| format!("failed to add ssh-key: {e}"))?; + + env.set_ssh_agent_started(true); + Ok(()) }