Dramatically improved transpile times by caching
This commit is contained in:
+31
-2
@@ -30,7 +30,10 @@ pub fn build() -> (Config, PathBuf) {
|
|||||||
|
|
||||||
let elapsed = start.elapsed();
|
let elapsed = start.elapsed();
|
||||||
|
|
||||||
println!("\x1b[32m\nTranspile successful\x1b[0m in \x1b[34m{:.2?}\x1b[0m", elapsed);
|
println!(
|
||||||
|
"\x1b[32m\nTranspile successful\x1b[0m in \x1b[34m{:.2?}\x1b[0m",
|
||||||
|
elapsed
|
||||||
|
);
|
||||||
|
|
||||||
(config, root)
|
(config, root)
|
||||||
}
|
}
|
||||||
@@ -69,13 +72,30 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) {
|
|||||||
|
|
||||||
let relative = path.strip_prefix(base_src).unwrap();
|
let relative = path.strip_prefix(base_src).unwrap();
|
||||||
|
|
||||||
|
// Handle non-mist files with a cache check
|
||||||
if path.extension().and_then(|e| e.to_str()) != Some("mist") {
|
if path.extension().and_then(|e| e.to_str()) != Some("mist") {
|
||||||
fs::copy(&path, out_dir.join(relative)).expect("Failed to copy non-mist file");
|
let dest_path = out_dir.join(relative);
|
||||||
|
|
||||||
|
// Create parent directories for static assets if needed
|
||||||
|
if let Some(parent) = dest_path.parent() {
|
||||||
|
let _ = fs::create_dir_all(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if should_skip(&path, &dest_path) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::copy(&path, dest_path).expect("Failed to copy non-mist file");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let output_path = out_dir.join(relative).with_extension("rs");
|
let output_path = out_dir.join(relative).with_extension("rs");
|
||||||
|
|
||||||
|
// Cache layer: Skip if the generated .rs file is newer than the .mist source
|
||||||
|
if should_skip(&path, &output_path) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// create parent directories
|
// create parent directories
|
||||||
if let Some(parent) = output_path.parent() {
|
if let Some(parent) = output_path.parent() {
|
||||||
if let Err(e) = fs::create_dir_all(parent) {
|
if let Err(e) = fs::create_dir_all(parent) {
|
||||||
@@ -145,6 +165,15 @@ fn build_dir(root: &Path, base_src: &Path, current_dir: &Path, out_dir: &Path) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn should_skip(source: &Path, output: &Path) -> bool {
|
||||||
|
if let (Ok(src_meta), Ok(out_meta)) = (fs::metadata(source), fs::metadata(output)) {
|
||||||
|
if let (Ok(src_time), Ok(out_time)) = (src_meta.modified(), out_meta.modified()) {
|
||||||
|
return out_time >= src_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
pub fn find_project_root() -> Option<PathBuf> {
|
pub fn find_project_root() -> Option<PathBuf> {
|
||||||
let mut dir = std::env::current_dir().ok()?;
|
let mut dir = std::env::current_dir().ok()?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user