Refactor restore function

This commit is contained in:
Sam Hedin 2020-06-14 10:57:16 +02:00
parent 0beb32de52
commit 3fbbe6e322
2 changed files with 34 additions and 39 deletions

View File

@ -51,31 +51,25 @@ impl DirectorySpecificEnvironment {
let current_dir = std::env::current_dir()?; let current_dir = std::env::current_dir()?;
let mut working_dir = Some(current_dir.as_path()); let mut working_dir = Some(current_dir.as_path());
let mut new_overwritten_env_values: IndexMap<PathBuf, IndexMap<String, OsString>> =
let mut file = OpenOptions::new() IndexMap::new();
.write(true)
.append(true)
.create(true)
.open("restore.txt").unwrap();
write!(&mut file, "about to restore: {:?}\n", self.overwritten_env_values).unwrap();
let mut keyvals_to_restore = IndexMap::new(); let mut keyvals_to_restore = IndexMap::new();
let mut new_overwritten_env_values = IndexMap::new();
//If we are not in wdir or its subdir, remove its vals while let Some(wdir) = working_dir {
self.overwritten_env_values if let Some(val) = self.overwritten_env_values.get(wdir) {
.iter() new_overwritten_env_values.insert(wdir.to_path_buf(), val.clone());
.for_each(|(directory, keyvals)| { }
while let Some(wdir) = working_dir { working_dir = working_dir.unwrap().parent();
if &wdir == directory { }
keyvals.iter().for_each(|(k, v)| {
keyvals_to_restore.insert(k.clone(), v.to_str().unwrap().to_string()); for (dir, keyvals) in &self.overwritten_env_values {
}); if !new_overwritten_env_values.contains_key(dir) {
} keyvals.iter().for_each(|(k, v)| {
working_dir = working_dir.expect("This directory has no parent").parent(); keyvals_to_restore.insert(k.clone(), v.to_str().unwrap().to_string());
} });
new_overwritten_env_values.insert(directory.clone(), keyvals.clone()); self.added_env_vars.remove(dir);
}); }
}
self.overwritten_env_values = new_overwritten_env_values; self.overwritten_env_values = new_overwritten_env_values;
Ok(keyvals_to_restore) Ok(keyvals_to_restore)
@ -121,14 +115,6 @@ impl DirectorySpecificEnvironment {
}); });
} }
let mut file = OpenOptions::new()
.write(true)
.append(true)
.create(true)
.open("restore.txt").unwrap();
write!(&mut file, "overwritten: {:?}\n\n", self.overwritten_env_values).unwrap();
working_dir = working_dir //Keep going up in the directory structure with .parent() working_dir = working_dir //Keep going up in the directory structure with .parent()
.expect("This directory has no parent") .expect("This directory has no parent")
.parent(); .parent();

View File

@ -2,8 +2,9 @@ use crate::data::config::Conf;
use crate::env::directory_specific_environment::*; use crate::env::directory_specific_environment::*;
use indexmap::{indexmap, IndexSet}; use indexmap::{indexmap, IndexSet};
use nu_protocol::{UntaggedValue, Value}; use nu_protocol::{UntaggedValue, Value};
use std::io::Write;
use std::ffi::OsString; use std::ffi::OsString;
use std::fmt::Debug; use std::{fs::OpenOptions, fmt::Debug};
pub trait Env: Debug + Send { pub trait Env: Debug + Send {
fn env(&self) -> Option<Value>; fn env(&self) -> Option<Value>;
@ -63,12 +64,20 @@ impl Environment {
self.remove_env(&k); self.remove_env(&k);
}); });
// self.direnv // let mut file = OpenOptions::new()
// .overwritten_values_to_restore()? // .write(true)
// .iter() // .append(true)
// .for_each(|(k, v)| { // .create(true)
// self.add_env(&k, &v, true); // .open("restore.txt")
// }); // .unwrap();
self.direnv
.overwritten_values_to_restore()?
.iter()
.for_each(|(k, v)| {
// write!(&mut file, "restoring: {:?}\n", (k, v)).unwrap();
self.add_env(&k, &v, true);
});
self.direnv.env_vars_to_add()?.iter().for_each(|(k, v)| { self.direnv.env_vars_to_add()?.iter().for_each(|(k, v)| {
self.add_env(&k, &v, true); self.add_env(&k, &v, true);