From 0d768e0941da0ce90803d15b043dc72d893293b8 Mon Sep 17 00:00:00 2001 From: SFG545 Date: Sun, 15 Mar 2026 16:59:03 -0500 Subject: [PATCH] feat: add support for preserving environment variables in sudo reexec --- src/commands.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/commands.rs b/src/commands.rs index c6e56db..88e0bd8 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -190,6 +190,9 @@ fn maybe_reexec_with_sudo(cli: &Cli) -> Result { let exe = std::env::current_exe().context("Failed to locate depot executable")?; let mut cmd = std::process::Command::new("sudo"); + if let Some(preserve_arg) = sudo_preserve_env_arg() { + cmd.arg(preserve_arg); + } cmd.arg(exe); cmd.args(std::env::args_os().skip(1)); @@ -203,6 +206,17 @@ fn maybe_reexec_with_sudo(cli: &Cli) -> Result { } } +fn sudo_preserve_env_arg() -> Option { + let mut keys = Vec::new(); + for key in [DEPOT_INSTALL_CONTEXT_ENV, "DEPOT_DEPCHAIN"] { + if std::env::var_os(key).is_some() { + keys.push(key); + } + } + + (!keys.is_empty()).then(|| format!("--preserve-env={}", keys.join(","))) +} + #[derive(Clone, Copy)] struct ChildInstallCommandOptions<'a> { no_deps: bool, @@ -7174,6 +7188,27 @@ optional = [] ); } + #[test] + fn sudo_preserve_env_arg_only_includes_present_depot_env_vars() { + let mut env = TestEnv::new(); + assert_eq!(sudo_preserve_env_arg(), None); + + env.set_var(DEPOT_INSTALL_CONTEXT_ENV, INSTALL_CONTEXT_PLANNED); + assert_eq!( + sudo_preserve_env_arg(), + Some(format!("--preserve-env={}", DEPOT_INSTALL_CONTEXT_ENV)) + ); + + env.set_var("DEPOT_DEPCHAIN", "parent"); + assert_eq!( + sudo_preserve_env_arg(), + Some(format!( + "--preserve-env={},DEPOT_DEPCHAIN", + DEPOT_INSTALL_CONTEXT_ENV + )) + ); + } + #[test] fn plan_dependency_closure_tracks_requested_dependency_roots() { let plan = planner::ExecutionPlan {