comparison rust/hg-core/src/dirstate_tree/status.rs @ 48260:269ff8978086

dirstate: store mtimes with nanosecond precision in memory Keep integer seconds since the Unix epoch, together with integer nanoseconds in the `0 <= n < 1e9` range. For now, nanoseconds are still always zero. This commit is about data structure changes. Differential Revision: https://phab.mercurial-scm.org/D11684
author Simon Sapin <simon.sapin@octobus.net>
date Mon, 18 Oct 2021 11:23:07 +0200
parents f45d35950db6
children 83d0bd45b662
comparison
equal deleted inserted replaced
48259:84f6b0c41b90 48260:269ff8978086
499 ) -> Result<(), DirstateV2ParseError> { 499 ) -> Result<(), DirstateV2ParseError> {
500 // Keep the low 31 bits 500 // Keep the low 31 bits
501 fn truncate_u64(value: u64) -> i32 { 501 fn truncate_u64(value: u64) -> i32 {
502 (value & 0x7FFF_FFFF) as i32 502 (value & 0x7FFF_FFFF) as i32
503 } 503 }
504 fn truncate_i64(value: i64) -> i32 {
505 (value & 0x7FFF_FFFF) as i32
506 }
507 504
508 let entry = dirstate_node 505 let entry = dirstate_node
509 .entry()? 506 .entry()?
510 .expect("handle_normal_file called with entry-less node"); 507 .expect("handle_normal_file called with entry-less node");
511 let hg_path = &dirstate_node.full_path_borrowed(self.dmap.on_disk)?; 508 let hg_path = &dirstate_node.full_path_borrowed(self.dmap.on_disk)?;
529 .lock() 526 .lock()
530 .unwrap() 527 .unwrap()
531 .modified 528 .modified
532 .push(hg_path.detach_from_tree()) 529 .push(hg_path.detach_from_tree())
533 } else { 530 } else {
534 let mtime = mtime_seconds(fs_metadata); 531 let mtime_looks_clean;
535 if truncate_i64(mtime) != entry.mtime() 532 if let Some(dirstate_mtime) = entry.truncated_mtime() {
536 || mtime == self.options.last_normal_time 533 let fs_mtime = TruncatedTimestamp::for_mtime_of(fs_metadata)
537 { 534 .expect("OS/libc does not support mtime?")
535 // For now don’t use sub-second precision for file mtimes
536 .to_integer_second();
537 mtime_looks_clean = fs_mtime.likely_equal(dirstate_mtime)
538 && !fs_mtime.likely_equal(self.options.last_normal_time)
539 } else {
540 // No mtime in the dirstate entry
541 mtime_looks_clean = false
542 };
543 if !mtime_looks_clean {
538 self.outcome 544 self.outcome
539 .lock() 545 .lock()
540 .unwrap() 546 .unwrap()
541 .unsure 547 .unsure
542 .push(hg_path.detach_from_tree()) 548 .push(hg_path.detach_from_tree())
688 } 694 }
689 is_ignored 695 is_ignored
690 } 696 }
691 } 697 }
692 698
693 #[cfg(unix)] // TODO
694 fn mtime_seconds(metadata: &std::fs::Metadata) -> i64 {
695 // Going through `Metadata::modified()` would be portable, but would take
696 // care to construct a `SystemTime` value with sub-second precision just
697 // for us to throw that away here.
698 use std::os::unix::fs::MetadataExt;
699 metadata.mtime()
700 }
701
702 struct DirEntry { 699 struct DirEntry {
703 base_name: HgPathBuf, 700 base_name: HgPathBuf,
704 full_path: PathBuf, 701 full_path: PathBuf,
705 metadata: std::fs::Metadata, 702 metadata: std::fs::Metadata,
706 } 703 }