Skip to content

Commit 858712d

Browse files
author
Roland Peelen
committed
👷 - Scaffold
1 parent 0657270 commit 858712d

File tree

4 files changed

+121
-7
lines changed

4 files changed

+121
-7
lines changed

src/build.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub mod read_compile_state;
1111
use crate::build::compile::{mark_modules_with_deleted_deps_dirty, mark_modules_with_expired_deps_dirty};
1212
use crate::helpers::emojis::*;
1313
use crate::helpers::{self, get_workspace_root};
14+
use crate::sourcedirs;
1415
use ahash::AHashSet;
1516
use build_types::*;
1617
use console::style;
@@ -344,6 +345,7 @@ pub fn incremental_build(
344345
let compile_duration = start_compiling.elapsed();
345346

346347
logs::finalize(&build_state.packages);
348+
sourcedirs::print(&build_state);
347349
pb.finish();
348350
if !compile_errors.is_empty() {
349351
if helpers::contains_ascii_characters(&compile_warnings) {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ pub mod cmd;
44
pub mod helpers;
55
pub mod lock;
66
pub mod queue;
7+
pub mod sourcedirs;
78
pub mod watcher;

src/main.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
use clap::{Parser, ValueEnum};
22
use regex::Regex;
33

4-
pub mod bsconfig;
5-
pub mod build;
6-
pub mod cmd;
7-
pub mod helpers;
8-
pub mod lock;
9-
pub mod queue;
10-
pub mod watcher;
4+
use rewatch::{build, cmd, lock, watcher};
115

126
#[derive(Debug, Clone, ValueEnum)]
137
enum Command {

src/sourcedirs.rs

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
use crate::build::build_types::BuildState;
2+
use crate::build::packages::Package;
3+
use ahash::{AHashMap, AHashSet};
4+
use rayon::prelude::*;
5+
use serde::Serialize;
6+
use serde_json::json;
7+
use std::fs::File;
8+
use std::io::prelude::*;
9+
10+
type Dir = String;
11+
type PackageName = String;
12+
type AbsolutePath = String;
13+
type PackagePath = String;
14+
15+
#[derive(Serialize, Debug, Clone, PartialEq, Hash)]
16+
pub struct SourceDirs {
17+
pub dirs: Vec<Dir>,
18+
pub pkgs: Vec<(PackageName, AbsolutePath)>,
19+
pub generated: Vec<String>,
20+
}
21+
22+
pub fn print(buildstate: &BuildState) {
23+
let (_name, package) = buildstate
24+
.packages
25+
.iter()
26+
.find(|(_name, package)| package.is_root)
27+
.expect("Could not find root package");
28+
29+
// First do all child packages
30+
let child_packages = buildstate
31+
.packages
32+
.par_iter()
33+
.filter(|(_name, package)| !package.is_root)
34+
.map(|(_name, package)| {
35+
let path = package.get_bs_build_path();
36+
37+
let dirs = package
38+
.dirs
39+
.to_owned()
40+
.unwrap_or(AHashSet::new())
41+
.iter()
42+
.filter_map(|path| path.to_str().map(|x| x.to_string()))
43+
.collect::<AHashSet<String>>();
44+
45+
fn deps_to_pkgs<'a>(
46+
packages: &'a AHashMap<String, Package>,
47+
xs: &'a Option<Vec<String>>,
48+
) -> AHashSet<(String, PackagePath)> {
49+
xs.as_ref()
50+
.unwrap_or(&vec![])
51+
.iter()
52+
.filter_map(|name| {
53+
packages
54+
.get(&name.to_owned())
55+
.map(|package| (name.clone(), package.path.clone()))
56+
})
57+
.collect::<AHashSet<(String, PackagePath)>>()
58+
}
59+
60+
let pinned_dependencies =
61+
deps_to_pkgs(&buildstate.packages, &package.bsconfig.pinned_dependencies);
62+
let bs_dependencies = deps_to_pkgs(&buildstate.packages, &package.bsconfig.bs_dependencies);
63+
let bs_dev_dependencies =
64+
deps_to_pkgs(&buildstate.packages, &package.bsconfig.bs_dev_dependencies);
65+
66+
let mut pkgs = AHashMap::new();
67+
pkgs.extend(pinned_dependencies);
68+
pkgs.extend(bs_dependencies);
69+
pkgs.extend(bs_dev_dependencies);
70+
71+
let name = path + "/.sourcedirs.json";
72+
let _ = File::create(&name).map(|mut file| {
73+
let source_files = SourceDirs {
74+
dirs: dirs.clone().into_iter().collect::<Vec<Dir>>(),
75+
pkgs: pkgs
76+
.clone()
77+
.into_iter()
78+
.collect::<Vec<(PackageName, AbsolutePath)>>(),
79+
generated: vec![],
80+
};
81+
82+
file.write(json!(source_files).to_string().as_bytes())
83+
});
84+
let _ = std::fs::copy(package.get_bs_build_path(), package.get_build_path());
85+
86+
(&package.path, dirs, pkgs)
87+
})
88+
.collect::<Vec<(
89+
&PackagePath,
90+
AHashSet<String>,
91+
AHashMap<PackageName, AbsolutePath>,
92+
)>>();
93+
94+
let mut all_dirs = AHashSet::new();
95+
let mut all_pkgs: AHashMap<PackageName, AbsolutePath> = AHashMap::new();
96+
97+
child_packages.iter().for_each(|(package_path, dirs, pkgs)| {
98+
dirs.iter().for_each(|dir| {
99+
all_dirs.insert(format!("{package_path}/{dir}"));
100+
});
101+
102+
all_pkgs.extend(pkgs.to_owned());
103+
});
104+
105+
let path = package.get_bs_build_path();
106+
let name = path + "/.sourcedirs.json";
107+
let _ = File::create(name.clone()).map(|mut file| {
108+
let all_source_files = SourceDirs {
109+
dirs: all_dirs.into_iter().collect::<Vec<String>>(),
110+
pkgs: all_pkgs.into_iter().collect::<Vec<(PackageName, AbsolutePath)>>(),
111+
generated: vec![],
112+
};
113+
file.write(json!(all_source_files).to_string().as_bytes())
114+
});
115+
116+
let _ = std::fs::copy(package.get_bs_build_path(), package.get_build_path());
117+
}

0 commit comments

Comments
 (0)