comparison rust/hg-core/src/repo.rs @ 50227:cbd4c9234e25 stable

rust-repo: move dirstate-v2 opening to a separate method The next changeset will make changes to this logic, it helps to have it in order first.
author Rapha?l Gom?s <rgomes@octobus.net>
date Tue, 28 Feb 2023 12:15:19 +0100
parents ecd28d89c29e
children fc8e37c380d3
comparison
equal deleted inserted replaced
50226:8fcd5302243a 50227:cbd4c9234e25
303 Ok(Some(docket.uuid.to_owned())) 303 Ok(Some(docket.uuid.to_owned()))
304 } 304 }
305 } 305 }
306 306
307 fn new_dirstate_map(&self) -> Result<OwningDirstateMap, DirstateError> { 307 fn new_dirstate_map(&self) -> Result<OwningDirstateMap, DirstateError> {
308 if self.has_dirstate_v2() {
309 self.read_docket_and_data_file()
310 } else {
311 let dirstate_file_contents = self.dirstate_file_contents()?;
312 if dirstate_file_contents.is_empty() {
313 self.dirstate_parents.set(DirstateParents::NULL);
314 Ok(OwningDirstateMap::new_empty(Vec::new()))
315 } else {
316 let (map, parents) =
317 OwningDirstateMap::new_v1(dirstate_file_contents)?;
318 self.dirstate_parents.set(parents);
319 Ok(map)
320 }
321 }
322 }
323
324 fn read_docket_and_data_file(
325 &self,
326 ) -> Result<OwningDirstateMap, DirstateError> {
308 let dirstate_file_contents = self.dirstate_file_contents()?; 327 let dirstate_file_contents = self.dirstate_file_contents()?;
309 if dirstate_file_contents.is_empty() { 328 if dirstate_file_contents.is_empty() {
310 self.dirstate_parents.set(DirstateParents::NULL); 329 self.dirstate_parents.set(DirstateParents::NULL);
311 if self.has_dirstate_v2() { 330 self.dirstate_data_file_uuid.set(None);
312 self.dirstate_data_file_uuid.set(None); 331 return Ok(OwningDirstateMap::new_empty(Vec::new()));
313 } 332 }
314 Ok(OwningDirstateMap::new_empty(Vec::new())) 333 let docket = crate::dirstate_tree::on_disk::read_docket(
315 } else if self.has_dirstate_v2() { 334 &dirstate_file_contents,
316 let docket = crate::dirstate_tree::on_disk::read_docket( 335 )?;
317 &dirstate_file_contents, 336 self.dirstate_parents.set(docket.parents());
318 )?; 337 self.dirstate_data_file_uuid
319 self.dirstate_parents.set(docket.parents()); 338 .set(Some(docket.uuid.to_owned()));
320 self.dirstate_data_file_uuid 339 let data_size = docket.data_size();
321 .set(Some(docket.uuid.to_owned())); 340 let metadata = docket.tree_metadata();
322 let data_size = docket.data_size(); 341 let mut map = if crate::vfs::is_on_nfs_mount(docket.data_filename()) {
323 let metadata = docket.tree_metadata(); 342 // Don't mmap on NFS to prevent `SIGBUS` error on deletion
324 let mut map = 343 OwningDirstateMap::new_v2(
325 if crate::vfs::is_on_nfs_mount(docket.data_filename()) { 344 self.hg_vfs().read(docket.data_filename())?,
326 // Don't mmap on NFS to prevent `SIGBUS` error on deletion 345 data_size,
327 OwningDirstateMap::new_v2( 346 metadata,
328 self.hg_vfs().read(docket.data_filename())?, 347 )
329 data_size, 348 } else if let Some(data_mmap) = self
330 metadata, 349 .hg_vfs()
331 ) 350 .mmap_open(docket.data_filename())
332 } else if let Some(data_mmap) = self 351 .io_not_found_as_none()?
333 .hg_vfs() 352 {
334 .mmap_open(docket.data_filename()) 353 OwningDirstateMap::new_v2(data_mmap, data_size, metadata)
335 .io_not_found_as_none()? 354 } else {
336 { 355 OwningDirstateMap::new_v2(Vec::new(), data_size, metadata)
337 OwningDirstateMap::new_v2(data_mmap, data_size, metadata) 356 }?;
338 } else { 357
339 OwningDirstateMap::new_v2(Vec::new(), data_size, metadata) 358 let write_mode_config = self
340 }?; 359 .config()
341 360 .get_str(b"devel", b"dirstate.v2.data_update_mode")
342 let write_mode_config = self 361 .unwrap_or(Some("auto"))
343 .config() 362 .unwrap_or("auto"); // don't bother for devel options
344 .get_str(b"devel", b"dirstate.v2.data_update_mode") 363 let write_mode = match write_mode_config {
345 .unwrap_or(Some("auto")) 364 "auto" => DirstateMapWriteMode::Auto,
346 .unwrap_or("auto"); // don't bother for devel options 365 "force-new" => DirstateMapWriteMode::ForceNewDataFile,
347 let write_mode = match write_mode_config { 366 "force-append" => DirstateMapWriteMode::ForceAppend,
348 "auto" => DirstateMapWriteMode::Auto, 367 _ => DirstateMapWriteMode::Auto,
349 "force-new" => DirstateMapWriteMode::ForceNewDataFile, 368 };
350 "force-append" => DirstateMapWriteMode::ForceAppend, 369
351 _ => DirstateMapWriteMode::Auto, 370 map.with_dmap_mut(|m| m.set_write_mode(write_mode));
352 }; 371
353 372 Ok(map)
354 map.with_dmap_mut(|m| m.set_write_mode(write_mode));
355
356 Ok(map)
357 } else {
358 let (map, parents) =
359 OwningDirstateMap::new_v1(dirstate_file_contents)?;
360 self.dirstate_parents.set(parents);
361 Ok(map)
362 }
363 } 373 }
364 374
365 pub fn dirstate_map( 375 pub fn dirstate_map(
366 &self, 376 &self,
367 ) -> Result<Ref<OwningDirstateMap>, DirstateError> { 377 ) -> Result<Ref<OwningDirstateMap>, DirstateError> {