tangled
alpha
login
or
join now
erika.florist
/
maudit
6
fork
atom
Rust library to generate static websites
6
fork
atom
overview
issues
pulls
1
pipelines
fix: don't recompute dirs
Princesseuh
1 month ago
0b052127
6661483f
+39
-21
1 changed file
expand all
collapse all
unified
split
crates
maudit-cli
src
dev
build.rs
+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
26
+
// Cached values computed once at startup
27
27
+
target_dir: Arc<Option<PathBuf>>,
28
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
33
+
// Try to determine target directory and binary name at startup
34
34
+
let target_dir = find_target_dir().ok();
35
35
+
let binary_name = Self::get_binary_name_from_cargo_toml().ok();
36
36
+
37
37
+
if let Some(ref name) = binary_name {
38
38
+
debug!(name: "build", "Detected binary name at startup: {}", name);
39
39
+
}
40
40
+
if let Some(ref dir) = target_dir {
41
41
+
debug!(name: "build", "Using target directory: {:?}", dir);
42
42
+
}
43
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
51
+
target_dir: Arc::new(target_dir),
52
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
204
+
let target_dir_clone = self.target_dir.clone();
205
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
282
-
Self::update_dependency_tracker_after_build(dep_tracker_clone.clone(), binary_path_clone.clone()).await;
300
300
+
Self::update_dependency_tracker_after_build(
301
301
+
dep_tracker_clone.clone(),
302
302
+
binary_path_clone.clone(),
303
303
+
target_dir_clone.clone(),
304
304
+
binary_name_clone.clone(),
305
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
342
+
target_dir: Arc<Option<PathBuf>>,
343
343
+
binary_name: Arc<Option<String>>,
319
344
) {
320
320
-
// Try to get the binary name from Cargo.toml in the current directory
321
321
-
let binary_name = match Self::get_binary_name_from_cargo_toml() {
322
322
-
Ok(name) => name,
323
323
-
Err(e) => {
324
324
-
debug!(name: "build", "Could not determine binary name: {}", e);
325
325
-
return;
326
326
-
}
345
345
+
// Use cached binary name (computed once at startup)
346
346
+
let Some(name) = binary_name.as_ref() else {
347
347
+
debug!(name: "build", "No binary name available, skipping dependency tracker update");
348
348
+
return;
327
349
};
328
350
329
329
-
debug!(name: "build", "Detected binary name: {}", binary_name);
330
330
-
331
331
-
// Find the target directory
332
332
-
let target_dir = match find_target_dir() {
333
333
-
Ok(dir) => dir,
334
334
-
Err(e) => {
335
335
-
debug!(name: "build", "Could not find target directory: {}", e);
336
336
-
return;
337
337
-
}
351
351
+
// Use cached target directory (computed once at startup)
352
352
+
let Some(target) = target_dir.as_ref() else {
353
353
+
debug!(name: "build", "No target directory available, skipping dependency tracker update");
354
354
+
return;
338
355
};
339
356
340
340
-
// Update binary path
341
341
-
let bin_path = target_dir.join(&binary_name);
357
357
+
// Update binary path using cached values
358
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
349
-
// Try to load the dependency tracker
350
350
-
match DependencyTracker::load_from_binary_name(&binary_name) {
366
366
+
// Reload the dependency tracker from the .d file
367
367
+
// This MUST be done after each build since dependencies can change
368
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);