Mercurial > public > mercurial-scm > hg-stable
diff rust/hg-core/src/dirstate/entry.rs @ 48206:1000db4a71f1
dirstate-v2: Store unsigned integers inside DirstateEntry
The negative marker values are not used anymore.
Differential Revision: https://phab.mercurial-scm.org/D11634
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 11 Oct 2021 18:37:21 +0200 |
parents | 320de901896a |
children | 15dedc0c5c35 |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate/entry.rs Tue Oct 12 16:38:13 2021 +0200 +++ b/rust/hg-core/src/dirstate/entry.rs Mon Oct 11 18:37:21 2021 +0200 @@ -18,8 +18,8 @@ #[derive(Debug, PartialEq, Copy, Clone)] pub struct DirstateEntry { pub(crate) flags: Flags, - mode_size: Option<(i32, i32)>, - mtime: Option<i32>, + mode_size: Option<(u32, u32)>, + mtime: Option<u32>, } bitflags! { @@ -153,9 +153,17 @@ wdir_tracked: bool, p1_tracked: bool, p2_info: bool, - mode_size: Option<(i32, i32)>, - mtime: Option<i32>, + mode_size: Option<(u32, u32)>, + mtime: Option<u32>, ) -> Self { + if let Some((mode, size)) = mode_size { + // TODO: return an error for out of range values? + assert!(mode & !RANGE_MASK_31BIT == 0); + assert!(size & !RANGE_MASK_31BIT == 0); + } + if let Some(mtime) = mtime { + assert!(mtime & !RANGE_MASK_31BIT == 0); + } let mut flags = Flags::empty(); flags.set(Flags::WDIR_TRACKED, wdir_tracked); flags.set(Flags::P1_TRACKED, p1_tracked); @@ -189,12 +197,19 @@ mtime: None, } } else if mtime == MTIME_UNSET { + // TODO: return an error for negative values? + let mode = u32::try_from(mode).unwrap(); + let size = u32::try_from(size).unwrap(); Self { flags: Flags::WDIR_TRACKED | Flags::P1_TRACKED, mode_size: Some((mode, size)), mtime: None, } } else { + // TODO: return an error for negative values? + let mode = u32::try_from(mode).unwrap(); + let size = u32::try_from(size).unwrap(); + let mtime = u32::try_from(mtime).unwrap(); Self { flags: Flags::WDIR_TRACKED | Flags::P1_TRACKED, mode_size: Some((mode, size)), @@ -282,7 +297,7 @@ /// Returns `(wdir_tracked, p1_tracked, p2_info, mode_size, mtime)` pub(crate) fn v2_data( &self, - ) -> (bool, bool, bool, Option<(i32, i32)>, Option<i32>) { + ) -> (bool, bool, bool, Option<(u32, u32)>, Option<u32>) { if !self.any_tracked() { // TODO: return an Option instead? panic!("Accessing v1_state of an untracked DirstateEntry") @@ -316,7 +331,7 @@ fn v1_mode(&self) -> i32 { if let Some((mode, _size)) = self.mode_size { - mode + i32::try_from(mode).unwrap() } else { 0 } @@ -338,7 +353,7 @@ } else if self.added() { SIZE_NON_NORMAL } else if let Some((_mode, size)) = self.mode_size { - size + i32::try_from(size).unwrap() } else { SIZE_NON_NORMAL } @@ -355,8 +370,10 @@ MTIME_UNSET } else if !self.flags.contains(Flags::P1_TRACKED) { MTIME_UNSET + } else if let Some(mtime) = self.mtime { + i32::try_from(mtime).unwrap() } else { - self.mtime.unwrap_or(MTIME_UNSET) + MTIME_UNSET } } @@ -392,7 +409,9 @@ self.mtime = None } - pub fn set_clean(&mut self, mode: i32, size: i32, mtime: i32) { + pub fn set_clean(&mut self, mode: u32, size: u32, mtime: u32) { + let size = size & RANGE_MASK_31BIT; + let mtime = mtime & RANGE_MASK_31BIT; self.flags.insert(Flags::WDIR_TRACKED | Flags::P1_TRACKED); self.mode_size = Some((mode, size)); self.mtime = Some(mtime);