We want to preserve the second-ambiguity alongside the ambiguous mtime. So we
use the decimated flag for that.
note: the C code was already doing so. No change was needed to it.
Alphare |
hg-reviewers |
We want to preserve the second-ambiguity alongside the ambiguous mtime. So we
use the decimated flag for that.
note: the C code was already doing so. No change was needed to it.
Automatic diff as part of commit; lint not applicable. |
Automatic diff as part of commit; unit tests not applicable. |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/pure/parsers.py (2 lines) | |||
M | rust/hg-core/src/dirstate/entry.rs (5 lines) | |||
M | rust/hg-core/src/dirstate_tree/on_disk.rs (3 lines) |
if self._mode is not None and self._size is not None: | if self._mode is not None and self._size is not None: | ||||
flags |= DIRSTATE_V2_HAS_MODE_AND_SIZE | flags |= DIRSTATE_V2_HAS_MODE_AND_SIZE | ||||
if self.mode & stat.S_IXUSR: | if self.mode & stat.S_IXUSR: | ||||
flags |= DIRSTATE_V2_MODE_EXEC_PERM | flags |= DIRSTATE_V2_MODE_EXEC_PERM | ||||
if stat.S_ISLNK(self.mode): | if stat.S_ISLNK(self.mode): | ||||
flags |= DIRSTATE_V2_MODE_IS_SYMLINK | flags |= DIRSTATE_V2_MODE_IS_SYMLINK | ||||
if self._mtime_s is not None: | if self._mtime_s is not None: | ||||
flags |= DIRSTATE_V2_HAS_MTIME | flags |= DIRSTATE_V2_HAS_MTIME | ||||
if self._mtime_second_ambiguous: | |||||
flags |= DIRSTATE_V2_MTIME_SECOND_AMBIGUOUS | |||||
if self._fallback_exec is not None: | if self._fallback_exec is not None: | ||||
flags |= DIRSTATE_V2_HAS_FALLBACK_EXEC | flags |= DIRSTATE_V2_HAS_FALLBACK_EXEC | ||||
if self._fallback_exec: | if self._fallback_exec: | ||||
flags |= DIRSTATE_V2_FALLBACK_EXEC | flags |= DIRSTATE_V2_FALLBACK_EXEC | ||||
if self._fallback_symlink is not None: | if self._fallback_symlink is not None: | ||||
flags |= DIRSTATE_V2_HAS_FALLBACK_SYMLINK | flags |= DIRSTATE_V2_HAS_FALLBACK_SYMLINK |
} | } | ||||
/// A Unix timestamp with nanoseconds precision | /// A Unix timestamp with nanoseconds precision | ||||
#[derive(Debug, Copy, Clone)] | #[derive(Debug, Copy, Clone)] | ||||
pub struct TruncatedTimestamp { | pub struct TruncatedTimestamp { | ||||
truncated_seconds: u32, | truncated_seconds: u32, | ||||
/// Always in the `0 .. 1_000_000_000` range. | /// Always in the `0 .. 1_000_000_000` range. | ||||
nanoseconds: u32, | nanoseconds: u32, | ||||
second_ambiguous: bool, | /// TODO this should be in DirstateEntry, but the current code needs | ||||
/// refactoring to use DirstateEntry instead of TruncatedTimestamp for | |||||
/// comparison. | |||||
pub second_ambiguous: bool, | |||||
} | } | ||||
impl TruncatedTimestamp { | impl TruncatedTimestamp { | ||||
/// Constructs from a timestamp potentially outside of the supported range, | /// Constructs from a timestamp potentially outside of the supported range, | ||||
/// and truncate the seconds components to its lower 31 bits. | /// and truncate the seconds components to its lower 31 bits. | ||||
/// | /// | ||||
/// Panics if the nanoseconds components is not in the expected range. | /// Panics if the nanoseconds components is not in the expected range. | ||||
pub fn new_truncate( | pub fn new_truncate( |
flags.set(Flags::MODE_IS_SYMLINK, is_symlink); | flags.set(Flags::MODE_IS_SYMLINK, is_symlink); | ||||
flags.insert(Flags::HAS_MODE_AND_SIZE); | flags.insert(Flags::HAS_MODE_AND_SIZE); | ||||
s.into() | s.into() | ||||
} else { | } else { | ||||
0.into() | 0.into() | ||||
}; | }; | ||||
let mtime = if let Some(m) = mtime_opt { | let mtime = if let Some(m) = mtime_opt { | ||||
flags.insert(Flags::HAS_MTIME); | flags.insert(Flags::HAS_MTIME); | ||||
if m.second_ambiguous { | |||||
flags.insert(Flags::MTIME_SECOND_AMBIGUOUS); | |||||
}; | |||||
m.into() | m.into() | ||||
} else { | } else { | ||||
PackedTruncatedTimestamp::null() | PackedTruncatedTimestamp::null() | ||||
}; | }; | ||||
if let Some(f_exec) = fallback_exec { | if let Some(f_exec) = fallback_exec { | ||||
flags.insert(Flags::HAS_FALLBACK_EXEC); | flags.insert(Flags::HAS_FALLBACK_EXEC); | ||||
if f_exec { | if f_exec { | ||||
flags.insert(Flags::FALLBACK_EXEC); | flags.insert(Flags::FALLBACK_EXEC); |