diff --git a/crates/vestal/src/main.rs b/crates/vestal/src/main.rs index c9083d1..23e83cf 100644 --- a/crates/vestal/src/main.rs +++ b/crates/vestal/src/main.rs @@ -63,13 +63,16 @@ impl Rebuilder { } fn load (&mut self, path: &impl AsRef, recurse: bool) -> Usually<()> { let path: Arc = Arc::from(PathBuf::from(path.as_ref())); + if self.visited.contains(&path) { + return Ok(()) + } self.visited.insert(path.clone()); - let dll = Arc::new(Dll::new(&Arc::new(PathBuf::from(path.as_ref())), true)?); + let dll = Arc::new(Dll::new(&Arc::new(PathBuf::from(path.as_ref())), false)?); self.dlls.insert(dll.name.clone(), dll.clone()); if recurse { for dep in dll.deps_by_library.keys() { - if let Some(dep) = self.find(dep, true)? { - println!("{dep:?}"); + if let Some(dep) = self.find(dep, false)? { + self.load(&dep, recurse)?; } else { panic!("not found: {dep:?}"); } @@ -82,9 +85,12 @@ impl Rebuilder { let mut path = base.as_ref().clone(); path.push(name.to_lowercase()); if verbose { - println!("looking for {name} at {path:?}"); + println!("# looking for {name} at {path:?}"); } if std::fs::exists(&path)? { + if verbose { + println!("# found {name} at {path:?}"); + } return Ok(Some(canonicalize(&path)?)) } } @@ -124,7 +130,7 @@ impl Dll { Some(&deps_by_address), &mut calls_by_source, &mut calls_by_target, - true + false )?; Ok(Self { name: name.clone(), @@ -357,7 +363,6 @@ fn main () -> Usually<()> { println!("(search {path:?})") } if let Some(path) = rebuilder.find(path.to_str().expect("path must be unicode"), false)? { - let mut rebuilder = Rebuilder::default(); rebuilder.load(&path, true)?; } else { panic!("Could not find: {path:?}")