Skip to content

Commit 7b63630

Browse files
authored
Merge pull request #193 from kinode-dao/v0.6.8
v0.6.8
2 parents 396587e + ee064e1 commit 7b63630

3 files changed

Lines changed: 106 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "kit"
3-
version = "0.6.7"
3+
version = "0.6.8"
44
edition = "2021"
55

66
[build-dependencies]

src/build/mod.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::collections::{HashMap, HashSet};
22
use std::path::{Path, PathBuf};
33
use std::process::Command;
4+
use std::time::SystemTime;
45

56
use color_eyre::{
67
Section,
@@ -235,6 +236,82 @@ fn copy_dir(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> Result<()> {
235236
Ok(())
236237
}
237238

239+
fn file_with_extension_exists(dir: &Path, extension: &str) -> bool {
240+
if let Ok(entries) = fs::read_dir(dir) {
241+
for entry in entries.filter_map(Result::ok) {
242+
let path = entry.path();
243+
if path.is_file() && path.extension().and_then(|ext| ext.to_str()) == Some(extension) {
244+
return true;
245+
}
246+
}
247+
}
248+
false
249+
}
250+
251+
#[instrument(level = "trace", skip_all)]
252+
fn get_most_recent_modified_time(
253+
dir: &Path,
254+
exclude_files: &HashSet<&str>,
255+
exclude_extensions: &HashSet<&str>,
256+
exclude_dirs: &HashSet<&str>,
257+
) -> Result<(Option<SystemTime>, Option<SystemTime>)> {
258+
let mut most_recent: Option<SystemTime> = None;
259+
let mut most_recent_excluded: Option<SystemTime> = None;
260+
261+
for entry in fs::read_dir(dir)? {
262+
let entry = entry?;
263+
let path = entry.path();
264+
265+
let file_name = path.file_name().unwrap_or_default().to_str().unwrap_or_default();
266+
267+
if exclude_files.contains(file_name) {
268+
let file_time = get_file_modified_time(&path)?;
269+
most_recent_excluded = Some(most_recent_excluded.map_or(file_time, |t| t.max(file_time)));
270+
continue;
271+
}
272+
273+
if path.is_dir() {
274+
let dir_name = path.file_name().unwrap_or_default().to_str().unwrap_or_default();
275+
if exclude_dirs.contains(dir_name) {
276+
continue;
277+
}
278+
279+
let (sub_time, sub_time_excluded) = get_most_recent_modified_time(
280+
&path,
281+
exclude_files,
282+
exclude_extensions,
283+
exclude_dirs,
284+
)?;
285+
286+
if let Some(st) = sub_time {
287+
most_recent = Some(most_recent.map_or(st, |t| t.max(st)));
288+
}
289+
if let Some(ste) = sub_time_excluded {
290+
most_recent_excluded = Some(most_recent_excluded.map_or(ste, |t| t.max(ste)));
291+
}
292+
} else {
293+
if let Some(extension) = path.extension() {
294+
if exclude_extensions.contains(&extension.to_str().unwrap_or_default()) {
295+
let file_time = get_file_modified_time(&path)?;
296+
most_recent_excluded = Some(most_recent_excluded.map_or(file_time, |t| t.max(file_time)));
297+
continue;
298+
}
299+
}
300+
301+
let file_time = get_file_modified_time(&path)?;
302+
most_recent = Some(most_recent.map_or(file_time, |t| t.max(file_time)));
303+
}
304+
}
305+
306+
Ok((most_recent, most_recent_excluded))
307+
}
308+
309+
#[instrument(level = "trace", skip_all)]
310+
fn get_file_modified_time(file_path: &Path) -> Result<SystemTime> {
311+
let metadata = fs::metadata(file_path)?;
312+
Ok(metadata.modified()?)
313+
}
314+
238315
#[instrument(level = "trace", skip_all)]
239316
async fn compile_javascript_wasm_process(
240317
process_dir: &Path,
@@ -908,6 +985,33 @@ pub async fn execute(
908985
)
909986
.with_suggestion(|| "Please re-run targeting a package."));
910987
}
988+
let build_with_features_path = package_dir.join("target").join("build_with_features.txt");
989+
let old_features = fs::read_to_string(&build_with_features_path).ok();
990+
if old_features == Some(features.to_string())
991+
&& package_dir.join("Cargo.lock").exists()
992+
&& package_dir.join("pkg").exists()
993+
&& package_dir.join("pkg").join("api.zip").exists()
994+
&& file_with_extension_exists(&package_dir.join("pkg"), "wasm")
995+
{
996+
let (source_time, build_time) = get_most_recent_modified_time(
997+
package_dir,
998+
&HashSet::from(["Cargo.lock", "api.zip"]),
999+
&HashSet::from(["wasm"]),
1000+
&HashSet::from(["target"]),
1001+
)?;
1002+
if let Some(source_time) = source_time {
1003+
if let Some(build_time) = build_time {
1004+
if build_time.duration_since(source_time).is_ok() {
1005+
// build_time - source_time >= 0
1006+
// -> current build is up-to-date: don't rebuild
1007+
info!("Build up-to-date.");
1008+
return Ok(());
1009+
}
1010+
}
1011+
}
1012+
}
1013+
fs::create_dir_all(package_dir.join("target"))?;
1014+
fs::write(&build_with_features_path, features)?;
9111015

9121016
let ui_dir = package_dir.join("ui");
9131017
if !ui_dir.exists() {

0 commit comments

Comments
 (0)