Rust library to generate static websites

fix: don't recompute dirs

+39 -21
+39 -21
crates/maudit-cli/src/dev/build.rs
··· 23 23 current_status: Arc<tokio::sync::RwLock<Option<server::PersistentStatus>>>, 24 24 dep_tracker: Arc<tokio::sync::RwLock<Option<DependencyTracker>>>, 25 25 binary_path: Arc<tokio::sync::RwLock<Option<PathBuf>>>, 26 + // Cached values computed once at startup 27 + target_dir: Arc<Option<PathBuf>>, 28 + binary_name: Arc<Option<String>>, 26 29 } 27 30 28 31 impl BuildManager { 29 32 pub fn new(websocket_tx: broadcast::Sender<WebSocketMessage>) -> Self { 33 + // Try to determine target directory and binary name at startup 34 + let target_dir = find_target_dir().ok(); 35 + let binary_name = Self::get_binary_name_from_cargo_toml().ok(); 36 + 37 + if let Some(ref name) = binary_name { 38 + debug!(name: "build", "Detected binary name at startup: {}", name); 39 + } 40 + if let Some(ref dir) = target_dir { 41 + debug!(name: "build", "Using target directory: {:?}", dir); 42 + } 43 + 30 44 Self { 31 45 current_cancel: Arc::new(tokio::sync::RwLock::new(None)), 32 46 build_semaphore: Arc::new(tokio::sync::Semaphore::new(1)), // Only one build at a time ··· 34 48 current_status: Arc::new(tokio::sync::RwLock::new(None)), 35 49 dep_tracker: Arc::new(tokio::sync::RwLock::new(None)), 36 50 binary_path: Arc::new(tokio::sync::RwLock::new(None)), 51 + target_dir: Arc::new(target_dir), 52 + binary_name: Arc::new(binary_name), 37 53 } 38 54 } 39 55 ··· 185 201 let current_status = self.current_status.clone(); 186 202 let dep_tracker_clone = self.dep_tracker.clone(); 187 203 let binary_path_clone = self.binary_path.clone(); 204 + let target_dir_clone = self.target_dir.clone(); 205 + let binary_name_clone = self.binary_name.clone(); 188 206 let build_start_time = Instant::now(); 189 207 190 208 // Create a channel to get the build result back ··· 279 297 update_status(&websocket_tx, current_status.clone(), StatusType::Success, "Build finished successfully").await; 280 298 281 299 // Update dependency tracker after successful build 282 - Self::update_dependency_tracker_after_build(dep_tracker_clone.clone(), binary_path_clone.clone()).await; 300 + Self::update_dependency_tracker_after_build( 301 + dep_tracker_clone.clone(), 302 + binary_path_clone.clone(), 303 + target_dir_clone.clone(), 304 + binary_name_clone.clone(), 305 + ).await; 283 306 284 307 true 285 308 } else { ··· 316 339 async fn update_dependency_tracker_after_build( 317 340 dep_tracker: Arc<tokio::sync::RwLock<Option<DependencyTracker>>>, 318 341 binary_path: Arc<tokio::sync::RwLock<Option<PathBuf>>>, 342 + target_dir: Arc<Option<PathBuf>>, 343 + binary_name: Arc<Option<String>>, 319 344 ) { 320 - // Try to get the binary name from Cargo.toml in the current directory 321 - let binary_name = match Self::get_binary_name_from_cargo_toml() { 322 - Ok(name) => name, 323 - Err(e) => { 324 - debug!(name: "build", "Could not determine binary name: {}", e); 325 - return; 326 - } 345 + // Use cached binary name (computed once at startup) 346 + let Some(name) = binary_name.as_ref() else { 347 + debug!(name: "build", "No binary name available, skipping dependency tracker update"); 348 + return; 327 349 }; 328 350 329 - debug!(name: "build", "Detected binary name: {}", binary_name); 330 - 331 - // Find the target directory 332 - let target_dir = match find_target_dir() { 333 - Ok(dir) => dir, 334 - Err(e) => { 335 - debug!(name: "build", "Could not find target directory: {}", e); 336 - return; 337 - } 351 + // Use cached target directory (computed once at startup) 352 + let Some(target) = target_dir.as_ref() else { 353 + debug!(name: "build", "No target directory available, skipping dependency tracker update"); 354 + return; 338 355 }; 339 356 340 - // Update binary path 341 - let bin_path = target_dir.join(&binary_name); 357 + // Update binary path using cached values 358 + let bin_path = target.join(name); 342 359 if bin_path.exists() { 343 360 *binary_path.write().await = Some(bin_path.clone()); 344 361 debug!(name: "build", "Binary path set to: {:?}", bin_path); ··· 346 363 debug!(name: "build", "Binary not found at expected path: {:?}", bin_path); 347 364 } 348 365 349 - // Try to load the dependency tracker 350 - match DependencyTracker::load_from_binary_name(&binary_name) { 366 + // Reload the dependency tracker from the .d file 367 + // This MUST be done after each build since dependencies can change 368 + match DependencyTracker::load_from_binary_name(name) { 351 369 Ok(tracker) => { 352 370 debug!(name: "build", "Loaded {} dependencies for tracking", tracker.get_dependencies().len()); 353 371 *dep_tracker.write().await = Some(tracker);