Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/document.rs')
-rw-r--r--helix-view/src/document.rs36
1 files changed, 31 insertions, 5 deletions
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index 48955511..346f04ed 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -106,6 +106,7 @@ impl Serialize for Mode {
#[derive(Debug, Clone)]
pub struct DocumentSavedEvent {
pub revision: usize,
+ pub save_time: SystemTime,
pub doc_id: DocumentId,
pub path: PathBuf,
pub text: Rope,
@@ -965,6 +966,11 @@ impl Document {
}
.await;
+ let save_time = match fs::metadata(&write_path).await {
+ Ok(metadata) => metadata.modified().map_or(SystemTime::now(), |mtime| mtime),
+ Err(_) => SystemTime::now(),
+ };
+
if let Some(backup) = backup {
if write_result.is_err() {
// restore backup
@@ -987,6 +993,7 @@ impl Document {
let event = DocumentSavedEvent {
revision: current_rev,
+ save_time,
doc_id,
path,
text: text.clone(),
@@ -1045,6 +1052,26 @@ impl Document {
}
}
+ pub fn pickup_last_saved_time(&mut self) {
+ self.last_saved_time = match self.path.as_mut().unwrap().metadata() {
+ Ok(metadata) => match metadata.modified() {
+ Ok(mtime) => mtime,
+ Err(_) => {
+ log::error!(
+ "Use a system time instead of fs' mtime not supported on this platform"
+ );
+ SystemTime::now()
+ }
+ },
+ Err(e) => {
+ log::error!(
+ "Use a system time instead of fs' mtime: failed to file's metadata: {e}"
+ );
+ SystemTime::now()
+ }
+ };
+ }
+
// Detect if the file is readonly and change the readonly field if necessary (unix only)
pub fn detect_readonly(&mut self) {
// Allows setting the flag for files the user cannot modify, like root files
@@ -1082,9 +1109,7 @@ impl Document {
self.apply(&transaction, view.id);
self.append_changes_to_history(view);
self.reset_modified();
-
- self.last_saved_time = SystemTime::now();
-
+ self.pickup_last_saved_time();
self.detect_indent_and_line_ending();
match provider_registry.get_diff_base(&path) {
@@ -1123,6 +1148,7 @@ impl Document {
self.path = path;
self.detect_readonly();
+ self.pickup_last_saved_time();
}
/// Set the programming language for the file and load associated data (e.g. highlighting)
@@ -1603,7 +1629,7 @@ impl Document {
}
/// Set the document's latest saved revision to the given one.
- pub fn set_last_saved_revision(&mut self, rev: usize) {
+ pub fn set_last_saved_revision(&mut self, rev: usize, save_time: SystemTime) {
log::debug!(
"doc {} revision updated {} -> {}",
self.id,
@@ -1611,7 +1637,7 @@ impl Document {
rev
);
self.last_saved_revision = rev;
- self.last_saved_time = SystemTime::now();
+ self.last_saved_time = save_time;
}
/// Get the document's latest saved revision.