From 44d7dea19bd72777a0aad4f54c1c44d5df883e9e Mon Sep 17 00:00:00 2001 From: davidbalbino Date: Sat, 3 Oct 2026 23:46:21 -0300 Subject: [PATCH] fix(dev): ignore vendor and logs in Native hot reload --- CHANGELOG.md | 6 ++++ Cargo.lock | 6 ++-- Cargo.toml | 2 +- crates/pam-native-cli/src/mobile.rs | 56 +++++++++++++++++++++++------ packages/native/src/Protocol.php | 2 +- packages/native/tests/run.php | 4 +-- 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86eef938..6c6b7831 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 1.0.31 - 2026-10-03 + +- Stop hot reload from scanning Composer dependencies or reacting to app log + writes. Source edits still refresh immediately, while development logs can + no longer trigger an endless reload loop during a clean first run. + ## 1.0.30 - 2026-10-03 - Resolve the SDK from the installed Composer package and install the Android diff --git a/Cargo.lock b/Cargo.lock index 66e86945..0705fbd6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,7 +76,7 @@ checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "pam-native-cli" -version = "1.0.30" +version = "1.0.31" dependencies = [ "serde", "serde_json", @@ -85,7 +85,7 @@ dependencies = [ [[package]] name = "pam-native-engine" -version = "1.0.30" +version = "1.0.31" dependencies = [ "pam-native-protocol", "ttf-parser", @@ -93,7 +93,7 @@ dependencies = [ [[package]] name = "pam-native-protocol" -version = "1.0.30" +version = "1.0.31" [[package]] name = "proc-macro2" diff --git a/Cargo.toml b/Cargo.toml index 81a59737..175bdae4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ exclude = ["pam-cli"] [workspace.package] -version = "1.0.30" +version = "1.0.31" edition = "2024" rust-version = "1.88" license = "Apache-2.0" diff --git a/crates/pam-native-cli/src/mobile.rs b/crates/pam-native-cli/src/mobile.rs index 75a3c74b..a4149b0a 100644 --- a/crates/pam-native-cli/src/mobile.rs +++ b/crates/pam-native-cli/src/mobile.rs @@ -7717,20 +7717,27 @@ fn http_response(stream: &mut TcpStream, content_type: &str, body: &[u8]) -> Res } fn project_fingerprint(root: &Path) -> Result<(u64, u128), String> { - fn visit(root: &Path, count: &mut u64, latest: &mut u128) -> Result<(), String> { - for entry in fs::read_dir(root).map_err(|error| error.to_string())? { + fn visit( + project_root: &Path, + directory: &Path, + count: &mut u64, + latest: &mut u128, + ) -> Result<(), String> { + for entry in fs::read_dir(directory).map_err(|error| error.to_string())? { let entry = entry.map_err(|error| error.to_string())?; - let relative = entry - .path() - .strip_prefix(root) - .unwrap_or(&entry.path()) - .to_path_buf(); - if ignored_project_path(&relative) { + let path = entry.path(); + let relative = path.strip_prefix(project_root).unwrap_or(&path); + if ignored_project_path(relative) + || relative + .components() + .any(|component| component.as_os_str() == "vendor") + || path.extension() == Some(OsStr::new("log")) + { continue; } let metadata = entry.metadata().map_err(|error| error.to_string())?; if metadata.is_dir() { - visit(&entry.path(), count, latest)?; + visit(project_root, &path, count, latest)?; } else if metadata.is_file() { *count = count.saturating_add(metadata.len()).saturating_add(1); let changed = metadata @@ -7746,7 +7753,7 @@ fn project_fingerprint(root: &Path) -> Result<(u64, u128), String> { } let mut count = 0; let mut latest = 0; - visit(root, &mut count, &mut latest)?; + visit(root, root, &mut count, &mut latest)?; Ok((count, latest)) } @@ -7784,6 +7791,35 @@ fn print_usage() { mod tests { use super::*; + #[test] + fn hot_reload_watches_sources_without_reloading_for_logs_or_vendor() { + let root = std::env::temp_dir().join(format!( + "pam-hot-reload-watch-{}", + SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("clock") + .as_nanos() + )); + fs::create_dir_all(root.join("src")).expect("source directory"); + fs::create_dir_all(root.join("vendor/package")).expect("vendor directory"); + fs::write(root.join("index.php"), b"