Mercurial > public > mercurial-scm > hg-stable
comparison rust/hg-core/src/repo.rs @ 49680: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
49679:1891086f6c7f | 49680: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) |