Skip to content

Commit c227502

Browse files
committed
make dirs preemtively
1 parent 4c1eccb commit c227502

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

src/package_tree.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
use crate::bsconfig;
22
use crate::bsconfig::*;
33
use crate::helpers;
4+
use crate::helpers::get_build_path;
45
use crate::helpers::get_package_path;
56
use crate::structure_hashmap;
67
use ahash::{AHashMap, AHashSet};
78
use convert_case::{Case, Casing};
89
use rayon::prelude::*;
910
use std::fs;
1011
use std::hash::{Hash, Hasher};
12+
use std::path::PathBuf;
1113

1214
#[derive(Debug, Clone)]
1315
pub struct Package {
@@ -18,6 +20,7 @@ pub struct Package {
1820
pub namespace: Option<String>,
1921
pub modules: Option<AHashSet<String>>,
2022
pub package_dir: String,
23+
pub dirs: Option<AHashSet<PathBuf>>,
2124
}
2225

2326
impl PartialEq for Package {
@@ -150,6 +153,7 @@ fn build_package<'a>(
150153
},
151154
modules: None,
152155
package_dir: package_dir.to_string(),
156+
dirs: None,
153157
}
154158
});
155159

@@ -243,6 +247,16 @@ fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String
243247
None => (),
244248
}
245249
value.modules = Some(modules);
250+
let mut dirs = AHashSet::new();
251+
map.keys().for_each(|path| {
252+
let dir = std::path::Path::new(&path)
253+
.strip_prefix(&value.package_dir)
254+
.unwrap()
255+
.parent()
256+
.unwrap();
257+
dirs.insert(dir.to_owned());
258+
});
259+
value.dirs = Some(dirs);
246260
value.source_files = Some(map);
247261
}
248262
build
@@ -254,15 +268,27 @@ fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String
254268
/// 2. Take the (by then deduplicated) packages, and find all the '.re', '.res', '.ml' and
255269
/// interface files.
256270
/// The two step process is there to reduce IO overhead
257-
pub fn make(folder: &str) -> AHashMap<String, Package> {
271+
pub fn make(root_folder: &str) -> AHashMap<String, Package> {
258272
/* The build_package get's called recursively. By using extend, we deduplicate all the packages
259273
* */
260274
let mut map: AHashMap<String, Package> = AHashMap::new();
261275

262-
let package_dir = get_package_dir("", true, folder);
276+
let package_dir = get_package_dir("", true, root_folder);
263277
let bsconfig = read_bsconfig(&package_dir);
264-
build_package(&mut map, bsconfig, &package_dir, folder);
278+
build_package(&mut map, bsconfig, &package_dir, root_folder);
265279
/* Once we have the deduplicated packages, we can add the source files for each - to minimize
266280
* the IO */
267-
extend_with_children(map)
281+
let result = extend_with_children(map);
282+
result
283+
.values()
284+
.into_iter()
285+
.for_each(|package| match &package.dirs {
286+
Some(dirs) => dirs.iter().for_each(|dir| {
287+
let _ = std::fs::create_dir_all(
288+
std::path::Path::new(&get_build_path(root_folder, &package.name)).join(dir),
289+
);
290+
}),
291+
None => (),
292+
});
293+
result
268294
}

0 commit comments

Comments
 (0)