Ensure ssh agent is only started once

This commit is contained in:
Leonard Steppy 2026-08-27 08:27:08 +02:00
parent 82fe053ba8
commit df26eb435f
3 changed files with 30 additions and 3 deletions

View File

@ -27,10 +27,14 @@ pub trait Environment {
V: AsRef<OsStr>;
fn get_home_directory(&self) -> Option<PathBuf>;
fn read_line(&mut self) -> Result<String, io::Error>;
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<OsString> {
@ -39,7 +43,7 @@ impl Environment for Prod {
fn var_os<K>(&self, key: K) -> Option<OsString>
where
K: AsRef<OsStr>
K: AsRef<OsStr>,
{
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 {

View File

@ -74,6 +74,14 @@ impl Environment for TestEnvironment {
fn read_line(&mut self) -> Result<String, Error> {
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 {

View File

@ -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(())
}