From caabc690186a869d0ea7d34d461a93675761ad11 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Thu, 5 Mar 2026 20:16:37 +0100 Subject: reload now works when you changed directory --- src/reload.rs | 43 ++++++++++++++++++++++++++++++++++++++++--- src/run/builtin.rs | 9 ++------- 2 files changed, 42 insertions(+), 10 deletions(-) (limited to 'src') 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 { + 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 } } -- cgit v1.2.3