--- a/rust/hg-core/src/repo.rs Fri Feb 24 18:21:54 2023 +0100
+++ b/rust/hg-core/src/repo.rs Tue Feb 28 15:49:53 2023 +0100
@@ -321,22 +321,39 @@
.set(Some(docket.uuid.to_owned()));
let data_size = docket.data_size();
let metadata = docket.tree_metadata();
- if crate::vfs::is_on_nfs_mount(docket.data_filename()) {
- // Don't mmap on NFS to prevent `SIGBUS` error on deletion
- OwningDirstateMap::new_v2(
- self.hg_vfs().read(docket.data_filename())?,
- data_size,
- metadata,
- )
- } else if let Some(data_mmap) = self
- .hg_vfs()
- .mmap_open(docket.data_filename())
- .io_not_found_as_none()?
- {
- OwningDirstateMap::new_v2(data_mmap, data_size, metadata)
- } else {
- OwningDirstateMap::new_v2(Vec::new(), data_size, metadata)
- }
+ let mut map =
+ if crate::vfs::is_on_nfs_mount(docket.data_filename()) {
+ // Don't mmap on NFS to prevent `SIGBUS` error on deletion
+ OwningDirstateMap::new_v2(
+ self.hg_vfs().read(docket.data_filename())?,
+ data_size,
+ metadata,
+ )
+ } else if let Some(data_mmap) = self
+ .hg_vfs()
+ .mmap_open(docket.data_filename())
+ .io_not_found_as_none()?
+ {
+ OwningDirstateMap::new_v2(data_mmap, data_size, metadata)
+ } else {
+ OwningDirstateMap::new_v2(Vec::new(), data_size, metadata)
+ }?;
+
+ let write_mode_config = self
+ .config()
+ .get_str(b"devel", b"dirstate.v2.data_update_mode")
+ .unwrap_or(Some("auto"))
+ .unwrap_or("auto"); // don't bother for devel options
+ let write_mode = match write_mode_config {
+ "auto" => DirstateMapWriteMode::Auto,
+ "force-new" => DirstateMapWriteMode::ForceNewDataFile,
+ "force-append" => DirstateMapWriteMode::ForceAppend,
+ _ => DirstateMapWriteMode::Auto,
+ };
+
+ map.with_dmap_mut(|m| m.set_write_mode(write_mode));
+
+ Ok(map)
} else {
let (map, parents) =
OwningDirstateMap::new_v1(dirstate_file_contents)?;