Skip to content

Commit cb9e2ec

Browse files
authored
Allow builds while watchers are running (#8349)
* Branch lockfiles * Add build.lock / await mechanism * Remove build.lock when finished * Rename loading lockfile message * Short-circuit if path no longer exists * Tests * Drop lock after clean * fmt
1 parent 91fb835 commit cb9e2ec

10 files changed

Lines changed: 349 additions & 68 deletions

File tree

rewatch/src/build.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::build::compile::{mark_modules_with_deleted_deps_dirty, mark_modules_w
1414
use crate::build::compiler_info::{CompilerCheckResult, verify_compiler_info, write_compiler_info};
1515
use crate::helpers::emojis::*;
1616
use crate::helpers::{self};
17+
use crate::lock::{LockKind, drop_lock, get_lock_or_exit};
1718
use crate::project_context::ProjectContext;
1819
use crate::sourcedirs;
1920
use anyhow::{Context, Result, anyhow};
@@ -146,7 +147,13 @@ pub fn initialize_build(
146147
return Err(anyhow!("Failed to validate package dependencies"));
147148
}
148149

149-
let mut build_state = BuildCommandState::new(project_context, packages, compiler, warn_error);
150+
let mut build_state = BuildCommandState::new(
151+
path.to_path_buf(),
152+
project_context,
153+
packages,
154+
compiler,
155+
warn_error,
156+
);
150157
packages::parse_packages(&mut build_state)?;
151158

152159
let compile_assets_state = read_compile_state::read(&mut build_state)?;
@@ -238,6 +245,10 @@ pub fn incremental_build(
238245
create_sourcedirs: bool,
239246
plain_output: bool,
240247
) -> Result<(), IncrementalBuildError> {
248+
let build_folder = build_state.root_folder.to_string_lossy().to_string();
249+
250+
let _lock = get_lock_or_exit(LockKind::Build, &build_folder);
251+
241252
logs::initialize(&build_state.packages);
242253
let num_dirty_modules = build_state.modules.values().filter(|m| is_dirty(m)).count() as u64;
243254
let pb = if !plain_output && show_progress {
@@ -281,6 +292,8 @@ pub fn incremental_build(
281292
}
282293

283294
eprintln!("{}", &err);
295+
let _lock = drop_lock(LockKind::Build, &build_folder);
296+
284297
return Err(IncrementalBuildError {
285298
kind: IncrementalBuildErrorKind::SourceFileParseError,
286299
plain_output,
@@ -343,9 +356,13 @@ pub fn incremental_build(
343356
|| pb.inc(1),
344357
|size| pb.set_length(size),
345358
)
346-
.map_err(|e| IncrementalBuildError {
347-
kind: IncrementalBuildErrorKind::CompileError(Some(e.to_string())),
348-
plain_output,
359+
.map_err(|e| {
360+
let _lock = drop_lock(LockKind::Build, &build_folder);
361+
362+
IncrementalBuildError {
363+
kind: IncrementalBuildErrorKind::CompileError(Some(e.to_string())),
364+
plain_output,
365+
}
349366
})?;
350367

351368
let compile_duration = start_compiling.elapsed();
@@ -379,6 +396,9 @@ pub fn incremental_build(
379396
if helpers::contains_ascii_characters(&compile_errors) {
380397
eprintln!("{}", &compile_errors);
381398
}
399+
400+
let _lock = drop_lock(LockKind::Build, &build_folder);
401+
382402
Err(IncrementalBuildError {
383403
kind: IncrementalBuildErrorKind::CompileError(None),
384404
plain_output,
@@ -409,6 +429,7 @@ pub fn incremental_build(
409429
// Write per-package compiler metadata to `lib/bs/compiler-info.json` (idempotent)
410430
write_compiler_info(build_state);
411431

432+
let _lock = drop_lock(LockKind::Build, &build_folder);
412433
Ok(())
413434
}
414435
}

rewatch/src/build/build_types.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ pub struct BuildState {
122122
/// - This prevents the "code smell" of optional fields that are None for some commands
123123
#[derive(Debug)]
124124
pub struct BuildCommandState {
125+
pub root_folder: PathBuf,
125126
pub build_state: BuildState,
126127
// Command-line --warn-error flag override (takes precedence over rescript.json config)
127128
pub warn_error_override: Option<String>,
@@ -171,12 +172,14 @@ impl BuildState {
171172

172173
impl BuildCommandState {
173174
pub fn new(
175+
root_folder: PathBuf,
174176
project_context: ProjectContext,
175177
packages: AHashMap<String, Package>,
176178
compiler: CompilerInfo,
177179
warn_error_override: Option<String>,
178180
) -> Self {
179181
Self {
182+
root_folder,
180183
build_state: BuildState::new(project_context, packages, compiler),
181184
warn_error_override,
182185
}

0 commit comments

Comments
 (0)