Show More
@@ -61,7 +61,7 b' struct DocketHeader {' | |||
|
61 | 61 | |
|
62 | 62 | pub struct Docket<'on_disk> { |
|
63 | 63 | header: &'on_disk DocketHeader, |
|
64 | uuid: &'on_disk [u8], | |
|
64 | pub uuid: &'on_disk [u8], | |
|
65 | 65 | } |
|
66 | 66 | |
|
67 | 67 | /// Fields are documented in the *Tree metadata in the docket file* |
@@ -28,6 +28,7 b' pub struct Repo {' | |||
|
28 | 28 | requirements: HashSet<String>, |
|
29 | 29 | config: Config, |
|
30 | 30 | dirstate_parents: LazyCell<DirstateParents, HgError>, |
|
31 | dirstate_data_file_uuid: LazyCell<Option<Vec<u8>>, HgError>, | |
|
31 | 32 | dirstate_map: LazyCell<OwningDirstateMap, DirstateError>, |
|
32 | 33 | changelog: LazyCell<Changelog, HgError>, |
|
33 | 34 | manifestlog: LazyCell<Manifestlog, HgError>, |
@@ -203,6 +204,9 b' impl Repo {' | |||
|
203 | 204 | dot_hg, |
|
204 | 205 | config: repo_config, |
|
205 | 206 | dirstate_parents: LazyCell::new(Self::read_dirstate_parents), |
|
207 | dirstate_data_file_uuid: LazyCell::new( | |
|
208 | Self::read_dirstate_data_file_uuid, | |
|
209 | ), | |
|
206 | 210 | dirstate_map: LazyCell::new(Self::new_dirstate_map), |
|
207 | 211 | changelog: LazyCell::new(Changelog::open), |
|
208 | 212 | manifestlog: LazyCell::new(Manifestlog::open), |
@@ -278,9 +282,16 b' impl Repo {' | |||
|
278 | 282 | fn read_dirstate_parents(&self) -> Result<DirstateParents, HgError> { |
|
279 | 283 | let dirstate = self.dirstate_file_contents()?; |
|
280 | 284 | let parents = if dirstate.is_empty() { |
|
285 | if self.has_dirstate_v2() { | |
|
286 | self.dirstate_data_file_uuid.set(None); | |
|
287 | } | |
|
281 | 288 | DirstateParents::NULL |
|
282 | 289 | } else if self.has_dirstate_v2() { |
|
283 | crate::dirstate_tree::on_disk::read_docket(&dirstate)?.parents() | |
|
290 | let docket = | |
|
291 | crate::dirstate_tree::on_disk::read_docket(&dirstate)?; | |
|
292 | self.dirstate_data_file_uuid | |
|
293 | .set(Some(docket.uuid.to_owned())); | |
|
294 | docket.parents() | |
|
284 | 295 | } else { |
|
285 | 296 | crate::dirstate::parsers::parse_dirstate_parents(&dirstate)? |
|
286 | 297 | .clone() |
@@ -289,16 +300,40 b' impl Repo {' | |||
|
289 | 300 | Ok(parents) |
|
290 | 301 | } |
|
291 | 302 | |
|
303 | fn read_dirstate_data_file_uuid( | |
|
304 | &self, | |
|
305 | ) -> Result<Option<Vec<u8>>, HgError> { | |
|
306 | assert!( | |
|
307 | self.has_dirstate_v2(), | |
|
308 | "accessing dirstate data file ID without dirstate-v2" | |
|
309 | ); | |
|
310 | let dirstate = self.dirstate_file_contents()?; | |
|
311 | if dirstate.is_empty() { | |
|
312 | self.dirstate_parents.set(DirstateParents::NULL); | |
|
313 | Ok(None) | |
|
314 | } else { | |
|
315 | let docket = | |
|
316 | crate::dirstate_tree::on_disk::read_docket(&dirstate)?; | |
|
317 | self.dirstate_parents.set(docket.parents()); | |
|
318 | Ok(Some(docket.uuid.to_owned())) | |
|
319 | } | |
|
320 | } | |
|
321 | ||
|
292 | 322 | fn new_dirstate_map(&self) -> Result<OwningDirstateMap, DirstateError> { |
|
293 | 323 | let dirstate_file_contents = self.dirstate_file_contents()?; |
|
294 | 324 | if dirstate_file_contents.is_empty() { |
|
295 | 325 | self.dirstate_parents.set(DirstateParents::NULL); |
|
326 | if self.has_dirstate_v2() { | |
|
327 | self.dirstate_data_file_uuid.set(None); | |
|
328 | } | |
|
296 | 329 | Ok(OwningDirstateMap::new_empty(Vec::new())) |
|
297 | 330 | } else if self.has_dirstate_v2() { |
|
298 | 331 | let docket = crate::dirstate_tree::on_disk::read_docket( |
|
299 | 332 | &dirstate_file_contents, |
|
300 | 333 | )?; |
|
301 | 334 | self.dirstate_parents.set(docket.parents()); |
|
335 | self.dirstate_data_file_uuid | |
|
336 | .set(Some(docket.uuid.to_owned())); | |
|
302 | 337 | let data_size = docket.data_size(); |
|
303 | 338 | let metadata = docket.tree_metadata(); |
|
304 | 339 | let mut map = if let Some(data_mmap) = self |
General Comments 0
You need to be logged in to leave comments.
Login now