Mercurial > public > mercurial-scm > hg-stable
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 } |