diff --git a/src/env/mod.rs b/src/env/mod.rs index a45a46c..ba2fb07 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -130,7 +130,7 @@ pub fn run(config: Config, subcommand: Subcommand) -> Result<(), ExitCode> { Subcommand::Run(args) => run::run(micromamba, args), Subcommand::Activate(args) => activate::run(micromamba, args), Subcommand::Deactivate => deactivate::run(), - Subcommand::Pack(args) => pack::run(micromamba, args), - Subcommand::Unpack(args) => unpack::run(micromamba, args), + Subcommand::Pack(args) => pack::run(micromamba, args, &config), + Subcommand::Unpack(args) => unpack::run(micromamba, args, &config), } } diff --git a/src/env/pack.rs b/src/env/pack.rs index ffa8c57..9b92742 100644 --- a/src/env/pack.rs +++ b/src/env/pack.rs @@ -1,3 +1,4 @@ +use crate::csmrc::Config; use crate::env::{CommonArgs, env_name}; use crate::micromamba::Micromamba; @@ -19,7 +20,7 @@ pub struct Args { pub force: bool, } -pub fn run(micromamba: Micromamba, args: Args) -> Result<(), ExitCode> { +pub fn run(micromamba: Micromamba, args: Args, config: &Config) -> Result<(), ExitCode> { let env_name = env_name(args.common.name, &args.common.env_file)?; let Some(bin_path) = micromamba.bin_path_for_env(&env_name) else { error!( @@ -34,7 +35,7 @@ pub fn run(micromamba: Micromamba, args: Args) -> Result<(), ExitCode> { "conda-pack" }; let conda_pack = bin_path.join(binary_name); - if !conda_pack.exists() { + if !config.noop_mode && !conda_pack.exists() { debug!("Path does not exist: {:?}", conda_pack); error!( "conda-pack was not found in the environment. It must be installed to use this command." diff --git a/src/env/unpack.rs b/src/env/unpack.rs index 9d38c4a..e283230 100644 --- a/src/env/unpack.rs +++ b/src/env/unpack.rs @@ -1,3 +1,4 @@ +use crate::csmrc::Config; use crate::env::dump_micromamba_captured_output_on_error; use crate::micromamba::Micromamba; @@ -28,7 +29,7 @@ fn archive_name_to_env_name(archive_path: &Path) -> Option { .map(String::from) } -pub fn run(micromamba: Micromamba, args: Args) -> Result<(), ExitCode> { +pub fn run(micromamba: Micromamba, args: Args, config: &Config) -> Result<(), ExitCode> { let env_name = match args.name { Some(name) => name, None => match archive_name_to_env_name(&args.archive_path) { @@ -69,19 +70,22 @@ pub fn run(micromamba: Micromamba, args: Args) -> Result<(), ExitCode> { })?; let decompressor = flate2::read::GzDecoder::new(archive_file); let mut archive = tar::Archive::new(decompressor); - archive.unpack(&target_env_path).map_err(|e| { - error!( - "Could not unpack archive to '{}': {}", - target_env_path.display(), - e + if config.noop_mode { + info!("Prepared to unpack the environment. Not actually extracting, due to no-op mode."); + } else { + archive.unpack(&target_env_path).map_err(|e| { + error!( + "Could not unpack archive to '{}': {}", + target_env_path.display(), + e + ); + ExitCode::FAILURE + })?; + info!( + "Successfully unpacked environment to '{}'", + target_env_path.display() ); - ExitCode::FAILURE - })?; - info!( - "Successfully unpacked environment to '{}'", - target_env_path.display() - ); - + } info!("Running 'conda-unpack' in the new environment to fix paths..."); let result = micromamba.stream_if_verbose(vec!["run", "--name", &env_name, "conda-unpack"]); let rc = result.exit_code(); diff --git a/src/micromamba/mod.rs b/src/micromamba/mod.rs index e141510..6b13098 100644 --- a/src/micromamba/mod.rs +++ b/src/micromamba/mod.rs @@ -212,6 +212,9 @@ impl<'a> Micromamba<'a> { /// Query micromamba to try to determine the path for an environment pub fn path_for_env(&self, name: &str) -> Option { + if self.config.noop_mode { + return Some(PathBuf::from("/no-op/mode/path/for/env")); + } let result = self.capture(vec!["info", "--name", name, "--json"]); let MicromambaResult::CapturedOutput(output) = result else { return None; @@ -231,6 +234,10 @@ impl<'a> Micromamba<'a> { /// /// If `force` is true, delete any pre-existing environment/directory at this path. pub fn create_env_dir(&self, name: &str, force: bool) -> Result { + if self.config.noop_mode { + info!("Using fake directory path due to no-op mode"); + return Ok(PathBuf::from("/no-op/mode/path/for/env")); + } let env_path = match self.path_for_env(name) { Some(path) => path, None => {