|  | 
|  | 1 | +use std::borrow::Cow; | 
|  | 2 | +use std::ffi::OsStr; | 
|  | 3 | + | 
|  | 4 | +/// Change the `cmd` environment to be very isolated, particularly when Git is involved. | 
|  | 5 | +pub fn isolate_env_std_cmd(cmd: &mut std::process::Command) -> &mut std::process::Command { | 
|  | 6 | +    for op in updates() { | 
|  | 7 | +        match op { | 
|  | 8 | +            EnvOp::Remove(var) => { | 
|  | 9 | +                cmd.env_remove(var); | 
|  | 10 | +            } | 
|  | 11 | +            EnvOp::Add { name, value } => { | 
|  | 12 | +                cmd.env(name, value); | 
|  | 13 | +            } | 
|  | 14 | +        } | 
|  | 15 | +    } | 
|  | 16 | +    cmd | 
|  | 17 | +} | 
|  | 18 | + | 
|  | 19 | +/// Change the `cmd` environment to be very isolated, particularly when Git is involved. | 
|  | 20 | +#[cfg(feature = "snapbox")] | 
|  | 21 | +pub fn isolate_snapbox_cmd(mut cmd: snapbox::cmd::Command) -> snapbox::cmd::Command { | 
|  | 22 | +    for op in updates() { | 
|  | 23 | +        cmd = match op { | 
|  | 24 | +            EnvOp::Remove(var) => cmd.env_remove(var), | 
|  | 25 | +            EnvOp::Add { name, value } => cmd.env(name, value), | 
|  | 26 | +        }; | 
|  | 27 | +    } | 
|  | 28 | +    cmd | 
|  | 29 | +} | 
|  | 30 | + | 
|  | 31 | +enum EnvOp { | 
|  | 32 | +    Remove(&'static str), | 
|  | 33 | +    Add { | 
|  | 34 | +        name: &'static str, | 
|  | 35 | +        value: Cow<'static, OsStr>, | 
|  | 36 | +    }, | 
|  | 37 | +} | 
|  | 38 | + | 
|  | 39 | +fn updates() -> Vec<EnvOp> { | 
|  | 40 | +    // Copied from gix-testtools/lib.rs, in an attempt to isolate everything as good as possible, | 
|  | 41 | +    #[cfg(windows)] | 
|  | 42 | +    const NULL_DEVICE: &str = "NUL"; | 
|  | 43 | +    #[cfg(not(windows))] | 
|  | 44 | +    const NULL_DEVICE: &str = "/dev/null"; | 
|  | 45 | + | 
|  | 46 | +    // particularly mutation. | 
|  | 47 | +    let mut msys_for_git_bash_on_windows = std::env::var_os("MSYS").unwrap_or_default(); | 
|  | 48 | +    msys_for_git_bash_on_windows.push(" winsymlinks:nativestrict"); | 
|  | 49 | +    [ | 
|  | 50 | +        EnvOp::Remove("GIT_DIR"), | 
|  | 51 | +        EnvOp::Remove("GIT_INDEX_FILE"), | 
|  | 52 | +        EnvOp::Remove("GIT_OBJECT_DIRECTORY"), | 
|  | 53 | +        EnvOp::Remove("GIT_ALTERNATE_OBJECT_DIRECTORIES"), | 
|  | 54 | +        EnvOp::Remove("GIT_WORK_TREE"), | 
|  | 55 | +        EnvOp::Remove("GIT_COMMON_DIR"), | 
|  | 56 | +        EnvOp::Remove("GIT_ASKPASS"), | 
|  | 57 | +        EnvOp::Remove("SSH_ASKPASS"), | 
|  | 58 | +    ] | 
|  | 59 | +    .into_iter() | 
|  | 60 | +    .chain( | 
|  | 61 | +        [ | 
|  | 62 | +            ("GIT_CONFIG_NOSYSTEM", "1"), | 
|  | 63 | +            ("GIT_CONFIG_GLOBAL", NULL_DEVICE), | 
|  | 64 | +            ("GIT_TERMINAL_PROMPT", "false"), | 
|  | 65 | +            ("GIT_AUTHOR_DATE", "2000-01-01 00:00:00 +0000"), | 
|  | 66 | +            ("GIT_AUTHOR_EMAIL", "[email protected]"), | 
|  | 67 | +            ("GIT_AUTHOR_NAME", "author"), | 
|  | 68 | +            ("GIT_COMMITTER_DATE", "2000-01-02 00:00:00 +0000"), | 
|  | 69 | +            ("GIT_COMMITTER_EMAIL", "[email protected]"), | 
|  | 70 | +            ("GIT_COMMITTER_NAME", "committer"), | 
|  | 71 | +            ("GIT_CONFIG_COUNT", "4"), | 
|  | 72 | +            ("GIT_CONFIG_KEY_0", "commit.gpgsign"), | 
|  | 73 | +            ("GIT_CONFIG_VALUE_0", "false"), | 
|  | 74 | +            ("GIT_CONFIG_KEY_1", "tag.gpgsign"), | 
|  | 75 | +            ("GIT_CONFIG_VALUE_1", "false"), | 
|  | 76 | +            ("GIT_CONFIG_KEY_2", "init.defaultBranch"), | 
|  | 77 | +            ("GIT_CONFIG_VALUE_2", "main"), | 
|  | 78 | +            ("GIT_CONFIG_KEY_3", "protocol.file.allow"), | 
|  | 79 | +            ("GIT_CONFIG_VALUE_3", "always"), | 
|  | 80 | +            ("CLICOLOR_FORCE", "1"), | 
|  | 81 | +            ("RUST_BACKTRACE", "0"), | 
|  | 82 | +        ] | 
|  | 83 | +        .into_iter() | 
|  | 84 | +        .map(|(name, value)| EnvOp::Add { | 
|  | 85 | +            name, | 
|  | 86 | +            value: Cow::Borrowed(OsStr::new(value)), | 
|  | 87 | +        }), | 
|  | 88 | +    ) | 
|  | 89 | +    .chain(Some(EnvOp::Add { | 
|  | 90 | +        name: "MSYS", | 
|  | 91 | +        value: Cow::Owned(msys_for_git_bash_on_windows), | 
|  | 92 | +    })) | 
|  | 93 | +    .collect() | 
|  | 94 | +} | 
0 commit comments