diff rust/hg-cpython/src/dirstate/dirstate_map.rs @ 50245: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
line wrap: on
line diff
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs	Tue Feb 28 17:58:15 2023 +0100
+++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs	Wed Mar 01 16:48:09 2023 +0100
@@ -49,9 +49,10 @@
     @staticmethod
     def new_v1(
         on_disk: PyBytes,
+        identity: Option<u64>,
     ) -> PyResult<PyObject> {
         let on_disk = PyBytesDeref::new(py, on_disk);
-        let (map, parents) = OwningDirstateMap::new_v1(on_disk)
+        let (map, parents) = OwningDirstateMap::new_v1(on_disk, identity)
             .map_err(|e| dirstate_error(py, e))?;
         let map = Self::create_instance(py, map)?;
         let p1 = PyBytes::new(py, parents.p1.as_bytes());
@@ -67,6 +68,7 @@
         data_size: usize,
         tree_metadata: PyBytes,
         uuid: PyBytes,
+        identity: Option<u64>,
     ) -> PyResult<PyObject> {
         let dirstate_error = |e: DirstateError| {
             PyErr::new::<exc::OSError, _>(py, format!("Dirstate error: {:?}", e))
@@ -74,7 +76,11 @@
         let on_disk = PyBytesDeref::new(py, on_disk);
         let uuid = uuid.data(py);
         let map = OwningDirstateMap::new_v2(
-            on_disk, data_size, tree_metadata.data(py), uuid.to_owned(),
+            on_disk,
+            data_size,
+            tree_metadata.data(py),
+            uuid.to_owned(),
+            identity,
         ).map_err(dirstate_error)?;
         let map = Self::create_instance(py, map)?;
         Ok(map.into_object())