comparison rust/hg-core/src/dirstate/status.rs @ 47347:73ddcedeaadf

dirstate-tree: Change status() results to not borrow DirstateMap The `status` function takes a `&'tree mut DirstateMap<'on_disk>` parameter. `'on_disk` borrows a read-only byte buffer with the contents of the `.hg/dirstate` file. `DirstateMap` internally uses represents file paths as `std::borrow::Cow<'on_disk, HgPath>`, which borrows the byte buffer when possible and allocates an owned string if not, such as for files added to the dirstate after it was loaded from disk. Previously the return type of of `status` has a `'tree` lifetime, meaning it could borrow all paths from the `DirstateMap`. With this changeset, that lifetime is changed to `'on_disk` meaning that only paths from the byte buffer can be borrowed, and paths allocated by `DirstateMap` must be copied. Usually most paths are in the byte buffer, and most paths are not part of the return value of `status`, so the number of extra copies should be small. This change will enable `status` to mutate the `DirstateMap` after it has finished constructing its return value. Previously such mutation would be prevented by possible on-going borrows. Differential Revision: https://phab.mercurial-scm.org/D10824
author Simon Sapin <simon.sapin@octobus.net>
date Fri, 28 May 2021 20:07:27 +0200
parents ed1583a845d2
children 04d1f17f49e7
comparison
equal deleted inserted replaced
47346:5e12b6bfdd3e 47347:73ddcedeaadf
290 /// alone. The file contents need to be read and compared with that in 290 /// alone. The file contents need to be read and compared with that in
291 /// the parent. 291 /// the parent.
292 pub unsure: Vec<HgPathCow<'a>>, 292 pub unsure: Vec<HgPathCow<'a>>,
293 293
294 /// Only filled if `collect_traversed_dirs` is `true` 294 /// Only filled if `collect_traversed_dirs` is `true`
295 pub traversed: Vec<HgPathBuf>, 295 pub traversed: Vec<HgPathCow<'a>>,
296 } 296 }
297 297
298 #[derive(Debug, derive_more::From)] 298 #[derive(Debug, derive_more::From)]
299 pub enum StatusError { 299 pub enum StatusError {
300 /// Generic IO error 300 /// Generic IO error
878 } 878 }
879 879
880 #[timed] 880 #[timed]
881 pub fn build_response<'a>( 881 pub fn build_response<'a>(
882 results: impl IntoIterator<Item = DispatchedPath<'a>>, 882 results: impl IntoIterator<Item = DispatchedPath<'a>>,
883 traversed: Vec<HgPathBuf>, 883 traversed: Vec<HgPathCow<'a>>,
884 ) -> DirstateStatus<'a> { 884 ) -> DirstateStatus<'a> {
885 let mut unsure = vec![]; 885 let mut unsure = vec![];
886 let mut modified = vec![]; 886 let mut modified = vec![];
887 let mut added = vec![]; 887 let mut added = vec![];
888 let mut removed = vec![]; 888 let mut removed = vec![];