|
1 | | -use std::{path::PathBuf, time::SystemTime}; |
| 1 | +use std::{ |
| 2 | + fs::{self, Metadata}, |
| 3 | + path::PathBuf, |
| 4 | + time::SystemTime, |
| 5 | +}; |
2 | 6 |
|
3 | 7 | macro_rules! p { |
4 | 8 | ($($tokens: tt)*) => { |
@@ -27,6 +31,7 @@ fn main() -> std::io::Result<()> { |
27 | 31 |
|
28 | 32 | if should_build(&dirs) { |
29 | 33 | build_js(&dirs); |
| 34 | + let _ = fs::remove_dir_all(&dirs.js_dist_tmp); |
30 | 35 | dircpy::copy_dir(&dirs.js_dist_source, &dirs.js_dist_tmp)?; |
31 | 36 | } else if dirs.js_dist_tmp.exists() { |
32 | 37 | p!("Found {}, skipping copy", dirs.js_dist_tmp.display()); |
@@ -61,38 +66,19 @@ fn should_build(dirs: &Dirs) -> bool { |
61 | 66 | if let Ok(tmp_dist_index_html) = |
62 | 67 | std::fs::metadata(format!("{}/index.html", dirs.js_dist_tmp.display())) |
63 | 68 | { |
64 | | - let dist_time = tmp_dist_index_html |
65 | | - .modified() |
66 | | - .unwrap() |
67 | | - .duration_since(SystemTime::UNIX_EPOCH) |
68 | | - .unwrap(); |
69 | | - for entry in walkdir::WalkDir::new(&dirs.src_browser) |
| 69 | + let has_changes = walkdir::WalkDir::new(&dirs.src_browser) |
70 | 70 | .into_iter() |
71 | | - .filter_map(|e| { |
72 | | - // ignore ds store |
73 | | - if let Ok(e) = e { |
74 | | - if e.path().to_str().unwrap().contains(".DS_Store") { |
75 | | - return None; |
76 | | - } |
77 | | - Some(e) |
78 | | - } else { |
79 | | - None |
80 | | - } |
| 71 | + .filter_entry(|entry| { |
| 72 | + entry |
| 73 | + .file_name() |
| 74 | + .to_str() |
| 75 | + .map(|s| !s.starts_with(".DS_Store")) |
| 76 | + .unwrap_or(false) |
81 | 77 | }) |
82 | | - { |
83 | | - if entry.path().is_file() { |
84 | | - let src_time = entry |
85 | | - .metadata() |
86 | | - .unwrap() |
87 | | - .modified() |
88 | | - .unwrap() |
89 | | - .duration_since(SystemTime::UNIX_EPOCH) |
90 | | - .unwrap(); |
91 | | - if src_time >= dist_time { |
92 | | - p!("Source file modified: {:?}, rebuilding...", entry.path()); |
93 | | - return true; |
94 | | - } |
95 | | - } |
| 78 | + .any(|entry| is_older_than(&entry.unwrap(), &tmp_dist_index_html)); |
| 79 | + |
| 80 | + if has_changes { |
| 81 | + return true; |
96 | 82 | } |
97 | 83 |
|
98 | 84 | p!("No changes in JS source files, skipping JS build."); |
@@ -145,3 +131,29 @@ fn build_js(dirs: &Dirs) { |
145 | 131 | ); |
146 | 132 | } |
147 | 133 | } |
| 134 | + |
| 135 | +fn is_older_than(dir_entry: &walkdir::DirEntry, dist_meta: &Metadata) -> bool { |
| 136 | + let dist_time = dist_meta |
| 137 | + .modified() |
| 138 | + .unwrap() |
| 139 | + .duration_since(SystemTime::UNIX_EPOCH) |
| 140 | + .unwrap(); |
| 141 | + |
| 142 | + if dir_entry.path().is_file() { |
| 143 | + let src_time = dir_entry |
| 144 | + .metadata() |
| 145 | + .unwrap() |
| 146 | + .modified() |
| 147 | + .unwrap() |
| 148 | + .duration_since(SystemTime::UNIX_EPOCH) |
| 149 | + .unwrap(); |
| 150 | + if src_time >= dist_time { |
| 151 | + p!( |
| 152 | + "Source file modified: {:?}, rebuilding...", |
| 153 | + dir_entry.path() |
| 154 | + ); |
| 155 | + return true; |
| 156 | + } |
| 157 | + } |
| 158 | + false |
| 159 | +} |
0 commit comments