Mercurial > hg
comparison rust/hg-core/src/dirstate/entry.rs @ 48043:3e69bef2031a
rust: Add Python bindings for DirstateEntry as rustext.dirstate.DirstateItem
Differential Revision: https://phab.mercurial-scm.org/D11485
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Wed, 22 Sep 2021 11:28:52 +0200 |
parents | 008959fcbfb2 |
children | 98c0408324e6 |
comparison
equal
deleted
inserted
replaced
48042:008959fcbfb2 | 48043:3e69bef2031a |
---|---|
20 size: i32, | 20 size: i32, |
21 mtime: i32, | 21 mtime: i32, |
22 } | 22 } |
23 | 23 |
24 bitflags! { | 24 bitflags! { |
25 struct Flags: u8 { | 25 pub struct Flags: u8 { |
26 const WDIR_TRACKED = 1 << 0; | 26 const WDIR_TRACKED = 1 << 0; |
27 const P1_TRACKED = 1 << 1; | 27 const P1_TRACKED = 1 << 1; |
28 const P2_TRACKED = 1 << 2; | 28 const P2_TRACKED = 1 << 2; |
29 const POSSIBLY_DIRTY = 1 << 3; | 29 const POSSIBLY_DIRTY = 1 << 3; |
30 const MERGED = 1 << 4; | 30 const MERGED = 1 << 4; |
45 /// A special value used for internal representation of special case in | 45 /// A special value used for internal representation of special case in |
46 /// dirstate v1 format. | 46 /// dirstate v1 format. |
47 pub const SIZE_NON_NORMAL: i32 = -1; | 47 pub const SIZE_NON_NORMAL: i32 = -1; |
48 | 48 |
49 impl DirstateEntry { | 49 impl DirstateEntry { |
50 pub fn new( | |
51 flags: Flags, | |
52 mode_size_mtime: Option<(i32, i32, i32)>, | |
53 ) -> Self { | |
54 let (mode, size, mtime) = | |
55 mode_size_mtime.unwrap_or((0, SIZE_NON_NORMAL, MTIME_UNSET)); | |
56 Self { | |
57 flags, | |
58 mode, | |
59 size, | |
60 mtime, | |
61 } | |
62 } | |
63 | |
50 pub fn from_v1_data( | 64 pub fn from_v1_data( |
51 state: EntryState, | 65 state: EntryState, |
52 mode: i32, | 66 mode: i32, |
53 size: i32, | 67 size: i32, |
54 mtime: i32, | 68 mtime: i32, |
153 // XXX Arbitrary default value since the value is determined later | 167 // XXX Arbitrary default value since the value is determined later |
154 let state = EntryState::Normal; | 168 let state = EntryState::Normal; |
155 Self::from_v1_data(state, mode, size, mtime) | 169 Self::from_v1_data(state, mode, size, mtime) |
156 } | 170 } |
157 | 171 |
172 pub fn tracked(&self) -> bool { | |
173 self.flags.contains(Flags::WDIR_TRACKED) | |
174 } | |
175 | |
158 fn tracked_in_any_parent(&self) -> bool { | 176 fn tracked_in_any_parent(&self) -> bool { |
159 self.flags.intersects(Flags::P1_TRACKED | Flags::P2_TRACKED) | 177 self.flags.intersects(Flags::P1_TRACKED | Flags::P2_TRACKED) |
160 } | 178 } |
161 | 179 |
162 fn removed(&self) -> bool { | 180 pub fn removed(&self) -> bool { |
163 self.tracked_in_any_parent() | 181 self.tracked_in_any_parent() |
164 && !self.flags.contains(Flags::WDIR_TRACKED) | 182 && !self.flags.contains(Flags::WDIR_TRACKED) |
165 } | 183 } |
166 | 184 |
167 fn merged_removed(&self) -> bool { | 185 pub fn merged_removed(&self) -> bool { |
168 self.removed() && self.flags.contains(Flags::MERGED) | 186 self.removed() && self.flags.contains(Flags::MERGED) |
169 } | 187 } |
170 | 188 |
171 fn from_p2_removed(&self) -> bool { | 189 pub fn from_p2_removed(&self) -> bool { |
172 self.removed() && self.flags.contains(Flags::CLEAN_P2) | 190 self.removed() && self.flags.contains(Flags::CLEAN_P2) |
173 } | 191 } |
174 | 192 |
175 fn merged(&self) -> bool { | 193 pub fn merged(&self) -> bool { |
176 self.flags.contains(Flags::WDIR_TRACKED | Flags::MERGED) | 194 self.flags.contains(Flags::WDIR_TRACKED | Flags::MERGED) |
177 } | 195 } |
178 | 196 |
179 fn added(&self) -> bool { | 197 pub fn added(&self) -> bool { |
180 self.flags.contains(Flags::WDIR_TRACKED) | 198 self.flags.contains(Flags::WDIR_TRACKED) |
181 && !self.tracked_in_any_parent() | 199 && !self.tracked_in_any_parent() |
182 } | 200 } |
183 | 201 |
184 fn from_p2(&self) -> bool { | 202 pub fn from_p2(&self) -> bool { |
185 self.flags.contains(Flags::WDIR_TRACKED | Flags::CLEAN_P2) | 203 self.flags.contains(Flags::WDIR_TRACKED | Flags::CLEAN_P2) |
186 } | 204 } |
187 | 205 |
188 pub fn state(&self) -> EntryState { | 206 pub fn state(&self) -> EntryState { |
189 if self.removed() { | 207 if self.removed() { |
235 } else { | 253 } else { |
236 self.mtime | 254 self.mtime |
237 } | 255 } |
238 } | 256 } |
239 | 257 |
258 pub fn set_possibly_dirty(&mut self) { | |
259 self.flags.insert(Flags::POSSIBLY_DIRTY) | |
260 } | |
261 | |
262 pub fn set_clean(&mut self, mode: i32, size: i32, mtime: i32) { | |
263 self.flags.insert(Flags::WDIR_TRACKED | Flags::P1_TRACKED); | |
264 self.flags.remove( | |
265 Flags::P2_TRACKED // This might be wrong | |
266 | Flags::MERGED | |
267 | Flags::CLEAN_P2 | |
268 | Flags::POSSIBLY_DIRTY, | |
269 ); | |
270 self.mode = mode; | |
271 self.size = size; | |
272 self.mtime = mtime; | |
273 } | |
274 | |
275 pub fn set_tracked(&mut self) { | |
276 self.flags | |
277 .insert(Flags::WDIR_TRACKED | Flags::POSSIBLY_DIRTY); | |
278 // size = None on the python size turn into size = NON_NORMAL when | |
279 // accessed. So the next line is currently required, but a some future | |
280 // clean up would be welcome. | |
281 self.size = SIZE_NON_NORMAL; | |
282 } | |
283 | |
284 pub fn set_untracked(&mut self) { | |
285 self.flags.remove(Flags::WDIR_TRACKED); | |
286 self.mode = 0; | |
287 self.size = 0; | |
288 self.mtime = 0; | |
289 } | |
290 | |
240 /// Returns `(state, mode, size, mtime)` for the puprose of serialization | 291 /// Returns `(state, mode, size, mtime)` for the puprose of serialization |
241 /// in the dirstate-v1 format. | 292 /// in the dirstate-v1 format. |
242 /// | 293 /// |
243 /// This includes marker values such as `mtime == -1`. In the future we may | 294 /// This includes marker values such as `mtime == -1`. In the future we may |
244 /// want to not represent these cases that way in memory, but serialization | 295 /// want to not represent these cases that way in memory, but serialization |