annotate rust/hg-pyo3/src/revlog/mod.rs @ 52819:88a69ebbba3b

rust-pyo3-revlog: compress
author Rapha?l Gom?s <rgomes@octobus.net>
date Fri, 03 Jan 2025 00:45:25 +0100
parents acd76143f868
children 503752cc7177
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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.
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
9 #![allow(non_snake_case)]
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
10 use hg::revlog::nodemap::Block;
52814
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
11 use hg::utils::files::get_bytes_from_path;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
12 use pyo3::buffer::PyBuffer;
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
13 use pyo3::conversion::IntoPyObject;
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
14 use pyo3::exceptions::{PyIndexError, PyTypeError, PyValueError};
52805
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
15 use pyo3::types::{
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
16 PyBool, PyBytes, PyBytesMethods, PyDict, PyList, PySet, PyTuple,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
17 };
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
18 use pyo3::{prelude::*, IntoPyObjectExt};
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
19 use pyo3_sharedref::{PyShareable, SharedByPyObject};
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
20
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
21 use std::collections::{HashMap, HashSet};
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
22 use std::sync::{
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
23 atomic::{AtomicUsize, Ordering},
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
24 RwLock, RwLockReadGuard, RwLockWriteGuard,
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
25 };
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
26
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
27 use hg::{
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
28 errors::HgError,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
29 revlog::{
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
30 index::{
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
31 Index, Phase, RevisionDataParams, SnapshotsCache, INDEX_ENTRY_SIZE,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
32 },
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
33 inner_revlog::InnerRevlog as CoreInnerRevlog,
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
34 nodemap::{NodeMap, NodeMapError, NodeTree as CoreNodeTree},
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
35 options::RevlogOpenOptions,
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
36 RevlogError, RevlogIndex, RevlogType,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
37 },
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
38 utils::files::get_path_from_bytes,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
39 vfs::FnCacheVfs,
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
40 BaseRevision, Revision, UncheckedRevision, NULL_REVISION,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
41 };
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
42
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
43 use crate::{
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
44 exceptions::{
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
45 graph_error, map_lock_error, map_try_lock_error, nodemap_error,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
46 rev_not_in_index, revlog_error_bare, revlog_error_from_msg,
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
47 },
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
48 node::{node_from_py_bytes, node_prefix_from_py_bytes, py_node_for_rev},
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
49 revision::{
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
50 check_revision, rev_pyiter_collect, rev_pyiter_collect_or_else,
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
51 revs_py_list, revs_py_set, PyRevision,
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
52 },
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
53 store::PyFnCache,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
54 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
55 };
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
56
52778
523ca3d225f5 rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52775
diff changeset
57 mod config;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
58 use config::*;
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
59 mod index;
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
60 use index::{
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
61 py_tuple_to_revision_data_params, revision_data_params_to_py_tuple,
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
62 PySharedIndex,
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
63 };
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
64
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
65 #[pyclass]
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
66 struct ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
67 inner_revlog: Py<InnerRevlog>,
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
68 }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
69
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
70 #[pymethods]
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
71 impl ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
72 fn __enter__(slf: PyRef<'_, Self>) -> PyResult<()> {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
73 let inner_bound = slf.inner_revlog.bind(slf.py());
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
74 let shareable = &inner_bound.borrow().irl;
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
75 // Safety: the owner is correct and we won't use `share()` anyway
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
76 let core_irl =
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
77 unsafe { shareable.borrow_with_owner(inner_bound) }.read();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
78 core_irl
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
79 .enter_reading_context()
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
80 .map_err(revlog_error_from_msg)
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
81 .inspect_err(|_e| {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
82 // `__exit__` is not called from Python if `__enter__` fails
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
83 core_irl.exit_reading_context();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
84 })
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
85 }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
86
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
87 #[pyo3(signature = (*_args))]
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
88 fn __exit__(slf: PyRef<'_, Self>, _args: &Bound<'_, PyTuple>) {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
89 let inner_bound = slf.inner_revlog.bind(slf.py());
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
90 let shareable = &inner_bound.borrow().irl;
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
91 // Safety: the owner is correct and we won't use `share()` anyway
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
92 let core_irl_ref = unsafe { shareable.borrow_with_owner(inner_bound) };
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
93 core_irl_ref.read().exit_reading_context();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
94 }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
95 }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
96
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
97 struct PySnapshotsCache<'a, 'py: 'a>(&'a Bound<'py, PyDict>);
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
98
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
99 impl<'a, 'py> PySnapshotsCache<'a, 'py> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
100 fn insert_for_with_py_result(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
101 &self,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
102 rev: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
103 value: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
104 ) -> PyResult<()> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
105 match self.0.get_item(rev)? {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
106 Some(obj) => obj.downcast::<PySet>()?.add(value),
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
107 None => {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
108 let set = PySet::new(self.0.py(), vec![value])?;
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
109 self.0.set_item(rev, set)
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
110 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
111 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
112 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
113 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
114
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
115 impl<'a, 'py> SnapshotsCache for PySnapshotsCache<'a, 'py> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
116 fn insert_for(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
117 &mut self,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
118 rev: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
119 value: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
120 ) -> Result<(), RevlogError> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
121 self.insert_for_with_py_result(rev, value).map_err(|_| {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
122 RevlogError::Other(HgError::unsupported(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
123 "Error in Python caches handling",
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
124 ))
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
125 })
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
126 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
127 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
128
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
129 #[pyclass]
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
130 #[allow(dead_code)]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
131 struct InnerRevlog {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
132 irl: PyShareable<CoreInnerRevlog>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
133 nt: RwLock<Option<CoreNodeTree>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
134 docket: Option<PyObject>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
135 // 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
136 nodemap_mmap: Option<PyBuffer<u8>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
137 // 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
138 index_mmap: Option<PyBuffer<u8>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
139 revision_cache: Option<PyObject>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
140 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
141 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
142 use_persistent_nodemap: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
143 nodemap_queries: AtomicUsize,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
144 }
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
145
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
146 #[pymethods]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
147 impl InnerRevlog {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
148 #[new]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
149 // 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
150 #[allow(clippy::too_many_arguments)]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
151 fn new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
152 vfs_base: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
153 fncache: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
154 vfs_is_readonly: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
155 index_data: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
156 index_file: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
157 data_file: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
158 sidedata_file: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
159 inline: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
160 data_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
161 delta_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
162 feature_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
163 chunk_cache: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
164 default_compression_header: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
165 revlog_type: usize,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
166 use_persistent_nodemap: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
167 ) -> PyResult<Self> {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
168 // 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
169 // a blank `allow` directive
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
170 let _ = sidedata_file;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
171 let _ = chunk_cache;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
172 let _ = default_compression_header;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
173
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
174 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
175 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
176 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
177 .map_err(revlog_error_from_msg)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
178 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
179 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
180 let feature_config =
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
181 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
182 let options = RevlogOpenOptions::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
183 inline,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
184 data_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
185 delta_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
186 feature_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
187 );
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
188
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
189 // 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
190 // `index_mmap`
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
191 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
192 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
193 .map_err(revlog_error_from_msg)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
194
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
195 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
196 let core = CoreInnerRevlog::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
197 Box::new(FnCacheVfs::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
198 base,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
199 vfs_is_readonly,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
200 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
201 )),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
202 index,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
203 index_file,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
204 data_file,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
205 data_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
206 delta_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
207 feature_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
208 );
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
209 Ok(Self {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
210 irl: core.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
211 nt: None.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
212 docket: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
213 nodemap_mmap: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
214 index_mmap: buf.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
215 head_revs_py_list: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
216 head_node_ids_py_list: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
217 revision_cache: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
218 use_persistent_nodemap,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
219 nodemap_queries: AtomicUsize::new(0),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
220 })
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
221 }
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
222
52814
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
223 #[getter]
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
224 fn canonical_index_file(
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
225 slf: &Bound<'_, Self>,
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
226 py: Python<'_>,
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
227 ) -> PyResult<Py<PyBytes>> {
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
228 Self::with_core_read(slf, |_self_ref, irl| {
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
229 let path = irl.canonical_index_file();
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
230 Ok(PyBytes::new(py, &get_bytes_from_path(path)).into())
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
231 })
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
232 }
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
233
52815
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
234 #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
235 fn is_delaying(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
236 Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_delaying()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
237 }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
238
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
239 #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
240 fn inline(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
241 Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_inline()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
242 }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
243
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
244 #[setter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
245 fn set_inline(slf: &Bound<'_, Self>, inline: bool) -> PyResult<()> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
246 Self::with_core_write(slf, |_self_ref, mut irl| {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
247 irl.inline = inline;
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
248 Ok(())
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
249 })
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
250 }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
251
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
252 #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
253 fn is_writing(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
254 Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_writing()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
255 }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
256
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
257 #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
258 fn is_open(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
259 Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_open()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
260 }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
261
52816
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
262 #[getter]
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
263 fn index_file(
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
264 slf: &Bound<'_, Self>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
265 py: Python<'_>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
266 ) -> PyResult<Py<PyBytes>> {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
267 Self::with_core_read(slf, |_self_ref, irl| {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
268 let path = get_bytes_from_path(&irl.index_file);
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
269 Ok(PyBytes::new(py, &path).unbind())
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
270 })
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
271 }
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
272
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
273 #[setter]
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
274 fn set_index_file(
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
275 slf: &Bound<'_, Self>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
276 path: &Bound<'_, PyBytes>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
277 ) -> PyResult<()> {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
278 Self::with_core_write(slf, |_self_ref, mut irl| {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
279 let path = get_path_from_bytes(path.as_bytes());
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
280 path.clone_into(&mut irl.index_file);
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
281 Ok(())
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
282 })
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
283 }
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
284
52817
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
285 fn issnapshot(slf: &Bound<'_, Self>, rev: PyRevision) -> PyResult<bool> {
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
286 Self::_index_issnapshot(slf, rev)
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
287 }
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
288
52818
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
289 #[pyo3(signature = (rev, stoprev=None))]
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
290 fn _deltachain(
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
291 slf: &Bound<'_, Self>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
292 py: Python<'_>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
293 rev: PyRevision,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
294 stoprev: Option<PyRevision>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
295 ) -> PyResult<Py<PyTuple>> {
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
296 Self::with_index_read(slf, |idx| {
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
297 let using_general_delta = idx.uses_generaldelta();
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
298 Self::_index_deltachain(
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
299 slf,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
300 py,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
301 rev,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
302 stoprev,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
303 Some(using_general_delta.into()),
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
304 )
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
305 })
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
306 }
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
307
52819
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
308 fn compress(
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
309 slf: &Bound<'_, Self>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
310 py: Python<'_>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
311 data: &Bound<'_, PyAny>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
312 ) -> PyResult<Py<PyTuple>> {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
313 Self::with_core_read(slf, |_self_ref, irl| {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
314 // Safety: we only hold on to the data for as long as `_buf`
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
315 // is alive
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
316 let (_buf, data) = unsafe { take_buffer_with_slice(data)? };
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
317 let compressed =
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
318 irl.compress(&data).map_err(revlog_error_from_msg)?;
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
319 let compressed = compressed.as_deref();
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
320 let header = if compressed.is_some() {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
321 PyBytes::new(py, &b""[..])
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
322 } else {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
323 PyBytes::new(py, &b"u"[..])
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
324 };
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
325 Ok(PyTuple::new(
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
326 py,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
327 &[header, PyBytes::new(py, compressed.unwrap_or(&data))],
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
328 )?
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
329 .unbind())
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
330 })
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
331 }
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
332
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
333 fn reading(slf: &Bound<'_, Self>) -> PyResult<ReadingContextManager> {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
334 Ok(ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
335 inner_revlog: slf.clone().unbind(),
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
336 })
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
337 }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
338
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
339 //
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
340 // -- forwarded index methods --
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
341 //
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
342
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
343 fn _index_get_rev(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
344 slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
345 node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
346 ) -> PyResult<Option<PyRevision>> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
347 let node = node_from_py_bytes(node)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
348
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
349 // Do not rewrite this with `Self::with_index_nt_read`: it makes
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
350 // inconditionally a volatile nodetree, and that is not the intent
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
351 // here: the code below specifically avoids that.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
352 Self::with_core_read(slf, |self_ref, irl| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
353 let idx = &irl.index;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
354
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
355 let prev_queries =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
356 self_ref.nodemap_queries.fetch_add(1, Ordering::Relaxed);
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
357 // Filelogs have no persistent nodemaps and are often small,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
358 // use a brute force lookup from the end
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
359 // backwards. If there is a very large filelog
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
360 // (automation file that changes every
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
361 // commit etc.), it also seems to work quite well for
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
362 // all measured purposes so far.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
363 if !self_ref.use_persistent_nodemap && prev_queries <= 3 {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
364 return Ok(idx
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
365 .rev_from_node_no_persistent_nodemap(node.into())
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
366 .ok()
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
367 .map(Into::into));
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
368 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
369
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
370 let opt =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
371 self_ref.get_nodetree(idx)?.read().map_err(map_lock_error)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
372 let nt = opt.as_ref().expect("nodetree should be set");
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
373
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
374 let rust_rev =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
375 nt.find_bin(idx, node.into()).map_err(nodemap_error)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
376 Ok(rust_rev.map(Into::into))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
377 })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
378 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
379
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
380 /// same as `_index_get_rev()` but raises a bare `error.RevlogError` if
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
381 /// node is not found.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
382 ///
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
383 /// No need to repeat `node` in the exception, `mercurial/revlog.py`
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
384 /// will catch and rewrap with it
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
385 fn _index_rev(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
386 slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
387 node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
388 ) -> PyResult<PyRevision> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
389 Self::_index_get_rev(slf, node)?.ok_or_else(revlog_error_bare)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
390 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
391
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
392 /// return True if the node exist in the index
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
393 fn _index_has_node(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
394 slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
395 node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
396 ) -> PyResult<bool> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
397 Self::_index_get_rev(slf, node).map(|opt| opt.is_some())
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
398 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
399
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
400 /// find length of shortest hex nodeid of a binary ID
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
401 fn _index_shortest(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
402 slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
403 node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
404 ) -> PyResult<usize> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
405 Self::with_index_nt_read(slf, |idx, nt| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
406 match nt.unique_prefix_len_node(idx, &node_from_py_bytes(node)?) {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
407 Ok(Some(l)) => Ok(l),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
408 Ok(None) => Err(revlog_error_bare()),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
409 Err(e) => Err(nodemap_error(e)),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
410 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
411 })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
412 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
413
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
414 fn _index_partialmatch<'py>(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
415 slf: &Bound<'py, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
416 node: &Bound<'py, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
417 ) -> PyResult<Option<Bound<'py, PyBytes>>> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
418 Self::with_index_nt_read(slf, |idx, nt| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
419 Ok(nt
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
420 .find_bin(idx, node_prefix_from_py_bytes(node)?)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
421 .map_err(nodemap_error)?
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
422 .map(|rev| py_node_for_rev(slf.py(), idx, rev)))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
423 })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
424 }
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
425
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
426 /// append an index entry
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
427 fn _index_append(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
428 slf: &Bound<'_, Self>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
429 tup: &Bound<'_, PyTuple>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
430 ) -> PyResult<()> {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
431 // no need to check length: in PyO3 tup.get_item() does return
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
432 // proper errors
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
433 let node_bytes = tup.get_item(7)?.extract()?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
434 let node = node_from_py_bytes(&node_bytes)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
435
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
436 Self::with_index_nt_write(slf, |idx, nt| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
437 let rev = idx.len() as BaseRevision;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
438 // This is ok since we will immediately add the revision to the
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
439 // index
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
440 let rev = Revision(rev);
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
441 idx.append(py_tuple_to_revision_data_params(tup)?)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
442 .map_err(revlog_error_from_msg)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
443
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
444 nt.insert(idx, &node, rev).map_err(nodemap_error)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
445 Ok(())
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
446 })
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
447 }
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
448
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
449 /// Removes one or several entries from the index.
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
450 ///
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
451 /// Historically, on the Mercurial revlog index, `__delitem__` has always
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
452 /// been both for `del idx[r1]` and `del idx[r1:r2]`. In both cases,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
453 /// all entries starting from `r1` are removed anyway.
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
454 fn _index___delitem__(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
455 slf: &Bound<'_, Self>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
456 arg: &Bound<'_, PyAny>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
457 ) -> PyResult<()> {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
458 let start = if let Ok(rev) = arg.extract() {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
459 UncheckedRevision(rev)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
460 } else {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
461 // here we could downcast to `PySlice` and use `indices()`, *but*
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
462 // the rust-cpython based version could not do that, and
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
463 // `indices()` does some resolving that makes it not equivalent,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
464 // e.g., `idx[-1::]` has `start=0`. As we are currently in
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
465 // transition, we keep it the old way (hoping it was consistent
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
466 // with the C index).
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
467 let start = arg.getattr("start")?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
468 UncheckedRevision(start.extract()?)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
469 };
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
470
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
471 Self::with_index_nt_write(slf, |idx, nt| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
472 // In the case of a slice, the check is possibly already done by
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
473 // `slice.indices`, which is itself an FFI wrapper for CPython's
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
474 // `PySlice_GetIndicesEx`
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
475 // (Python integration tests will tell us)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
476 let start = idx.check_revision(start).ok_or_else(|| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
477 nodemap_error(NodeMapError::RevisionNotInIndex(start))
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
478 })?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
479 idx.remove(start).map_err(revlog_error_from_msg)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
480 nt.invalidate_all();
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
481 Self::fill_nodemap(idx, nt)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
482 Ok(())
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
483 })
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
484 }
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
485
52800
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
486 /// return the gca set of the given revs
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
487 #[pyo3(signature = (*revs))]
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
488 fn _index_ancestors(
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
489 slf: &Bound<'_, Self>,
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
490 revs: &Bound<'_, PyTuple>,
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
491 ) -> PyResult<PyObject> {
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
492 Self::with_index_read(slf, |idx| {
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
493 let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
494 Ok(PyList::new(
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
495 slf.py(),
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
496 idx.ancestors(&revs)
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
497 .map_err(graph_error)?
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
498 .into_iter()
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
499 .map(PyRevision::from),
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
500 )?
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
501 .into_any()
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
502 .unbind())
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
503 })
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
504 }
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
505
52801
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
506 /// return the heads of the common ancestors of the given revs
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
507 #[pyo3(signature = (*revs))]
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
508 fn _index_commonancestorsheads(
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
509 slf: &Bound<'_, Self>,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
510 revs: &Bound<'_, PyTuple>,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
511 ) -> PyResult<Py<PyList>> {
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
512 Self::with_index_read(slf, |idx| {
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
513 let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
514 revs_py_list(
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
515 slf.py(),
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
516 idx.common_ancestor_heads(&revs).map_err(graph_error)?,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
517 )
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
518 })
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
519 }
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
520
52802
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
521 /// Clear the index caches and inner py_class data.
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
522 /// It is Python's responsibility to call `update_nodemap_data` again.
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
523 fn _index_clearcaches(slf: &Bound<'_, Self>) -> PyResult<()> {
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
524 Self::with_index_write(slf, |idx| {
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
525 idx.clear_caches();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
526 Ok(())
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
527 })?;
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
528
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
529 let mut self_ref = slf.borrow_mut();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
530 self_ref.nt.write().map_err(map_lock_error)?.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
531 self_ref.docket.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
532 self_ref.nodemap_mmap.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
533 self_ref.head_revs_py_list.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
534 self_ref.head_node_ids_py_list.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
535 Ok(())
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
536 }
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
537
52804
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
538 /// return the raw binary string representing a revision
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
539 fn _index_entry_binary(
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
540 slf: &Bound<'_, Self>,
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
541 rev: PyRevision,
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
542 ) -> PyResult<Py<PyBytes>> {
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
543 let rev: UncheckedRevision = rev.into();
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
544 Self::with_index_read(slf, |idx| {
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
545 idx.check_revision(rev)
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
546 .and_then(|r| idx.entry_binary(r))
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
547 .map(|rust_bytes| PyBytes::new(slf.py(), rust_bytes).unbind())
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
548 .ok_or_else(|| rev_not_in_index(rev))
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
549 })
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
550 }
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
551
52803
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
552 /// return a binary packed version of the header
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
553 fn _index_pack_header(
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
554 slf: &Bound<'_, Self>,
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
555 header: i32,
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
556 ) -> PyResult<Py<PyBytes>> {
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
557 let packed =
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
558 Self::with_index_read(slf, |idx| Ok(idx.pack_header(header)))?;
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
559 Ok(PyBytes::new(slf.py(), &packed).unbind())
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
560 }
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
561
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
562 /// compute phases
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
563 fn _index_computephasesmapsets(
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
564 slf: &Bound<'_, Self>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
565 py: Python<'_>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
566 roots: &Bound<'_, PyDict>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
567 ) -> PyResult<Py<PyTuple>> {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
568 let (len, phase_maps) = Self::with_index_read(slf, |idx| {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
569 let extracted_roots: PyResult<HashMap<Phase, Vec<Revision>>> =
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
570 roots
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
571 .iter()
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
572 .map(|(phase, revs)| {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
573 let phase = Phase::try_from(phase.extract::<usize>()?)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
574 .map_err(|_| revlog_error_bare())?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
575 let revs: Vec<Revision> =
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
576 rev_pyiter_collect(&revs, idx)?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
577 Ok((phase, revs))
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
578 })
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
579 .collect();
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
580 idx.compute_phases_map_sets(extracted_roots?)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
581 .map_err(graph_error)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
582 })?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
583 // Ugly hack, but temporary (!)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
584 const IDX_TO_PHASE_NUM: [usize; 4] = [1, 2, 32, 96];
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
585 let py_phase_maps = PyDict::new(py);
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
586 for (i, roots) in phase_maps.into_iter().enumerate() {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
587 py_phase_maps.set_item(
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
588 IDX_TO_PHASE_NUM[i],
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
589 revs_py_set(py, roots)?.into_any(),
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
590 )?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
591 }
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
592 Ok((len, py_phase_maps).into_pyobject(py)?.unbind())
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
593 }
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
594
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
595 /// reachableroots
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
596 #[pyo3(signature = (*args))]
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
597 fn _index_reachableroots2(
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
598 slf: &Bound<'_, Self>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
599 py: Python<'_>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
600 args: &Bound<'_, PyTuple>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
601 ) -> PyResult<Py<PyList>> {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
602 // TODO what was the point of having a signature with variable args?
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
603 let min_root = UncheckedRevision(args.get_item(0)?.extract()?);
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
604 let heads = args.get_item(1)?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
605 let roots = args.get_item(2)?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
606 let include_path: bool = args.get_item(3)?.extract()?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
607
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
608 let as_set = Self::with_index_read(slf, |idx| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
609 let heads = rev_pyiter_collect_or_else(&heads, idx, |_rev| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
610 PyIndexError::new_err("head out of range")
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
611 })?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
612 let roots: Result<_, _> = roots
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
613 .try_iter()?
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
614 .map(|r| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
615 r.and_then(|o| match o.extract::<PyRevision>() {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
616 Ok(r) => Ok(UncheckedRevision(r.0)),
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
617 Err(e) => Err(e),
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
618 })
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
619 })
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
620 .collect();
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
621 idx.reachable_roots(min_root, heads, roots?, include_path)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
622 .map_err(graph_error)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
623 })?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
624
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
625 revs_py_list(py, as_set)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
626 }
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
627
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
628 #[pyo3(signature = (*args))]
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
629 fn _index_headrevs(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
630 slf: &Bound<'_, Self>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
631 py: Python<'_>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
632 args: &Bound<'_, PyTuple>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
633 ) -> PyResult<Py<PyList>> {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
634 let (filtered_revs, stop_rev) = match args.len() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
635 0 => Ok((None, None)),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
636 1 => Ok((Some(args.get_item(0)?), None)),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
637 2 => Ok((Some(args.get_item(0)?), Some(args.get_item(1)?))),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
638 _ => Err(PyTypeError::new_err("too many arguments")),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
639 }?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
640 let stop_rev = stop_rev
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
641 .map(|o| o.extract::<Option<i32>>())
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
642 .transpose()?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
643 .flatten();
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
644 let filtered_revs = filtered_revs.filter(|o| !o.is_none());
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
645
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
646 let (from_core, stop_rev) = Self::with_index_read(slf, |idx| {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
647 let stop_rev = stop_rev
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
648 // should this not just be the normal checking?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
649 .filter(|rev| 0 <= *rev && *rev < idx.len() as BaseRevision)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
650 .map(Revision);
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
651
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
652 let from_core = if let Some(filtered_revs) = filtered_revs {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
653 let filtered_revs = rev_pyiter_collect(&filtered_revs, idx)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
654 idx.head_revs_advanced(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
655 &filtered_revs,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
656 stop_rev,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
657 stop_rev.is_none(),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
658 )
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
659 } else if stop_rev.is_some() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
660 idx.head_revs_advanced(&HashSet::new(), stop_rev, false)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
661 } else {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
662 idx.head_revs_shortcut()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
663 }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
664 .map_err(graph_error)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
665 Ok((from_core, stop_rev))
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
666 })?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
667
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
668 if stop_rev.is_some() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
669 // we don't cache result for now
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
670 let new_heads =
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
671 from_core.expect("this case should not be cached yet");
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
672
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
673 revs_py_list(py, new_heads)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
674 } else {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
675 if let Some(new_heads) = from_core {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
676 Self::cache_new_heads_py_list(slf, new_heads)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
677 }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
678
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
679 Ok(slf
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
680 .borrow()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
681 .head_revs_py_list
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
682 .as_ref()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
683 .expect("head revs should be cached")
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
684 .clone_ref(py))
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
685 }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
686 }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
687
52810
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
688 /// get head nodeids
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
689 fn _index_head_node_ids(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
690 slf: &Bound<'_, Self>,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
691 py: Python<'_>,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
692 ) -> PyResult<Py<PyList>> {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
693 let (head_revs, head_nodes) = Self::with_index_read(slf, |idx| {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
694 // We don't use the shortcut here, as it's actually slower to loop
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
695 // through the cached `PyList` than to re-do the whole
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
696 // conversion for large lists, which are the performance
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
697 // sensitive ones anyway.
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
698 let head_revs = idx.head_revs().map_err(graph_error)?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
699 let head_nodes = PyList::new(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
700 py,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
701 head_revs.iter().map(|r| {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
702 PyBytes::new(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
703 py,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
704 idx.node(*r)
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
705 .expect("rev should have been in the index")
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
706 .as_bytes(),
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
707 )
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
708 .unbind()
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
709 }),
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
710 )?
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
711 .unbind();
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
712 Ok((head_revs, head_nodes))
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
713 })?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
714
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
715 Self::cache_new_heads_py_list(slf, head_revs)?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
716 // TODO discussion with Alphare: in hg-cpython,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
717 // `cache_new_heads_node_ids_py_list` reconverts `head_nodes`,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
718 // to store it in the cache attr that is **not actually used**.
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
719 // Should we drop the idea of this cache definition or actually
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
720 // use it? Perhaps in a later move for perf assessment?
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
721 Ok(head_nodes)
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
722 }
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
723
52809
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
724 /// get diff in head revisions
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
725 fn _index_headrevsdiff(
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
726 slf: &Bound<'_, Self>,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
727 py: Python<'_>,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
728 begin: PyRevision,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
729 end: PyRevision,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
730 ) -> PyResult<Py<PyTuple>> {
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
731 let begin: BaseRevision = begin.0 - 1;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
732 let end: BaseRevision = end.0 - 1;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
733 let (removed, added) = Self::with_index_read(slf, |idx| {
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
734 idx.head_revs_diff(
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
735 check_revision(idx, begin)?,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
736 check_revision(idx, end)?,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
737 )
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
738 .map_err(graph_error)
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
739 })?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
740 let py_removed = revs_py_list(py, removed)?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
741 let py_added = revs_py_list(py, added)?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
742 Ok((py_removed, py_added).into_pyobject(py)?.unbind())
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
743 }
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
744
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
745 /// True if the object is a snapshot
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
746 fn _index_issnapshot(
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
747 slf: &Bound<'_, Self>,
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
748 rev: PyRevision,
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
749 ) -> PyResult<bool> {
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
750 let rev: UncheckedRevision = rev.into();
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
751 let rev = Self::with_index_read(slf, |idx| {
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
752 idx.check_revision(rev).ok_or_else(|| rev_not_in_index(rev))
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
753 })?;
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
754 Self::with_core_read(slf, |_self_ref, irl| {
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
755 irl.is_snapshot(rev)
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
756 .map_err(|e| PyValueError::new_err(e.to_string()))
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
757 })
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
758 }
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
759
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
760 /// Gather snapshot data in a cache dict
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
761 fn _index_findsnapshots(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
762 slf: &Bound<'_, Self>,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
763 cache: &Bound<'_, PyDict>,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
764 start_rev: PyRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
765 end_rev: PyRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
766 ) -> PyResult<()> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
767 let mut cache = PySnapshotsCache(cache);
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
768 Self::with_index_read(slf, |idx| {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
769 idx.find_snapshots(start_rev.into(), end_rev.into(), &mut cache)
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
770 .map_err(|_| revlog_error_bare())
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
771 })?;
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
772 Ok(())
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
773 }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
774
52805
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
775 /// determine revisions with deltas to reconstruct fulltext
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
776 #[pyo3(signature = (rev, stop_rev, using_general_delta))]
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
777 fn _index_deltachain(
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
778 slf: &Bound<'_, Self>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
779 py: Python<'_>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
780 rev: PyRevision,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
781 stop_rev: Option<PyRevision>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
782 using_general_delta: Option<u32>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
783 ) -> PyResult<Py<PyTuple>> {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
784 let using_general_delta = using_general_delta.map(|i| i != 0);
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
785 let rev: UncheckedRevision = rev.into();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
786 let stop_rev: Option<UncheckedRevision> = stop_rev.map(Into::into);
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
787
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
788 let (chain, stopped) = Self::with_index_read(slf, |idx| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
789 let rev = idx.check_revision(rev).ok_or_else(|| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
790 nodemap_error(NodeMapError::RevisionNotInIndex(rev))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
791 })?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
792 let stop_rev = stop_rev
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
793 .map(|r| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
794 idx.check_revision(r).ok_or_else(|| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
795 nodemap_error(NodeMapError::RevisionNotInIndex(
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
796 rev.into(),
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
797 ))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
798 })
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
799 })
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
800 .transpose()?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
801 idx.delta_chain(rev, stop_rev, using_general_delta)
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
802 .map_err(|e| PyValueError::new_err(e.to_string()))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
803 })?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
804
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
805 let py_chain = revs_py_list(py, chain)?.into_any();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
806 let py_stopped =
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
807 PyBool::new(py, stopped).to_owned().unbind().into_any();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
808 Ok((py_chain, py_stopped).into_pyobject(py)?.unbind())
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
809 }
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
810
52806
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
811 /// slice planned chunk read to reach a density threshold
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
812 fn _index_slicechunktodensity(
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
813 slf: &Bound<'_, Self>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
814 py: Python<'_>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
815 revs: &Bound<'_, PyAny>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
816 target_density: f64,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
817 min_gap_size: usize,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
818 ) -> PyResult<PyObject> {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
819 let as_nested_vec =
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
820 Self::with_index_read(slf, |idx| {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
821 let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
822 Ok(idx.slice_chunk_to_density(
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
823 &revs,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
824 target_density,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
825 min_gap_size,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
826 ))
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
827 })?;
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
828 let res_len = as_nested_vec.len();
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
829
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
830 // cannot build the outer sequence from iterator, because
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
831 // `rev_py_list()` returns `Result<T>` instead of `T`.
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
832 let mut res = Vec::with_capacity(res_len);
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
833 for chunk in as_nested_vec {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
834 res.push(revs_py_list(py, chunk)?.into_any());
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
835 }
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
836 // This is just to do the same as C, not sure why it does this
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
837 Ok(if res_len == 1 {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
838 PyTuple::new(py, res)?.unbind().into_any()
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
839 } else {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
840 PyList::new(py, res)?.unbind().into_any()
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
841 })
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
842 }
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
843
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
844 fn _index___len__(slf: &Bound<'_, Self>) -> PyResult<usize> {
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
845 Self::with_index_read(slf, |idx| Ok(idx.len()))
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
846 }
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
847
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
848 fn _index___getitem__(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
849 slf: &Bound<'_, Self>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
850 py: Python<'_>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
851 key: &Bound<'_, PyAny>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
852 ) -> PyResult<PyObject> {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
853 Self::with_index_read(slf, |idx| {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
854 match key.extract::<BaseRevision>() {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
855 Ok(key_as_int) => {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
856 let entry_params = if key_as_int == NULL_REVISION.0 {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
857 RevisionDataParams::default()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
858 } else {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
859 let rev = UncheckedRevision(key_as_int);
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
860 match idx.entry_as_params(rev) {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
861 Some(e) => e,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
862 None => {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
863 return Err(PyIndexError::new_err(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
864 "revlog index out of range",
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
865 ));
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
866 }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
867 }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
868 };
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
869 Ok(revision_data_params_to_py_tuple(py, entry_params)?
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
870 .into_any()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
871 .unbind())
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
872 }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
873 // Case when key is a binary Node ID (lame: we're re-unlocking)
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
874 _ => Self::_index_get_rev(slf, key.downcast::<PyBytes>()?)?
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
875 .map_or_else(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
876 || Ok(py.None()),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
877 |py_rev| Ok(py_rev.into_pyobject(py)?.unbind().into()),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
878 ),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
879 }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
880 })
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
881 }
52798
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
882
52811
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
883 /// Returns the full nodemap bytes to be written as-is to disk
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
884 fn _index_nodemap_data_all(
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
885 slf: &Bound<'_, Self>,
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
886 py: Python<'_>,
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
887 ) -> PyResult<Py<PyBytes>> {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
888 Self::with_index_nt_write(slf, |idx, nt| {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
889 let old_nt = std::mem::take(nt);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
890 let (readonly, bytes) = old_nt.into_readonly_and_added_bytes();
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
891
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
892 // If there's anything readonly, we need to build the data again
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
893 // from scratch
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
894 let bytes = if readonly.len() > 0 {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
895 let mut nt =
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
896 CoreNodeTree::load_bytes(Box::<Vec<_>>::default(), 0);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
897 Self::fill_nodemap(idx, &mut nt)?;
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
898
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
899 let (readonly, bytes) = nt.into_readonly_and_added_bytes();
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
900 assert_eq!(readonly.len(), 0);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
901
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
902 bytes
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
903 } else {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
904 bytes
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
905 };
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
906
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
907 let bytes = PyBytes::new(py, &bytes);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
908 Ok(bytes.unbind())
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
909 })
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
910 }
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
911
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
912 /// Returns the last saved docket along with the size of any changed data
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
913 /// (in number of blocks), and said data as bytes.
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
914 fn _index_nodemap_data_incremental(
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
915 slf: &Bound<'_, Self>,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
916 py: Python<'_>,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
917 ) -> PyResult<PyObject> {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
918 let mut self_ref = slf.borrow_mut();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
919 let docket = &mut self_ref.docket;
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
920 let docket = match docket.as_ref() {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
921 Some(d) => d.clone_ref(py),
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
922 None => return Ok(py.None()),
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
923 };
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
924 drop(self_ref);
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
925
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
926 Self::with_core_write(slf, |self_ref, irl| {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
927 let mut nt = self_ref
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
928 .get_nodetree(&irl.index)?
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
929 .write()
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
930 .map_err(map_lock_error)?;
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
931 let nt = nt.take().expect("nodetree should be set");
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
932 let masked_blocks = nt.masked_readonly_blocks();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
933 let (_, data) = nt.into_readonly_and_added_bytes();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
934 let changed = masked_blocks * std::mem::size_of::<Block>();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
935
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
936 Ok(PyTuple::new(
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
937 py,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
938 [
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
939 docket,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
940 changed.into_py_any(py)?,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
941 PyBytes::new(py, &data).into_py_any(py)?,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
942 ],
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
943 )?
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
944 .unbind()
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
945 .into_any())
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
946 })
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
947 }
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
948
52813
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
949 /// Update the nodemap from the new (mmaped) data.
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
950 /// The docket is kept as a reference for later incremental calls.
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
951 fn _index_update_nodemap_data(
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
952 slf: &Bound<'_, Self>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
953 py: Python<'_>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
954 docket: &Bound<'_, PyAny>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
955 nm_data: &Bound<'_, PyAny>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
956 ) -> PyResult<PyObject> {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
957 // Safety: we keep the buffer around inside the class as `nodemap_mmap`
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
958 let (buf, bytes) = unsafe { take_buffer_with_slice(nm_data)? };
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
959 let len = buf.item_count();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
960 let data_tip =
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
961 docket.getattr("tip_rev")?.extract::<BaseRevision>()?.into();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
962
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
963 let mut nt = CoreNodeTree::load_bytes(bytes, len);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
964
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
965 Self::with_index_read(slf, |idx| {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
966 let data_tip = idx.check_revision(data_tip).ok_or_else(|| {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
967 nodemap_error(NodeMapError::RevisionNotInIndex(data_tip))
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
968 })?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
969 let current_tip = idx.len();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
970
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
971 for r in (data_tip.0 + 1)..current_tip as BaseRevision {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
972 let rev = Revision(r);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
973 // in this case node() won't ever return None
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
974 nt.insert(idx, idx.node(rev).expect("node should exist"), rev)
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
975 .map_err(nodemap_error)?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
976 }
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
977
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
978 Ok(py.None())
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
979 })?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
980
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
981 let mut self_ref = slf.borrow_mut();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
982 self_ref.docket.replace(docket.clone().unbind());
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
983 self_ref.nodemap_mmap = Some(buf);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
984 self_ref.nt.write().map_err(map_lock_error)?.replace(nt);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
985
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
986 Ok(py.None())
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
987 }
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
988
52798
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
989 #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
990 fn _index_entry_size(&self) -> usize {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
991 INDEX_ENTRY_SIZE
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
992 }
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
993
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
994 #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
995 fn _index_rust_ext_compat(&self) -> i32 {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
996 1
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
997 }
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
998
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
999 #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
1000 fn _index_is_rust(&self) -> bool {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
1001 true
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
1002 }
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
1003 }
52778
523ca3d225f5 rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52775
diff changeset
1004
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1005 impl InnerRevlog {
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1006 /// Take the lock on `slf.irl` for reading and call a closure.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1007 ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1008 /// This serves the purpose to keep the needed intermediate [`PyRef`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1009 /// that must be obtained to access the data from the [`Bound`] reference
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1010 /// and of which the locked [`CoreInnerRevlog`] depends.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1011 /// This also provides releasing of the [`PyRef`] as soon as the closure
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1012 /// is done, which is crucial if the caller needs to obtain a [`PyRefMut`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1013 /// later on.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1014 ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1015 /// In the closure, we hand back the intermediate [`PyRef`] that
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1016 /// has been generated so that the closure can access more attributes.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1017 fn with_core_read<'py, T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1018 slf: &Bound<'py, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1019 f: impl FnOnce(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1020 &PyRef<'py, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1021 RwLockReadGuard<CoreInnerRevlog>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1022 ) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1023 ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1024 let self_ref = slf.borrow();
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1025 // Safety: the owner is the right one. We will anyway
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1026 // not actually `share` it. Perhaps pyo3-sharedref should provide
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1027 // something less scary for this kind of usage.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1028 let shareable_ref = unsafe { self_ref.irl.borrow_with_owner(slf) };
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1029 let guard = shareable_ref.try_read().map_err(map_try_lock_error)?;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1030 f(&self_ref, guard)
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1031 }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1032
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1033 /// Take the lock on `slf.irl` for writing and call a closure.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1034 ///
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1035 /// See [`Self::with_core_read`] for more explanations.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1036 fn with_core_write<'py, T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1037 slf: &Bound<'py, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1038 f: impl FnOnce(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1039 &PyRef<'py, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1040 RwLockWriteGuard<CoreInnerRevlog>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1041 ) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1042 ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1043 let self_ref = slf.borrow();
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1044 // Safety: the owner is the right one. We will anyway
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1045 // not actually `share` it. Perhaps pyo3-sharedref should provide
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1046 // something less scary for this kind of usage.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1047 let shareable_ref = unsafe { self_ref.irl.borrow_with_owner(slf) };
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1048 let guard = shareable_ref.try_write().map_err(map_try_lock_error)?;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1049 f(&self_ref, guard)
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1050 }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1051
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1052 fn with_index_read<T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1053 slf: &Bound<'_, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1054 f: impl FnOnce(&Index) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1055 ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1056 Self::with_core_read(slf, |_, guard| f(&guard.index))
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1057 }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1058
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1059 fn with_index_write<T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1060 slf: &Bound<'_, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1061 f: impl FnOnce(&mut Index) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1062 ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1063 Self::with_core_write(slf, |_, mut guard| f(&mut guard.index))
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1064 }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1065
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1066 /// Lock `slf` for reading and execute a closure on its [`Index`] and
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1067 /// [`NodeTree`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1068 ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1069 /// The [`NodeTree`] is initialized an filled before hand if needed.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1070 fn with_index_nt_read<T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1071 slf: &Bound<'_, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1072 f: impl FnOnce(&Index, &CoreNodeTree) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1073 ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1074 Self::with_core_read(slf, |self_ref, guard| {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1075 let idx = &guard.index;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1076 let nt =
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1077 self_ref.get_nodetree(idx)?.read().map_err(map_lock_error)?;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1078 let nt = nt.as_ref().expect("nodetree should be set");
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1079 f(idx, nt)
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1080 })
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1081 }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
1082
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1083 fn with_index_nt_write<T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1084 slf: &Bound<'_, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1085 f: impl FnOnce(&mut Index, &mut CoreNodeTree) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1086 ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1087 Self::with_core_write(slf, |self_ref, mut guard| {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1088 let idx = &mut guard.index;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1089 let mut nt = self_ref
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1090 .get_nodetree(idx)?
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1091 .write()
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1092 .map_err(map_lock_error)?;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1093 let nt = nt.as_mut().expect("nodetree should be set");
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1094 f(idx, nt)
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1095 })
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1096 }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
1097
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1098 /// 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
1099 /// [`Index`]
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1100 ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1101 /// # Python exceptions
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1102 /// 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
1103 /// with `idx`.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1104 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
1105 for r in 0..idx.len() {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1106 let rev = Revision(r as BaseRevision);
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1107 // 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
1108 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
1109 .map_err(nodemap_error)?
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1110 }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1111 Ok(())
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1112 }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1113
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1114 /// Return a working NodeTree of this InnerRevlog
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1115 ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1116 /// 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
1117 /// 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
1118 /// filled right away from the index.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1119 ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1120 /// 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
1121 /// 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
1122 /// 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
1123 ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1124 /// # Python exceptions
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1125 /// 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
1126 /// NodeTree is empty when it is called.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1127 fn get_nodetree(
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1128 &self,
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1129 idx: &Index,
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1130 ) -> PyResult<&RwLock<Option<CoreNodeTree>>> {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1131 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
1132 let readonly = Box::<Vec<_>>::default();
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1133 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
1134 Self::fill_nodemap(idx, &mut nt)?;
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1135 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
1136 }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1137 Ok(&self.nt)
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1138 }
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1139
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1140 fn cache_new_heads_py_list(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1141 slf: &Bound<'_, Self>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1142 new_heads: Vec<Revision>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1143 ) -> PyResult<Py<PyList>> {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1144 let py = slf.py();
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1145 let new_heads_py_list = revs_py_list(py, new_heads)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1146 slf.borrow_mut().head_revs_py_list =
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1147 Some(new_heads_py_list.clone_ref(py));
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1148 // TODO is returning really useful?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1149 Ok(new_heads_py_list)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
1150 }
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1151 }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
1152
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1153 #[pyclass]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1154 struct NodeTree {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1155 nt: RwLock<CoreNodeTree>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1156 index: SharedByPyObject<PySharedIndex>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1157 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1158
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1159 #[pymethods]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1160 impl NodeTree {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1161 #[new]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1162 // The share/mapping should be set apart to become the PyO3 homolog of
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1163 // `py_rust_index_to_graph`
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1164 fn new(index_proxy: &Bound<'_, PyAny>) -> PyResult<Self> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1165 let py_irl = index_proxy.getattr("inner")?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1166 let py_irl_ref = py_irl.downcast::<InnerRevlog>()?.borrow();
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1167 let shareable_irl = &py_irl_ref.irl;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1168
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1169 // Safety: the owner is the actual one and we do not leak any
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1170 // internal reference.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1171 let index = unsafe {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1172 shareable_irl.share_map(&py_irl, |irl| (&irl.index).into())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1173 };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1174 let nt = CoreNodeTree::default(); // in-RAM, fully mutable
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1175
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1176 Ok(Self {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1177 nt: nt.into(),
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1178 index,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1179 })
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1180 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1181
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1182 /// Tell whether the NodeTree is still valid
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1183 ///
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1184 /// In case of mutation of the index, the given results are not
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1185 /// guaranteed to be correct, and in fact, the methods borrowing
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1186 /// the inner index would fail because of `PySharedRef` poisoning
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1187 /// (generation-based guard), same as iterating on a `dict` that has
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1188 /// been meanwhile mutated.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1189 fn is_invalidated(&self, py: Python<'_>) -> PyResult<bool> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1190 // Safety: we don't leak any reference derived from self.index, as
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1191 // we only check errors
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1192 let result = unsafe { self.index.try_borrow(py) };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1193 // two cases for result to be an error:
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1194 // - the index has previously been mutably borrowed
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1195 // - there is currently a mutable borrow
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1196 // in both cases this amounts for previous results related to
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1197 // the index to still be valid.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1198 Ok(result.is_err())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1199 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1200
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1201 fn insert(&self, py: Python<'_>, rev: PyRevision) -> PyResult<()> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1202 // Safety: we don't leak any reference derived from self.index,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1203 // as `nt.insert` does not store direct references
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1204 let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1205
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1206 let rev = check_revision(idx, rev)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1207 if rev == NULL_REVISION {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1208 return Err(rev_not_in_index(rev.into()));
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1209 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1210
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1211 let entry = idx.inner().get_entry(rev).expect("entry should exist");
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1212 let mut nt = self.nt.write().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1213 nt.insert(idx, entry.hash(), rev).map_err(nodemap_error)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1214 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1215
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1216 fn shortest(
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1217 &self,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1218 py: Python<'_>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1219 node: &Bound<'_, PyBytes>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1220 ) -> PyResult<usize> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1221 let nt = self.nt.read().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1222 // Safety: we don't leak any reference derived from self.index
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1223 // as returned type is Copy
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1224 let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1225 nt.unique_prefix_len_node(idx, &node_from_py_bytes(node)?)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1226 .map_err(nodemap_error)?
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1227 .ok_or_else(revlog_error_bare)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1228 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1229
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1230 /// Lookup by node hex prefix in the NodeTree, returning revision number.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1231 ///
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1232 /// This is not part of the classical NodeTree API, but is good enough
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1233 /// for unit testing, as in `test-rust-revlog.py`.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1234 fn prefix_rev_lookup(
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1235 &self,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1236 py: Python<'_>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1237 node_prefix: &Bound<'_, PyBytes>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1238 ) -> PyResult<Option<PyRevision>> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1239 let prefix = node_prefix_from_py_bytes(node_prefix)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1240 let nt = self.nt.read().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1241 // Safety: we don't leak any reference derived from self.index
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1242 // as returned type is Copy
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1243 let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1244 Ok(nt
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1245 .find_bin(idx, prefix)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1246 .map_err(nodemap_error)?
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1247 .map(|r| r.into()))
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1248 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1249 }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1250
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1251 pub fn init_module<'py>(
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1252 py: Python<'py>,
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1253 package: &str,
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1254 ) -> PyResult<Bound<'py, PyModule>> {
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1255 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
1256 m.add_class::<InnerRevlog>()?;
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
1257 m.add_class::<NodeTree>()?;
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
1258 m.add_class::<ReadingContextManager>()?;
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1259 Ok(m)
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1260 }