Mercurial > public > mercurial-scm > hg
annotate rust/hg-pyo3/src/revlog/mod.rs @ 52782:827889802d11
rust-pyo3-revlog: nodemap filling accessor
This follows closely the original version in `hg-cpython`,
with perhaps room for improvement to spare the caller with
obscure and scary calls to `except()`.
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Wed, 25 Dec 2024 14:00:34 +0100 |
parents | 42b219a1404a |
children | 5e3e8876fd9e |
rev | line source |
---|---|
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
1 // revlog.rs |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
2 // |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
3 // Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net> |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
4 // 2020-2024 Raphaël Gomès <raphael.gomes@octobus.net> |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
5 // 2024 Georges Racinet <georges.racinet@cloudcrane.io> |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
6 // |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
7 // This software may be used and distributed according to the terms of the |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
8 // GNU General Public License version 2 or any later version. |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
9 use pyo3::buffer::PyBuffer; |
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
10 use pyo3::prelude::*; |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
11 use pyo3::types::{PyBytes, PyBytesMethods, PyList}; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
12 use pyo3_sharedref::PyShareable; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
13 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
14 use std::sync::{atomic::AtomicUsize, RwLock}; |
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
15 |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
16 use hg::{ |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
17 revlog::{ |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
18 index::Index, inner_revlog::InnerRevlog as CoreInnerRevlog, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
19 nodemap::NodeTree as CoreNodeTree, options::RevlogOpenOptions, |
52782
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
20 RevlogIndex, RevlogType, |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
21 }, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
22 utils::files::get_path_from_bytes, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
23 vfs::FnCacheVfs, |
52782
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
24 BaseRevision, Revision, |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
25 }; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
26 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
27 use crate::{ |
52782
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
28 exceptions::{map_lock_error, nodemap_error, revlog_error_from_msg}, |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
29 store::PyFnCache, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
30 util::{new_submodule, take_buffer_with_slice}, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
31 }; |
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
32 |
52778
523ca3d225f5
rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52775
diff
changeset
|
33 mod config; |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
34 use config::*; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
35 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
36 #[pyclass] |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
37 #[allow(dead_code)] |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
38 struct InnerRevlog { |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
39 irl: PyShareable<CoreInnerRevlog>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
40 nt: RwLock<Option<CoreNodeTree>>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
41 docket: Option<PyObject>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
42 // Holds a reference to the mmap'ed persistent nodemap data |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
43 nodemap_mmap: Option<PyBuffer<u8>>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
44 // Holds a reference to the mmap'ed persistent index data |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
45 index_mmap: Option<PyBuffer<u8>>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
46 revision_cache: Option<PyObject>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
47 head_revs_py_list: Option<Py<PyList>>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
48 head_node_ids_py_list: Option<Py<PyList>>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
49 use_persistent_nodemap: bool, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
50 nodemap_queries: AtomicUsize, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
51 } |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
52 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
53 #[pymethods] |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
54 impl InnerRevlog { |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
55 #[new] |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
56 // The Python side has authority on this signature. |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
57 #[allow(clippy::too_many_arguments)] |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
58 fn new( |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
59 vfs_base: &Bound<'_, PyBytes>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
60 fncache: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
61 vfs_is_readonly: bool, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
62 index_data: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
63 index_file: &Bound<'_, PyBytes>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
64 data_file: &Bound<'_, PyBytes>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
65 sidedata_file: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
66 inline: bool, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
67 data_config: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
68 delta_config: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
69 feature_config: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
70 chunk_cache: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
71 default_compression_header: &Bound<'_, PyAny>, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
72 revlog_type: usize, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
73 use_persistent_nodemap: bool, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
74 ) -> PyResult<Self> { |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
75 // Let clippy accept the unused arguments. This is a bit better than |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
76 // a blank `allow` directive |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
77 let _ = sidedata_file; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
78 let _ = chunk_cache; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
79 let _ = default_compression_header; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
80 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
81 let index_file = get_path_from_bytes(index_file.as_bytes()).to_owned(); |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
82 let data_file = get_path_from_bytes(data_file.as_bytes()).to_owned(); |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
83 let revlog_type = RevlogType::try_from(revlog_type) |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
84 .map_err(revlog_error_from_msg)?; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
85 let data_config = extract_data_config(data_config, revlog_type)?; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
86 let delta_config = extract_delta_config(delta_config, revlog_type)?; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
87 let feature_config = |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
88 extract_feature_config(feature_config, revlog_type)?; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
89 let options = RevlogOpenOptions::new( |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
90 inline, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
91 data_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
92 delta_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
93 feature_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
94 ); |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
95 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
96 // Safety: we keep the buffer around inside the returned instance as |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
97 // `index_mmap` |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
98 let (buf, bytes) = unsafe { take_buffer_with_slice(index_data)? }; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
99 let index = Index::new(bytes, options.index_header()) |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
100 .map_err(revlog_error_from_msg)?; |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
101 |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
102 let base = get_path_from_bytes(vfs_base.as_bytes()).to_owned(); |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
103 let core = CoreInnerRevlog::new( |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
104 Box::new(FnCacheVfs::new( |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
105 base, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
106 vfs_is_readonly, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
107 Box::new(PyFnCache::new(fncache.clone().unbind())), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
108 )), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
109 index, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
110 index_file, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
111 data_file, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
112 data_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
113 delta_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
114 feature_config, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
115 ); |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
116 Ok(Self { |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
117 irl: core.into(), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
118 nt: None.into(), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
119 docket: None, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
120 nodemap_mmap: None, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
121 index_mmap: buf.into(), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
122 head_revs_py_list: None, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
123 head_node_ids_py_list: None, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
124 revision_cache: None, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
125 use_persistent_nodemap, |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
126 nodemap_queries: AtomicUsize::new(0), |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
127 }) |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
128 } |
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
129 } |
52778
523ca3d225f5
rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52775
diff
changeset
|
130 |
52782
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
131 impl InnerRevlog { |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
132 /// Fill a [`CoreNodeTree`] by doing a full iteration on the given |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
133 /// [`Index`] |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
134 /// |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
135 /// # Python exceptions |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
136 /// Raises `ValueError` if `nt` has existing data that is inconsistent |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
137 /// with `idx`. |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
138 fn fill_nodemap(idx: &Index, nt: &mut CoreNodeTree) -> PyResult<()> { |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
139 for r in 0..idx.len() { |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
140 let rev = Revision(r as BaseRevision); |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
141 // in this case node() won't ever return None |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
142 nt.insert(idx, idx.node(rev).expect("node should exist"), rev) |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
143 .map_err(nodemap_error)? |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
144 } |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
145 Ok(()) |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
146 } |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
147 |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
148 /// Return a working NodeTree of this InnerRevlog |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
149 /// |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
150 /// In case the NodeTree has not been initialized yet (in particular |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
151 /// not from persistent data at instantiation), it is created and |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
152 /// filled right away from the index. |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
153 /// |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
154 /// Technically, the returned NodeTree is still behind the lock of |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
155 /// the `nt` field, hence still wrapped in an [`Option`]. Callers |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
156 /// will need to take the lock and unwrap with `expect()`. |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
157 /// |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
158 /// # Python exceptions |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
159 /// The case mentioned in [`Self::fill_nodemap()`] cannot happen, as the |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
160 /// NodeTree is empty when it is called. |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
161 #[allow(dead_code)] |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
162 fn get_nodetree( |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
163 &self, |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
164 idx: &Index, |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
165 ) -> PyResult<&RwLock<Option<CoreNodeTree>>> { |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
166 if self.nt.read().map_err(map_lock_error)?.is_none() { |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
167 let readonly = Box::<Vec<_>>::default(); |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
168 let mut nt = CoreNodeTree::load_bytes(readonly, 0); |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
169 Self::fill_nodemap(idx, &mut nt)?; |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
170 self.nt.write().map_err(map_lock_error)?.replace(nt); |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
171 } |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
172 Ok(&self.nt) |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
173 } |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
174 } |
827889802d11
rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52780
diff
changeset
|
175 |
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
176 pub fn init_module<'py>( |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
177 py: Python<'py>, |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
178 package: &str, |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
179 ) -> PyResult<Bound<'py, PyModule>> { |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
180 let m = new_submodule(py, package, "revlog")?; |
52780
42b219a1404a
rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52778
diff
changeset
|
181 m.add_class::<InnerRevlog>()?; |
52775
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
182 Ok(m) |
264047bf4b9b
rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
183 } |