diff --git a/CHANGELOG.md b/CHANGELOG.md index 343a2affd2..1736d00786 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,7 @@ #### :bug: Bug fix - Fix `typeof` parens on functions. https://github.com/rescript-lang/rescript/pull/7643 - +- Don't panic when dev files are not present during clean. https://github.com/rescript-lang/rescript/pull/7622 # 12.0.0-beta.1 diff --git a/rewatch/src/build.rs b/rewatch/src/build.rs index 4545e3f0f3..8526f91611 100644 --- a/rewatch/src/build.rs +++ b/rewatch/src/build.rs @@ -8,7 +8,10 @@ pub mod packages; pub mod parse; pub mod read_compile_state; +use self::compile::compiler_args; +use self::parse::parser_args; use crate::build::compile::{mark_modules_with_deleted_deps_dirty, mark_modules_with_expired_deps_dirty}; +use crate::build::packages::DevDeps; use crate::helpers::emojis::*; use crate::helpers::{self, get_workspace_root}; use crate::sourcedirs; @@ -26,9 +29,6 @@ use std::path::{Path, PathBuf}; use std::process::Stdio; use std::time::{Duration, Instant}; -use self::compile::compiler_args; -use self::parse::parser_args; - fn is_dirty(module: &Module) -> bool { match module.source_type { SourceType::SourceFile(SourceFile { @@ -133,7 +133,11 @@ pub fn initialize_build( &project_root, &workspace_root, show_progress, - build_dev_deps, + if build_dev_deps { + DevDeps::Build + } else { + DevDeps::DontBuild + }, )?; let timing_package_tree_elapsed = timing_package_tree.elapsed(); diff --git a/rewatch/src/build/clean.rs b/rewatch/src/build/clean.rs index da1543b2f9..1d1512788c 100644 --- a/rewatch/src/build/clean.rs +++ b/rewatch/src/build/clean.rs @@ -1,5 +1,6 @@ use super::build_types::*; use super::packages; +use crate::build::packages::DevDeps; use crate::helpers; use crate::helpers::emojis::*; use ahash::AHashSet; @@ -341,7 +342,7 @@ pub fn clean(path: &Path, show_progress: bool, snapshot_output: bool) -> Result< show_progress, // Build the package tree with dev dependencies. // They should always be cleaned if they are there. - true, + DevDeps::Clean, )?; let root_config_name = packages::read_package_name(&project_root)?; let bsc_path = helpers::get_bsc(); diff --git a/rewatch/src/build/packages.rs b/rewatch/src/build/packages.rs index c5bc613f76..42d726406a 100644 --- a/rewatch/src/build/packages.rs +++ b/rewatch/src/build/packages.rs @@ -501,7 +501,7 @@ pub fn get_source_files( package_dir: &Path, filter: &Option, source: &config::PackageSource, - build_dev_deps: bool, + dev_deps: DevDeps, ) -> AHashMap { let mut map: AHashMap = AHashMap::new(); @@ -515,8 +515,9 @@ pub fn get_source_files( }; let path_dir = Path::new(&source.dir); - match (build_dev_deps, type_) { - (false, Some(type_)) if type_ == "dev" => (), + match (dev_deps, type_) { + (DevDeps::DontBuild, Some(type_)) if type_ == "dev" => (), + (DevDeps::Clean, Some(type_)) if type_ == "dev" && !package_dir.join(path_dir).exists() => (), _ => match read_folders(filter, package_dir, path_dir, recurse) { Ok(files) => map.extend(files), @@ -537,22 +538,14 @@ pub fn get_source_files( fn extend_with_children( filter: &Option, mut build: AHashMap, - build_dev_deps: bool, + dev_deps: DevDeps, ) -> AHashMap { for (_key, package) in build.iter_mut() { let mut map: AHashMap = AHashMap::new(); package .source_folders .par_iter() - .map(|source| { - get_source_files( - &package.name, - Path::new(&package.path), - filter, - source, - build_dev_deps, - ) - }) + .map(|source| get_source_files(&package.name, Path::new(&package.path), filter, source, dev_deps)) .collect::>>() .into_iter() .for_each(|source| map.extend(source)); @@ -582,6 +575,13 @@ fn extend_with_children( build } +#[derive(Clone, Copy)] +pub enum DevDeps { + Build, + DontBuild, + Clean, +} + /// Make turns a folder, that should contain a config, into a tree of Packages. /// It does so in two steps: /// 1. Get all the packages parsed, and take all the source folders from the config @@ -594,13 +594,13 @@ pub fn make( root_folder: &Path, workspace_root: &Option, show_progress: bool, - build_dev_deps: bool, + dev_deps: DevDeps, ) -> Result> { let map = read_packages(root_folder, workspace_root, show_progress)?; /* Once we have the deduplicated packages, we can add the source files for each - to minimize * the IO */ - let result = extend_with_children(filter, map, build_dev_deps); + let result = extend_with_children(filter, map, dev_deps); Ok(result) } diff --git a/rewatch/testrepo/bsconfig.json b/rewatch/testrepo/bsconfig.json index dfa69cf830..f55b950dcd 100644 --- a/rewatch/testrepo/bsconfig.json +++ b/rewatch/testrepo/bsconfig.json @@ -21,7 +21,8 @@ "@testrepo/new-namespace", "@testrepo/namespace-casing", "@testrepo/with-dev-deps", - "@testrepo/compiled-by-legacy" + "@testrepo/compiled-by-legacy", + "@testrepo/nonexisting-dev-files" ], "bs-dependencies": [ "@testrepo/main", @@ -30,6 +31,7 @@ "@testrepo/new-namespace", "@testrepo/namespace-casing", "@testrepo/with-dev-deps", - "@testrepo/compiled-by-legacy" + "@testrepo/compiled-by-legacy", + "@testrepo/nonexisting-dev-files" ] } diff --git a/rewatch/testrepo/package.json b/rewatch/testrepo/package.json index 638c31f638..a170d39c59 100644 --- a/rewatch/testrepo/package.json +++ b/rewatch/testrepo/package.json @@ -9,7 +9,8 @@ "packages/new-namespace", "packages/namespace-casing", "packages/with-dev-deps", - "packages/compiled-by-legacy" + "packages/compiled-by-legacy", + "packages/nonexisting-dev-files" ] }, "dependencies": { diff --git a/rewatch/testrepo/packages/nonexisting-dev-files/package.json b/rewatch/testrepo/packages/nonexisting-dev-files/package.json new file mode 100644 index 0000000000..7af67a1eea --- /dev/null +++ b/rewatch/testrepo/packages/nonexisting-dev-files/package.json @@ -0,0 +1,9 @@ +{ + "name": "@testrepo/nonexisting-dev-files", + "version": "0.0.1", + "keywords": [ + "rescript" + ], + "author": "", + "license": "MIT" +} diff --git a/rewatch/testrepo/packages/nonexisting-dev-files/rescript.json b/rewatch/testrepo/packages/nonexisting-dev-files/rescript.json new file mode 100644 index 0000000000..7eb6700ad8 --- /dev/null +++ b/rewatch/testrepo/packages/nonexisting-dev-files/rescript.json @@ -0,0 +1,8 @@ +{ + "name": "@testrepo/nonexisting-dev-files", + "sources": { + "dir": "dev", + "subdirs": true, + "type": "dev" + } +} diff --git a/rewatch/testrepo/yarn.lock b/rewatch/testrepo/yarn.lock index 5c323e6f29..fa0f31c40a 100644 --- a/rewatch/testrepo/yarn.lock +++ b/rewatch/testrepo/yarn.lock @@ -81,6 +81,12 @@ __metadata: languageName: unknown linkType: soft +"@testrepo/nonexisting-dev-files@workspace:packages/nonexisting-dev-files": + version: 0.0.0-use.local + resolution: "@testrepo/nonexisting-dev-files@workspace:packages/nonexisting-dev-files" + languageName: unknown + linkType: soft + "@testrepo/with-dev-deps@workspace:packages/with-dev-deps": version: 0.0.0-use.local resolution: "@testrepo/with-dev-deps@workspace:packages/with-dev-deps"