@@ -14,6 +14,7 @@ use crate::build::compile::{mark_modules_with_deleted_deps_dirty, mark_modules_w
1414use crate :: build:: compiler_info:: { CompilerCheckResult , verify_compiler_info, write_compiler_info} ;
1515use crate :: helpers:: emojis:: * ;
1616use crate :: helpers:: { self } ;
17+ use crate :: lock:: { LockKind , drop_lock, get_lock_or_exit} ;
1718use crate :: project_context:: ProjectContext ;
1819use crate :: sourcedirs;
1920use 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}
0 commit comments