@ -106,6 +106,7 @@ impl Serialize for Mode {
#[ derive(Debug, Clone) ]
#[ derive(Debug, Clone) ]
pub struct DocumentSavedEvent {
pub struct DocumentSavedEvent {
pub revision : usize ,
pub revision : usize ,
pub save_time : SystemTime ,
pub doc_id : DocumentId ,
pub doc_id : DocumentId ,
pub path : PathBuf ,
pub path : PathBuf ,
pub text : Rope ,
pub text : Rope ,
@ -965,6 +966,11 @@ impl Document {
}
}
. await ;
. 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 let Some ( backup ) = backup {
if write_result . is_err ( ) {
if write_result . is_err ( ) {
// restore backup
// restore backup
@ -987,6 +993,7 @@ impl Document {
let event = DocumentSavedEvent {
let event = DocumentSavedEvent {
revision : current_rev ,
revision : current_rev ,
save_time ,
doc_id ,
doc_id ,
path ,
path ,
text : text . clone ( ) ,
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)
// Detect if the file is readonly and change the readonly field if necessary (unix only)
pub fn detect_readonly ( & mut self ) {
pub fn detect_readonly ( & mut self ) {
// Allows setting the flag for files the user cannot modify, like root files
// 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 . apply ( & transaction , view . id ) ;
self . append_changes_to_history ( view ) ;
self . append_changes_to_history ( view ) ;
self . reset_modified ( ) ;
self . reset_modified ( ) ;
self . pickup_last_saved_time ( ) ;
self . last_saved_time = SystemTime ::now ( ) ;
self . detect_indent_and_line_ending ( ) ;
self . detect_indent_and_line_ending ( ) ;
match provider_registry . get_diff_base ( & path ) {
match provider_registry . get_diff_base ( & path ) {
@ -1123,6 +1148,7 @@ impl Document {
self . path = path ;
self . path = path ;
self . detect_readonly ( ) ;
self . detect_readonly ( ) ;
self . pickup_last_saved_time ( ) ;
}
}
/// Set the programming language for the file and load associated data (e.g. highlighting)
/// 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.
/// 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 ! (
log ::debug ! (
"doc {} revision updated {} -> {}" ,
"doc {} revision updated {} -> {}" ,
self . id ,
self . id ,
@ -1611,7 +1637,7 @@ impl Document {
rev
rev
) ;
) ;
self . last_saved_revision = rev ;
self . last_saved_revision = rev ;
self . last_saved_time = Sy stemT ime::now ( ) ;
self . last_saved_time = save_ time;
}
}
/// Get the document's latest saved revision.
/// Get the document's latest saved revision.