comparison rust/hg-core/src/dirstate_tree/owning.rs @ 49703:dbe09fb038fc stable

rhg: remember the inode of .hg/dirstate This allows us to detect changes of `.hg/dirstate`, which is either the full dirstate (in dirstate-v1) or the docket file (v2) without relying on data inside the file. It only works on UNIX systems. This fixes a race condition for dirstate-v1 (as demonstrated by the test changes) and adds a confortable layer of sanity for dirstate-v2.
author Rapha?l Gom?s <rgomes@octobus.net>
date Wed, 01 Mar 2023 16:48:09 +0100
parents 6cce0afc1454
children a6b8b1ab9116
comparison
equal deleted inserted replaced
49702:07d030b38097 49703:dbe09fb038fc
29 .build() 29 .build()
30 } 30 }
31 31
32 pub fn new_v1<OnDisk>( 32 pub fn new_v1<OnDisk>(
33 on_disk: OnDisk, 33 on_disk: OnDisk,
34 identity: Option<u64>,
34 ) -> Result<(Self, DirstateParents), DirstateError> 35 ) -> Result<(Self, DirstateParents), DirstateError>
35 where 36 where
36 OnDisk: Deref<Target = [u8]> + Send + 'static, 37 OnDisk: Deref<Target = [u8]> + Send + 'static,
37 { 38 {
38 let on_disk = Box::new(on_disk); 39 let on_disk = Box::new(on_disk);
40 41
41 Ok(( 42 Ok((
42 OwningDirstateMapTryBuilder { 43 OwningDirstateMapTryBuilder {
43 on_disk, 44 on_disk,
44 map_builder: |bytes| { 45 map_builder: |bytes| {
45 DirstateMap::new_v1(&bytes).map(|(dmap, p)| { 46 DirstateMap::new_v1(&bytes, identity).map(|(dmap, p)| {
46 parents = p.unwrap_or(DirstateParents::NULL); 47 parents = p.unwrap_or(DirstateParents::NULL);
47 dmap 48 dmap
48 }) 49 })
49 }, 50 },
50 } 51 }
56 pub fn new_v2<OnDisk>( 57 pub fn new_v2<OnDisk>(
57 on_disk: OnDisk, 58 on_disk: OnDisk,
58 data_size: usize, 59 data_size: usize,
59 metadata: &[u8], 60 metadata: &[u8],
60 uuid: Vec<u8>, 61 uuid: Vec<u8>,
62 identity: Option<u64>,
61 ) -> Result<Self, DirstateError> 63 ) -> Result<Self, DirstateError>
62 where 64 where
63 OnDisk: Deref<Target = [u8]> + Send + 'static, 65 OnDisk: Deref<Target = [u8]> + Send + 'static,
64 { 66 {
65 let on_disk = Box::new(on_disk); 67 let on_disk = Box::new(on_disk);
66 68
67 OwningDirstateMapTryBuilder { 69 OwningDirstateMapTryBuilder {
68 on_disk, 70 on_disk,
69 map_builder: |bytes| { 71 map_builder: |bytes| {
70 DirstateMap::new_v2(&bytes, data_size, metadata, uuid) 72 DirstateMap::new_v2(
73 &bytes, data_size, metadata, uuid, identity,
74 )
71 }, 75 },
72 } 76 }
73 .try_build() 77 .try_build()
74 } 78 }
75 79
90 94
91 pub fn old_uuid(&self) -> Option<&[u8]> { 95 pub fn old_uuid(&self) -> Option<&[u8]> {
92 self.get_map().old_uuid.as_deref() 96 self.get_map().old_uuid.as_deref()
93 } 97 }
94 98
99 pub fn old_identity(&self) -> Option<u64> {
100 self.get_map().identity
101 }
102
95 pub fn old_data_size(&self) -> usize { 103 pub fn old_data_size(&self) -> usize {
96 self.get_map().old_data_size 104 self.get_map().old_data_size
97 } 105 }
98 } 106 }