aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/reload.rs43
-rw-r--r--src/run/builtin.rs9
2 files changed, 42 insertions, 10 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));
}
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index 5524fd7..b342dd0 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -41,13 +41,8 @@ impl Builtin for re {
fn mod_session(&self, session: &mut Session, _args: &[BString]) {
session.raw.disable();
- match Command::new("cargo").arg("build").status() {
- Ok(status) if status.success() => {
- crate::reload::begin_reload();
- }
- _ => (),
- }
- session.raw.enable();
+ crate::reload::begin_reload();
+ session.raw.enable(); // something went wrong, let's restore raw mode
}
}