aboutsummaryrefslogtreecommitdiffstats
path: root/src/reload.rs
diff options
context:
space:
mode:
authorJonas Maier <>2026-03-05 20:16:37 +0100
committerJonas Maier <>2026-03-05 20:16:37 +0100
commitcaabc690186a869d0ea7d34d461a93675761ad11 (patch)
tree92d925731b3bfb14e42b101323e1d579d5579808 /src/reload.rs
parent88e257128546f2f7aa549cdd62fd15f706ae5135 (diff)
downloadpish-caabc690186a869d0ea7d34d461a93675761ad11.tar.gz
reload now works when you changed directory
Diffstat (limited to 'src/reload.rs')
-rw-r--r--src/reload.rs43
1 files changed, 40 insertions, 3 deletions
diff --git a/src/reload.rs b/src/reload.rs
index effc8fd..2988b89 100644
--- a/src/reload.rs
+++ b/src/reload.rs
@@ -1,14 +1,51 @@
use std::{
- env,
+ env::{self, current_dir, set_current_dir},
ffi::CString,
+ fs,
io::Write,
- panic, ptr,
- sync::atomic::{AtomicBool, Ordering},
+ panic,
+ path::PathBuf,
+ process::Command,
+ ptr,
+ sync::{
+ Mutex,
+ atomic::{AtomicBool, Ordering},
+ },
};
static RELOAD: AtomicBool = AtomicBool::new(false);
+fn exe_path() -> String {
+ env::current_exe()
+ .unwrap()
+ .to_string_lossy()
+ .replace(" (deleted)", "")
+}
+
+fn cargo_path() -> Option<String> {
+ let exe = exe_path();
+ let parts: Vec<_> = exe.split('/').collect();
+ for i in (0..parts.len()).rev() {
+ let base_dir = format!("/{}", parts[0..i].join("/"));
+ let toml_path = format!("/{base_dir}/Cargo.toml");
+ if fs::exists(toml_path).unwrap() {
+ return Some(base_dir);
+ }
+ }
+ None
+}
+
pub fn begin_reload() {
+ let Some(cargo_path) = cargo_path() else {
+ return;
+ };
+ set_current_dir(cargo_path).unwrap();
+ let Ok(status) = Command::new("cargo").arg("build").status() else {
+ return;
+ };
+ if !status.success() {
+ return;
+ }
RELOAD.store(true, Ordering::SeqCst);
panic::resume_unwind(Box::new(42));
}