comparison rust/hg-core/src/repo.rs @ 50222:ecd28d89c29e stable

dirstate-v2: add devel config option to control write behavior This will help us to write predictable tests checking behavior in each case.
author Raphaël Gomès <rgomes@octobus.net>
date Tue, 28 Feb 2023 15:49:53 +0100
parents 1891086f6c7f
children cbd4c9234e25
comparison
equal deleted inserted replaced
50221:1891086f6c7f 50222:ecd28d89c29e
319 self.dirstate_parents.set(docket.parents()); 319 self.dirstate_parents.set(docket.parents());
320 self.dirstate_data_file_uuid 320 self.dirstate_data_file_uuid
321 .set(Some(docket.uuid.to_owned())); 321 .set(Some(docket.uuid.to_owned()));
322 let data_size = docket.data_size(); 322 let data_size = docket.data_size();
323 let metadata = docket.tree_metadata(); 323 let metadata = docket.tree_metadata();
324 if crate::vfs::is_on_nfs_mount(docket.data_filename()) { 324 let mut map =
325 // Don't mmap on NFS to prevent `SIGBUS` error on deletion 325 if crate::vfs::is_on_nfs_mount(docket.data_filename()) {
326 OwningDirstateMap::new_v2( 326 // Don't mmap on NFS to prevent `SIGBUS` error on deletion
327 self.hg_vfs().read(docket.data_filename())?, 327 OwningDirstateMap::new_v2(
328 data_size, 328 self.hg_vfs().read(docket.data_filename())?,
329 metadata, 329 data_size,
330 ) 330 metadata,
331 } else if let Some(data_mmap) = self 331 )
332 .hg_vfs() 332 } else if let Some(data_mmap) = self
333 .mmap_open(docket.data_filename()) 333 .hg_vfs()
334 .io_not_found_as_none()? 334 .mmap_open(docket.data_filename())
335 { 335 .io_not_found_as_none()?
336 OwningDirstateMap::new_v2(data_mmap, data_size, metadata) 336 {
337 } else { 337 OwningDirstateMap::new_v2(data_mmap, data_size, metadata)
338 OwningDirstateMap::new_v2(Vec::new(), data_size, metadata) 338 } else {
339 } 339 OwningDirstateMap::new_v2(Vec::new(), data_size, metadata)
340 }?;
341
342 let write_mode_config = self
343 .config()
344 .get_str(b"devel", b"dirstate.v2.data_update_mode")
345 .unwrap_or(Some("auto"))
346 .unwrap_or("auto"); // don't bother for devel options
347 let write_mode = match write_mode_config {
348 "auto" => DirstateMapWriteMode::Auto,
349 "force-new" => DirstateMapWriteMode::ForceNewDataFile,
350 "force-append" => DirstateMapWriteMode::ForceAppend,
351 _ => DirstateMapWriteMode::Auto,
352 };
353
354 map.with_dmap_mut(|m| m.set_write_mode(write_mode));
355
356 Ok(map)
340 } else { 357 } else {
341 let (map, parents) = 358 let (map, parents) =
342 OwningDirstateMap::new_v1(dirstate_file_contents)?; 359 OwningDirstateMap::new_v1(dirstate_file_contents)?;
343 self.dirstate_parents.set(parents); 360 self.dirstate_parents.set(parents);
344 Ok(map) 361 Ok(map)