Mercurial > hg
annotate rust/hg-cpython/src/revlog.rs @ 51426:3099f1c68afd
rust-index: remove one collect when converting back
Turns out this is slightly faster. Sending the results back to Python is still
the most costly (like 75% of the time) of the whole method, but it's about
as fast as it can be now.
hg perf::phases on mozilla-try-2023-03-22
before: 0.267114
after: 0.247101
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Thu, 22 Feb 2024 15:11:26 +0100 |
parents | f8bf1a8e9181 |
children | a43a6d4b3be6 |
rev | line source |
---|---|
43945
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 // revlog.rs |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 // |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
3 // Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net> |
43945
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
4 // |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
7 |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
8 use crate::{ |
51222
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
9 conversion::{rev_pyiter_collect, rev_pyiter_collect_or_else}, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
10 utils::{node_from_py_bytes, node_from_py_object}, |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
11 PyRevision, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
12 }; |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
13 use cpython::{ |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
14 buffer::{Element, PyBuffer}, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
15 exc::{IndexError, ValueError}, |
51248
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
16 ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyInt, PyList, |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
17 PyModule, PyObject, PyResult, PySet, PyString, PyTuple, Python, |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
18 PythonObject, ToPyObject, UnsafePyLeaked, |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
19 }; |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
20 use hg::{ |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
21 errors::HgError, |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
22 index::{ |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
23 IndexHeader, Phase, RevisionDataParams, SnapshotsCache, |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
24 INDEX_ENTRY_SIZE, |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
25 }, |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
26 nodemap::{Block, NodeMapError, NodeTree as CoreNodeTree}, |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
27 revlog::{nodemap::NodeMap, Graph, NodePrefix, RevlogError, RevlogIndex}, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
28 BaseRevision, Node, Revision, UncheckedRevision, NULL_REVISION, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
29 }; |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
30 use std::{cell::RefCell, collections::HashMap}; |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
31 use vcsgraph::graph::Graph as VCSGraph; |
43945
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
32 |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
33 pub struct PySharedIndex { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
34 /// The underlying hg-core index |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
35 pub(crate) inner: &'static hg::index::Index, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
36 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
37 |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
38 /// Return a Struct implementing the Graph trait |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
39 pub(crate) fn py_rust_index_to_graph( |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
40 py: Python, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
41 index: PyObject, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
42 ) -> PyResult<UnsafePyLeaked<PySharedIndex>> { |
51254
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
43 let midx = index.extract::<Index>(py)?; |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
44 let leaked = midx.index(py).leak_immutable(); |
51255
24d3298189d7
rust-index: document safety invariants being upheld for every `unsafe` block
Raphaël Gomès <rgomes@octobus.net>
parents:
51254
diff
changeset
|
45 // Safety: we don't leak the "faked" reference out of the `UnsafePyLeaked` |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
46 Ok(unsafe { leaked.map(py, |idx| PySharedIndex { inner: idx }) }) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
47 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
48 |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
49 impl Clone for PySharedIndex { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
50 fn clone(&self) -> Self { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
51 Self { inner: self.inner } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
52 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
53 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
54 |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
55 impl Graph for PySharedIndex { |
51258
8b89f7cc953a
rust-index: allow inlining VCSGraph parents across crates
Raphaël Gomès <rgomes@octobus.net>
parents:
51255
diff
changeset
|
56 #[inline(always)] |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
57 fn parents(&self, rev: Revision) -> Result<[Revision; 2], hg::GraphError> { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
58 self.inner.parents(rev) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
59 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
60 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
61 |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
62 impl VCSGraph for PySharedIndex { |
51258
8b89f7cc953a
rust-index: allow inlining VCSGraph parents across crates
Raphaël Gomès <rgomes@octobus.net>
parents:
51255
diff
changeset
|
63 #[inline(always)] |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
64 fn parents( |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
65 &self, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
66 rev: BaseRevision, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
67 ) -> Result<vcsgraph::graph::Parents, vcsgraph::graph::GraphReadError> |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
68 { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
69 // FIXME This trait should be reworked to decide between Revision |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
70 // and UncheckedRevision, get better errors names, etc. |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
71 match Graph::parents(self, Revision(rev)) { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
72 Ok(parents) => { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
73 Ok(vcsgraph::graph::Parents([parents[0].0, parents[1].0])) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
74 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
75 Err(hg::GraphError::ParentOutOfRange(rev)) => { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
76 Err(vcsgraph::graph::GraphReadError::KeyedInvalidKey(rev.0)) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
77 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
78 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
79 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
80 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
81 |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
82 impl RevlogIndex for PySharedIndex { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
83 fn len(&self) -> usize { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
84 self.inner.len() |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
85 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
86 fn node(&self, rev: Revision) -> Option<&Node> { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
87 self.inner.node(rev) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
88 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
89 } |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
90 |
51254
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
91 py_class!(pub class Index |py| { |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
92 @shared data index: hg::index::Index; |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
93 data nt: RefCell<Option<CoreNodeTree>>; |
44509
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
94 data docket: RefCell<Option<PyObject>>; |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
95 // Holds a reference to the mmap'ed persistent nodemap data |
51186
8ade5e6cdb61
rust-mixed-index: rename variable to make the next change clearer
Raphaël Gomès <rgomes@octobus.net>
parents:
51120
diff
changeset
|
96 data nodemap_mmap: RefCell<Option<PyBuffer>>; |
51190
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
97 // Holds a reference to the mmap'ed persistent index data |
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
98 data index_mmap: RefCell<Option<PyBuffer>>; |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
99 data head_revs_py_list: RefCell<Option<PyList>>; |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
100 data head_node_ids_py_list: RefCell<Option<PyList>>; |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
101 |
51190
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
102 def __new__( |
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
103 _cls, |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51190
diff
changeset
|
104 data: PyObject, |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51190
diff
changeset
|
105 default_header: u32, |
51254
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
106 ) -> PyResult<Self> { |
51253
96e05f1a99bd
rust-index: stop instantiating a C Index
Georges Racinet <georges.racinet@octobus.net>
parents:
51251
diff
changeset
|
107 Self::new(py, data, default_header) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
108 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
109 |
44012
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
110 /// Compatibility layer used for Python consumers needing access to the C index |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
111 /// |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
112 /// Only use case so far is `scmutil.shortesthexnodeidprefix`, |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
113 /// that may need to build a custom `nodetree`, based on a specified revset. |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
114 /// With a Rust implementation of the nodemap, we will be able to get rid of |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
115 /// this, by exposing our own standalone nodemap class, |
51253
96e05f1a99bd
rust-index: stop instantiating a C Index
Georges Racinet <georges.racinet@octobus.net>
parents:
51251
diff
changeset
|
116 /// ready to accept `Index`. |
96e05f1a99bd
rust-index: stop instantiating a C Index
Georges Racinet <georges.racinet@octobus.net>
parents:
51251
diff
changeset
|
117 /* def get_cindex(&self) -> PyResult<PyObject> { |
44012
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
118 Ok(self.cindex(py).borrow().inner().clone_ref(py)) |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44011
diff
changeset
|
119 } |
51253
96e05f1a99bd
rust-index: stop instantiating a C Index
Georges Racinet <georges.racinet@octobus.net>
parents:
51251
diff
changeset
|
120 */ |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
121 // Index API involving nodemap, as defined in mercurial/pure/parsers.py |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
122 |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
123 /// Return Revision if found, raises a bare `error.RevlogError` |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
124 /// in case of ambiguity, same as C version does |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
125 def get_rev(&self, node: PyBytes) -> PyResult<Option<PyRevision>> { |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
126 let opt = self.get_nodetree(py)?.borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
127 let nt = opt.as_ref().unwrap(); |
51196
f95f70cf2ee2
rust-index: check rindex and cindex return the same get_rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
128 let ridx = &*self.index(py).borrow(); |
48269
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
129 let node = node_from_py_bytes(py, &node)?; |
51196
f95f70cf2ee2
rust-index: check rindex and cindex return the same get_rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
130 let rust_rev = |
f95f70cf2ee2
rust-index: check rindex and cindex return the same get_rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
131 nt.find_bin(ridx, node.into()).map_err(|e| nodemap_error(py, e))?; |
f95f70cf2ee2
rust-index: check rindex and cindex return the same get_rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
132 Ok(rust_rev.map(Into::into)) |
f95f70cf2ee2
rust-index: check rindex and cindex return the same get_rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
133 |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
134 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
135 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
136 /// same as `get_rev()` but raises a bare `error.RevlogError` if node |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
137 /// is not found. |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
138 /// |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
139 /// No need to repeat `node` in the exception, `mercurial/revlog.py` |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
140 /// will catch and rewrap with it |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
141 def rev(&self, node: PyBytes) -> PyResult<PyRevision> { |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
142 self.get_rev(py, node)?.ok_or_else(|| revlog_error(py)) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
143 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
144 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
145 /// return True if the node exist in the index |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
146 def has_node(&self, node: PyBytes) -> PyResult<bool> { |
51204
297fa956b6c4
rust-index: optim note for post-scaffolding removal
Georges Racinet <georges.racinet@octobus.net>
parents:
51203
diff
changeset
|
147 // TODO OPTIM we could avoid a needless conversion here, |
297fa956b6c4
rust-index: optim note for post-scaffolding removal
Georges Racinet <georges.racinet@octobus.net>
parents:
51203
diff
changeset
|
148 // to do when scaffolding for pure Rust switch is removed, |
297fa956b6c4
rust-index: optim note for post-scaffolding removal
Georges Racinet <georges.racinet@octobus.net>
parents:
51203
diff
changeset
|
149 // as `get_rev()` currently does the necessary assertions |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
150 self.get_rev(py, node).map(|opt| opt.is_some()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
151 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
152 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
153 /// find length of shortest hex nodeid of a binary ID |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
154 def shortest(&self, node: PyBytes) -> PyResult<usize> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
155 let opt = self.get_nodetree(py)?.borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
156 let nt = opt.as_ref().unwrap(); |
51208
274abd1562a2
rust-index: use the rust index in `shortest`
Raphaël Gomès <rgomes@octobus.net>
parents:
51207
diff
changeset
|
157 let idx = &*self.index(py).borrow(); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
158 match nt.unique_prefix_len_node(idx, &node_from_py_bytes(py, &node)?) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
159 { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
160 Ok(Some(l)) => Ok(l), |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
161 Ok(None) => Err(revlog_error(py)), |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
162 Err(e) => Err(nodemap_error(py, e)), |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
163 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
164 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
165 |
48269
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
166 def partialmatch(&self, node: PyObject) -> PyResult<Option<PyBytes>> { |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
167 let opt = self.get_nodetree(py)?.borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
168 let nt = opt.as_ref().unwrap(); |
51210
72d16685d63a
rust-index: use the Rust index in `partialmatch`
Raphaël Gomès <rgomes@octobus.net>
parents:
51208
diff
changeset
|
169 let idx = &*self.index(py).borrow(); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
170 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
171 let node_as_string = if cfg!(feature = "python3-sys") { |
48269
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
172 node.cast_as::<PyString>(py)?.to_string(py)?.to_string() |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
173 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
174 else { |
48269
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
175 let node = node.extract::<PyBytes>(py)?; |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
176 String::from_utf8_lossy(node.data(py)).to_string() |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
177 }; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
178 |
49374
455fce57e89e
rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents:
48269
diff
changeset
|
179 let prefix = NodePrefix::from_hex(&node_as_string) |
455fce57e89e
rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents:
48269
diff
changeset
|
180 .map_err(|_| PyErr::new::<ValueError, _>( |
455fce57e89e
rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents:
48269
diff
changeset
|
181 py, format!("Invalid node or prefix '{}'", node_as_string)) |
455fce57e89e
rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents:
48269
diff
changeset
|
182 )?; |
46432
18a261b11b20
rust: Remove hex parsing from the nodemap
Simon Sapin <simon.sapin@octobus.net>
parents:
46431
diff
changeset
|
183 |
48269
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
184 nt.find_bin(idx, prefix) |
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
185 // TODO make an inner API returning the node directly |
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
186 .map(|opt| opt.map( |
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
187 |rev| PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))) |
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
188 .map_err(|e| nodemap_error(py, e)) |
aa88fb60ecb4
rust-nodemap: backed out mitigation for issue 6554
Georges Racinet <georges.racinet@octobus.net>
parents:
47799
diff
changeset
|
189 |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
190 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
191 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
192 /// append an index entry |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
193 def append(&self, tup: PyTuple) -> PyResult<PyObject> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
194 if tup.len(py) < 8 { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
195 // this is better than the panic promised by tup.get_item() |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
196 return Err( |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
197 PyErr::new::<IndexError, _>(py, "tuple index out of range")) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
198 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
199 let node_bytes = tup.get_item(py, 7).extract(py)?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
200 let node = node_from_py_object(py, &node_bytes)?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
201 |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
202 let rev = self.len(py)? as BaseRevision; |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
203 |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
204 // This is ok since we will just add the revision to the index |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
205 let rev = Revision(rev); |
51192
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
206 self.index(py) |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
207 .borrow_mut() |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
208 .append(py_tuple_to_revision_data_params(py, tup)?) |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
209 .unwrap(); |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
210 let idx = &*self.index(py).borrow(); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
211 self.get_nodetree(py)?.borrow_mut().as_mut().unwrap() |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
212 .insert(idx, &node, rev) |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
213 .map_err(|e| nodemap_error(py, e))?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
214 Ok(py.None()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
215 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
216 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
217 def __delitem__(&self, key: PyObject) -> PyResult<()> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
218 // __delitem__ is both for `del idx[r]` and `del idx[r1:r2]` |
51250
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
219 let start = if let Ok(rev) = key.extract(py) { |
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
220 UncheckedRevision(rev) |
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
221 } else { |
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
222 let start = key.getattr(py, "start")?; |
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
223 UncheckedRevision(start.extract(py)?) |
a8ca22119385
rust-index: add support for `del index[r]`
Raphaël Gomès <rgomes@octobus.net>
parents:
51249
diff
changeset
|
224 }; |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
225 let start = self.index(py) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
226 .borrow() |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
227 .check_revision(start) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
228 .ok_or_else(|| { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
229 nodemap_error(py, NodeMapError::RevisionNotInIndex(start)) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
230 })?; |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51194
diff
changeset
|
231 self.index(py).borrow_mut().remove(start).unwrap(); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
232 let mut opt = self.get_nodetree(py)?.borrow_mut(); |
49914
58074252db3c
rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents:
49374
diff
changeset
|
233 let nt = opt.as_mut().unwrap(); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
234 nt.invalidate_all(); |
49914
58074252db3c
rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents:
49374
diff
changeset
|
235 self.fill_nodemap(py, nt)?; |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
236 Ok(()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
237 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
238 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
239 // |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
240 // Index methods previously reforwarded to C index (tp_methods) |
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
241 // Same ordering as in revlog.c |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
242 // |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
243 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
244 /// return the gca set of the given revs |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
245 def ancestors(&self, *args, **_kw) -> PyResult<PyObject> { |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
246 let rust_res = self.inner_ancestors(py, args)?; |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
247 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
248 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
249 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
250 /// return the heads of the common ancestors of the given revs |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
251 def commonancestorsheads(&self, *args, **_kw) -> PyResult<PyObject> { |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
252 let rust_res = self.inner_commonancestorsheads(py, args)?; |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
253 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
254 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
255 |
44511
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44510
diff
changeset
|
256 /// Clear the index caches and inner py_class data. |
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44510
diff
changeset
|
257 /// It is Python's responsibility to call `update_nodemap_data` again. |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
258 def clearcaches(&self) -> PyResult<PyObject> { |
44511
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44510
diff
changeset
|
259 self.nt(py).borrow_mut().take(); |
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44510
diff
changeset
|
260 self.docket(py).borrow_mut().take(); |
51186
8ade5e6cdb61
rust-mixed-index: rename variable to make the next change clearer
Raphaël Gomès <rgomes@octobus.net>
parents:
51120
diff
changeset
|
261 self.nodemap_mmap(py).borrow_mut().take(); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
262 self.head_revs_py_list(py).borrow_mut().take(); |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
263 self.head_node_ids_py_list(py).borrow_mut().take(); |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
264 self.index(py).borrow().clear_caches(); |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
265 Ok(py.None()) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
266 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
267 |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
268 /// return the raw binary string representing a revision |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
269 def entry_binary(&self, *args, **_kw) -> PyResult<PyObject> { |
51203
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
270 let rindex = self.index(py).borrow(); |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
271 let rev = UncheckedRevision(args.get_item(py, 0).extract(py)?); |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
272 let rust_bytes = rindex.check_revision(rev).and_then( |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
273 |r| rindex.entry_binary(r)) |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
274 .ok_or_else(|| rev_not_in_index(py, rev))?; |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
275 let rust_res = PyBytes::new(py, rust_bytes).into_object(); |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51202
diff
changeset
|
276 Ok(rust_res) |
47034
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
277 } |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
278 |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
279 /// return a binary packed version of the header |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
280 def pack_header(&self, *args, **_kw) -> PyResult<PyObject> { |
51198
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
281 let rindex = self.index(py).borrow(); |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
282 let packed = rindex.pack_header(args.get_item(py, 0).extract(py)?); |
51202
16d477bb0078
rust-index: return variables systematic naming convention
Georges Racinet <georges.racinet@octobus.net>
parents:
51201
diff
changeset
|
283 let rust_res = PyBytes::new(py, &packed).into_object(); |
16d477bb0078
rust-index: return variables systematic naming convention
Georges Racinet <georges.racinet@octobus.net>
parents:
51201
diff
changeset
|
284 Ok(rust_res) |
47037
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
285 } |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47034
diff
changeset
|
286 |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
287 /// compute phases |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
288 def computephasesmapsets(&self, *args, **_kw) -> PyResult<PyObject> { |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
289 let py_roots = args.get_item(py, 0).extract::<PyDict>(py)?; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
290 let rust_res = self.inner_computephasesmapsets(py, py_roots)?; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
291 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
292 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
293 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
294 /// reachableroots |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
295 def reachableroots2(&self, *args, **_kw) -> PyResult<PyObject> { |
51222
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
296 let rust_res = self.inner_reachableroots2( |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
297 py, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
298 UncheckedRevision(args.get_item(py, 0).extract(py)?), |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
299 args.get_item(py, 1), |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
300 args.get_item(py, 2), |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
301 args.get_item(py, 3).extract(py)?, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
302 )?; |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
303 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
304 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
305 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
306 /// get head revisions |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
307 def headrevs(&self) -> PyResult<PyObject> { |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
308 let rust_res = self.inner_headrevs(py)?; |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
309 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
310 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
311 |
51262
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
312 /// get head nodeids |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
313 def head_node_ids(&self) -> PyResult<PyObject> { |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
314 let rust_res = self.inner_head_node_ids(py)?; |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
315 Ok(rust_res) |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
316 } |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
317 |
51397
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
318 /// get diff in head revisions |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
319 def headrevsdiff(&self, *args, **_kw) -> PyResult<PyObject> { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
320 let rust_res = self.inner_headrevsdiff( |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
321 py, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
322 &args.get_item(py, 0), |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
323 &args.get_item(py, 1))?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
324 Ok(rust_res) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
325 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
326 |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
327 /// get filtered head revisions |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
328 def headrevsfiltered(&self, *args, **_kw) -> PyResult<PyObject> { |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
329 let rust_res = self.inner_headrevsfiltered(py, &args.get_item(py, 0))?; |
51217
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
330 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
331 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
332 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
333 /// True if the object is a snapshot |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
334 def issnapshot(&self, *args, **_kw) -> PyResult<bool> { |
51211
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
335 let index = self.index(py).borrow(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
336 let result = index |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
337 .is_snapshot(UncheckedRevision(args.get_item(py, 0).extract(py)?)) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
338 .map_err(|e| { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
339 PyErr::new::<cpython::exc::ValueError, _>(py, e.to_string()) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
340 })?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
341 Ok(result) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
342 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
343 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
344 /// Gather snapshot data in a cache dict |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
345 def findsnapshots(&self, *args, **_kw) -> PyResult<PyObject> { |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
346 let index = self.index(py).borrow(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
347 let cache: PyDict = args.get_item(py, 0).extract(py)?; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
348 // this methods operates by setting new values in the cache, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
349 // hence we will compare results by letting the C implementation |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
350 // operate over a deepcopy of the cache, and finally compare both |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
351 // caches. |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
352 let c_cache = PyDict::new(py); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
353 for (k, v) in cache.items(py) { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
354 c_cache.set_item(py, k, PySet::new(py, v)?)?; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
355 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
356 |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
357 let start_rev = UncheckedRevision(args.get_item(py, 1).extract(py)?); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
358 let end_rev = UncheckedRevision(args.get_item(py, 2).extract(py)?); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
359 let mut cache_wrapper = PySnapshotsCache{ py, dict: cache }; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
360 index.find_snapshots( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
361 start_rev, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
362 end_rev, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
363 &mut cache_wrapper, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
364 ).map_err(|_| revlog_error(py))?; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
365 Ok(py.None()) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
366 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
367 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
368 /// determine revisions with deltas to reconstruct fulltext |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
369 def deltachain(&self, *args, **_kw) -> PyResult<PyObject> { |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
370 let index = self.index(py).borrow(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
371 let rev = args.get_item(py, 0).extract::<BaseRevision>(py)?.into(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
372 let stop_rev = |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
373 args.get_item(py, 1).extract::<Option<BaseRevision>>(py)?; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
374 let rev = index.check_revision(rev).ok_or_else(|| { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
375 nodemap_error(py, NodeMapError::RevisionNotInIndex(rev)) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
376 })?; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
377 let stop_rev = if let Some(stop_rev) = stop_rev { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
378 let stop_rev = UncheckedRevision(stop_rev); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
379 Some(index.check_revision(stop_rev).ok_or_else(|| { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
380 nodemap_error(py, NodeMapError::RevisionNotInIndex(stop_rev)) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
381 })?) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
382 } else {None}; |
51235
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
383 let using_general_delta = args.get_item(py, 2) |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
384 .extract::<Option<u32>>(py)? |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
385 .map(|i| i != 0); |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
386 let (chain, stopped) = index.delta_chain( |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
387 rev, stop_rev, using_general_delta |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
388 ).map_err(|e| { |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
389 PyErr::new::<cpython::exc::ValueError, _>(py, e.to_string()) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
390 })?; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
391 |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
392 let chain: Vec<_> = chain.into_iter().map(|r| r.0).collect(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
393 Ok( |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
394 PyTuple::new( |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
395 py, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
396 &[ |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
397 chain.into_py_object(py).into_object(), |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
398 stopped.into_py_object(py).into_object() |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
399 ] |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
400 ).into_object() |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
401 ) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
402 |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
403 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
404 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
405 /// slice planned chunk read to reach a density threshold |
51246
41e19e8a6133
rust-index: stop using C index
Georges Racinet <georges.racinet@octobus.net>
parents:
51245
diff
changeset
|
406 def slicechunktodensity(&self, *args, **_kw) -> PyResult<PyObject> { |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
407 let rust_res = self.inner_slicechunktodensity( |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
408 py, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
409 args.get_item(py, 0), |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
410 args.get_item(py, 1).extract(py)?, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
411 args.get_item(py, 2).extract(py)? |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
412 )?; |
51219
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
413 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
414 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
415 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
416 // index_sequence_methods and index_mapping_methods. |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
417 // |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
418 // Since we call back through the high level Python API, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
419 // there's no point making a distinction between index_get |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
420 // and index_getitem. |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
421 // gracinet 2023: this above is no longer true for the pure Rust impl |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
422 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
423 def __len__(&self) -> PyResult<usize> { |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
424 self.len(py) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
425 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
426 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
427 def __getitem__(&self, key: PyObject) -> PyResult<PyObject> { |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
428 let rust_res = self.inner_getitem(py, key.clone_ref(py))?; |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
429 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
430 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
431 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
432 def __contains__(&self, item: PyObject) -> PyResult<bool> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
433 // ObjectProtocol does not seem to provide contains(), so |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
434 // this is an equivalent implementation of the index_contains() |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
435 // defined in revlog.c |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49914
diff
changeset
|
436 match item.extract::<i32>(py) { |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
437 Ok(rev) => { |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
438 Ok(rev >= -1 && rev < self.len(py)? as BaseRevision) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
439 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
440 Err(_) => { |
51207
b67cd0d0e976
rust-index: add checks that `__contains__` is synchronized
Raphaël Gomès <rgomes@octobus.net>
parents:
51206
diff
changeset
|
441 let item_bytes: PyBytes = item.extract(py)?; |
b67cd0d0e976
rust-index: add checks that `__contains__` is synchronized
Raphaël Gomès <rgomes@octobus.net>
parents:
51206
diff
changeset
|
442 let rust_res = self.has_node(py, item_bytes)?; |
b67cd0d0e976
rust-index: add checks that `__contains__` is synchronized
Raphaël Gomès <rgomes@octobus.net>
parents:
51206
diff
changeset
|
443 Ok(rust_res) |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
444 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
445 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
446 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
447 |
44508
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
448 def nodemap_data_all(&self) -> PyResult<PyBytes> { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
449 self.inner_nodemap_data_all(py) |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
450 } |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
451 |
44509
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
452 def nodemap_data_incremental(&self) -> PyResult<PyObject> { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
453 self.inner_nodemap_data_incremental(py) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
454 } |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
455 def update_nodemap_data( |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
456 &self, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
457 docket: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
458 nm_data: PyObject |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
459 ) -> PyResult<PyObject> { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
460 self.inner_update_nodemap_data(py, docket, nm_data) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
461 } |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
462 |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46432
diff
changeset
|
463 @property |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46432
diff
changeset
|
464 def entry_size(&self) -> PyResult<PyInt> { |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
465 let rust_res: PyInt = INDEX_ENTRY_SIZE.to_py_object(py); |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
466 Ok(rust_res) |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46432
diff
changeset
|
467 } |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
468 |
47268
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
469 @property |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
470 def rust_ext_compat(&self) -> PyResult<PyInt> { |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
471 // will be entirely removed when the Rust index yet useful to |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
472 // implement in Rust to detangle things when removing `self.cindex` |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
473 let rust_res: PyInt = 1.to_py_object(py); |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
474 Ok(rust_res) |
47268
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
475 } |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47037
diff
changeset
|
476 |
51248
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
477 @property |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
478 def is_rust(&self) -> PyResult<PyBool> { |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
479 Ok(false.to_py_object(py)) |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
480 } |
8b243e2a3bc4
rust-index: a property to identify the Rust index as such
Georges Racinet <georges.racinet@octobus.net>
parents:
51247
diff
changeset
|
481 |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
482 }); |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
483 |
51187
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
484 /// Take a (potentially) mmap'ed buffer, and return the underlying Python |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
485 /// buffer along with the Rust slice into said buffer. We need to keep the |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
486 /// Python buffer around, otherwise we'd get a dangling pointer once the buffer |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
487 /// is freed from Python's side. |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
488 /// |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
489 /// # Safety |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
490 /// |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
491 /// The caller must make sure that the buffer is kept around for at least as |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
492 /// long as the slice. |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
493 #[deny(unsafe_op_in_unsafe_fn)] |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
494 unsafe fn mmap_keeparound( |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
495 py: Python, |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
496 data: PyObject, |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
497 ) -> PyResult<( |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
498 PyBuffer, |
51233
ca81cd96000a
rust-index: add Sync bound to all relevant mmap-derived values
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
499 Box<dyn std::ops::Deref<Target = [u8]> + Send + Sync + 'static>, |
51187
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
500 )> { |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
501 let buf = PyBuffer::get(py, &data)?; |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
502 let len = buf.item_count(); |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
503 |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
504 // Build a slice from the mmap'ed buffer data |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
505 let cbuf = buf.buf_ptr(); |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
506 let bytes = if std::mem::size_of::<u8>() == buf.item_size() |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
507 && buf.is_c_contiguous() |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
508 && u8::is_compatible_format(buf.format()) |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
509 { |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
510 unsafe { std::slice::from_raw_parts(cbuf as *const u8, len) } |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
511 } else { |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
512 return Err(PyErr::new::<ValueError, _>( |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
513 py, |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
514 "Nodemap data buffer has an invalid memory representation" |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
515 .to_string(), |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
516 )); |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
517 }; |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
518 |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
519 Ok((buf, Box::new(bytes))) |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
520 } |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
521 |
51192
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
522 fn py_tuple_to_revision_data_params( |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
523 py: Python, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
524 tuple: PyTuple, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
525 ) -> PyResult<RevisionDataParams> { |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
526 if tuple.len(py) < 8 { |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
527 // this is better than the panic promised by tup.get_item() |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
528 return Err(PyErr::new::<IndexError, _>( |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
529 py, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
530 "tuple index out of range", |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
531 )); |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
532 } |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
533 let offset_or_flags: u64 = tuple.get_item(py, 0).extract(py)?; |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
534 let node_id = tuple |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
535 .get_item(py, 7) |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
536 .extract::<PyBytes>(py)? |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
537 .data(py) |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
538 .try_into() |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
539 .unwrap(); |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
540 let flags = (offset_or_flags & 0xFFFF) as u16; |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
541 let data_offset = offset_or_flags >> 16; |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
542 Ok(RevisionDataParams { |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
543 flags, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
544 data_offset, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
545 data_compressed_length: tuple.get_item(py, 1).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
546 data_uncompressed_length: tuple.get_item(py, 2).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
547 data_delta_base: tuple.get_item(py, 3).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
548 link_rev: tuple.get_item(py, 4).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
549 parent_rev_1: tuple.get_item(py, 5).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
550 parent_rev_2: tuple.get_item(py, 6).extract(py)?, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
551 node_id, |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
552 ..Default::default() |
51192
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
553 }) |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
554 } |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
555 fn revision_data_params_to_py_tuple( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
556 py: Python, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
557 params: RevisionDataParams, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
558 ) -> PyTuple { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
559 PyTuple::new( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
560 py, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
561 &[ |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
562 params.data_offset.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
563 params |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
564 .data_compressed_length |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
565 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
566 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
567 params |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
568 .data_uncompressed_length |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
569 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
570 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
571 params.data_delta_base.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
572 params.link_rev.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
573 params.parent_rev_1.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
574 params.parent_rev_2.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
575 PyBytes::new(py, ¶ms.node_id) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
576 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
577 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
578 params._sidedata_offset.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
579 params |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
580 ._sidedata_compressed_length |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
581 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
582 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
583 params |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
584 .data_compression_mode |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
585 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
586 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
587 params |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
588 ._sidedata_compression_mode |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
589 .into_py_object(py) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
590 .into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
591 params._rank.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
592 ], |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
593 ) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
594 } |
51192
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
595 |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
596 struct PySnapshotsCache<'p> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
597 py: Python<'p>, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
598 dict: PyDict, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
599 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
600 |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
601 impl<'p> SnapshotsCache for PySnapshotsCache<'p> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
602 fn insert_for( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
603 &mut self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
604 rev: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
605 value: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
606 ) -> Result<(), RevlogError> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
607 let pyvalue = value.into_py_object(self.py).into_object(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
608 match self.dict.get_item(self.py, rev) { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
609 Some(obj) => obj |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
610 .extract::<PySet>(self.py) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
611 .and_then(|set| set.add(self.py, pyvalue)), |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
612 None => PySet::new(self.py, vec![pyvalue]) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
613 .and_then(|set| self.dict.set_item(self.py, rev, set)), |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
614 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
615 .map_err(|_| { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
616 RevlogError::Other(HgError::unsupported( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
617 "Error in Python caches handling", |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
618 )) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
619 }) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
620 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
621 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
622 |
51254
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
623 impl Index { |
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
624 fn new(py: Python, data: PyObject, header: u32) -> PyResult<Self> { |
51190
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
625 // Safety: we keep the buffer around inside the class as `index_mmap` |
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
626 let (buf, bytes) = unsafe { mmap_keeparound(py, data)? }; |
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
627 |
44503
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
628 Self::create_instance( |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
629 py, |
51239
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
630 hg::index::Index::new( |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
631 bytes, |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
632 IndexHeader::parse(&header.to_be_bytes()) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
633 .expect("default header is broken") |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
634 .unwrap(), |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
635 ) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
636 .map_err(|e| { |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
637 revlog_error_with_msg(py, e.to_string().as_bytes()) |
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
51235
diff
changeset
|
638 })?, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
639 RefCell::new(None), |
44509
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
640 RefCell::new(None), |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
641 RefCell::new(None), |
51190
6ec8387eb0be
rust-index: pass data down to the Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51187
diff
changeset
|
642 RefCell::new(Some(buf)), |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
643 RefCell::new(None), |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
644 RefCell::new(None), |
44503
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
645 ) |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
646 } |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
647 |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
648 fn len(&self, py: Python) -> PyResult<usize> { |
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
649 let rust_index_len = self.index(py).borrow().len(); |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
650 Ok(rust_index_len) |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
651 } |
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
652 |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
653 /// This is scaffolding at this point, but it could also become |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
654 /// a way to start a persistent nodemap or perform a |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
655 /// vacuum / repack operation |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
656 fn fill_nodemap( |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
657 &self, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
658 py: Python, |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
659 nt: &mut CoreNodeTree, |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
660 ) -> PyResult<PyObject> { |
51206
952e3cd7568f
rust-index: using the Rust index in nodemap updating methods
Georges Racinet <georges.racinet@octobus.net>
parents:
51205
diff
changeset
|
661 let index = self.index(py).borrow(); |
51193
e79b0a4be3a7
rust-index: check equality between rust and cindex for `__len__`
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
662 for r in 0..self.len(py)? { |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
663 let rev = Revision(r as BaseRevision); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
664 // in this case node() won't ever return None |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
665 nt.insert(&*index, index.node(rev).unwrap(), rev) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
666 .map_err(|e| nodemap_error(py, e))? |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
667 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
668 Ok(py.None()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
669 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
670 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
671 fn get_nodetree<'a>( |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
672 &'a self, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
673 py: Python<'a>, |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
674 ) -> PyResult<&'a RefCell<Option<CoreNodeTree>>> { |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
675 if self.nt(py).borrow().is_none() { |
51120
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
676 let readonly = Box::<Vec<_>>::default(); |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
677 let mut nt = CoreNodeTree::load_bytes(readonly, 0); |
44507
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
678 self.fill_nodemap(py, &mut nt)?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
679 self.nt(py).borrow_mut().replace(nt); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
680 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
681 Ok(self.nt(py)) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
682 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Raphaël Gomès <rgomes@octobus.net>
parents:
44506
diff
changeset
|
683 |
44508
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
684 /// Returns the full nodemap bytes to be written as-is to disk |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
685 fn inner_nodemap_data_all(&self, py: Python) -> PyResult<PyBytes> { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
686 let nodemap = self.get_nodetree(py)?.borrow_mut().take().unwrap(); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
687 let (readonly, bytes) = nodemap.into_readonly_and_added_bytes(); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
688 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
689 // If there's anything readonly, we need to build the data again from |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
690 // scratch |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
691 let bytes = if readonly.len() > 0 { |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
692 let mut nt = CoreNodeTree::load_bytes(Box::<Vec<_>>::default(), 0); |
44508
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
693 self.fill_nodemap(py, &mut nt)?; |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
694 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
695 let (readonly, bytes) = nt.into_readonly_and_added_bytes(); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
696 assert_eq!(readonly.len(), 0); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
697 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
698 bytes |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
699 } else { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
700 bytes |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
701 }; |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
702 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
703 let bytes = PyBytes::new(py, &bytes); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
704 Ok(bytes) |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44507
diff
changeset
|
705 } |
44509
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
706 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
707 /// Returns the last saved docket along with the size of any changed data |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
708 /// (in number of blocks), and said data as bytes. |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
709 fn inner_nodemap_data_incremental( |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
710 &self, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
711 py: Python, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
712 ) -> PyResult<PyObject> { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
713 let docket = self.docket(py).borrow(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
714 let docket = match docket.as_ref() { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
715 Some(d) => d, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
716 None => return Ok(py.None()), |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
717 }; |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
718 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
719 let node_tree = self.get_nodetree(py)?.borrow_mut().take().unwrap(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
720 let masked_blocks = node_tree.masked_readonly_blocks(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
721 let (_, data) = node_tree.into_readonly_and_added_bytes(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
722 let changed = masked_blocks * std::mem::size_of::<Block>(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
723 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
724 Ok((docket, changed, PyBytes::new(py, &data)) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
725 .to_py_object(py) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
726 .into_object()) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44508
diff
changeset
|
727 } |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
728 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
729 /// Update the nodemap from the new (mmaped) data. |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
730 /// The docket is kept as a reference for later incremental calls. |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
731 fn inner_update_nodemap_data( |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
732 &self, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
733 py: Python, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
734 docket: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
735 nm_data: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
736 ) -> PyResult<PyObject> { |
51187
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
737 // Safety: we keep the buffer around inside the class as `nodemap_mmap` |
8c4e8d06432e
rust-mixed-index: move the mmap keepalive into a function
Raphaël Gomès <rgomes@octobus.net>
parents:
51186
diff
changeset
|
738 let (buf, bytes) = unsafe { mmap_keeparound(py, nm_data)? }; |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
739 let len = buf.item_count(); |
51186
8ade5e6cdb61
rust-mixed-index: rename variable to make the next change clearer
Raphaël Gomès <rgomes@octobus.net>
parents:
51120
diff
changeset
|
740 self.nodemap_mmap(py).borrow_mut().replace(buf); |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
741 |
51247
8dbd985733ff
rust-cpython-revlog: renamed NodeTree import as CoreNodeTree
Georges Racinet <georges.racinet@octobus.net>
parents:
51246
diff
changeset
|
742 let mut nt = CoreNodeTree::load_bytes(bytes, len); |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
743 |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
744 let data_tip = docket |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
745 .getattr(py, "tip_rev")? |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
746 .extract::<BaseRevision>(py)? |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
747 .into(); |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
748 self.docket(py).borrow_mut().replace(docket.clone_ref(py)); |
51206
952e3cd7568f
rust-index: using the Rust index in nodemap updating methods
Georges Racinet <georges.racinet@octobus.net>
parents:
51205
diff
changeset
|
749 let idx = self.index(py).borrow(); |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49914
diff
changeset
|
750 let data_tip = idx.check_revision(data_tip).ok_or_else(|| { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49914
diff
changeset
|
751 nodemap_error(py, NodeMapError::RevisionNotInIndex(data_tip)) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49914
diff
changeset
|
752 })?; |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
753 let current_tip = idx.len(); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
754 |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
755 for r in (data_tip.0 + 1)..current_tip as BaseRevision { |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
756 let rev = Revision(r); |
44510
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
757 // in this case node() won't ever return None |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
758 nt.insert(&*idx, idx.node(rev).unwrap(), rev) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
759 .map_err(|e| nodemap_error(py, e))? |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
760 } |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
761 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
762 *self.nt(py).borrow_mut() = Some(nt); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
763 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
764 Ok(py.None()) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44509
diff
changeset
|
765 } |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
766 |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
767 fn inner_getitem(&self, py: Python, key: PyObject) -> PyResult<PyObject> { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
768 let idx = self.index(py).borrow(); |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
769 Ok(match key.extract::<BaseRevision>(py) { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
770 Ok(key_as_int) => { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
771 let entry_params = if key_as_int == NULL_REVISION.0 { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
772 RevisionDataParams::default() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
773 } else { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
774 let rev = UncheckedRevision(key_as_int); |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
775 match idx.entry_as_params(rev) { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
776 Some(e) => e, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
777 None => { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
778 return Err(PyErr::new::<IndexError, _>( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
779 py, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
780 "revlog index out of range", |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
781 )); |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
782 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
783 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
784 }; |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
785 revision_data_params_to_py_tuple(py, entry_params) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
786 .into_object() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
787 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
788 _ => self.get_rev(py, key.extract::<PyBytes>(py)?)?.map_or_else( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
789 || py.None(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
790 |py_rev| py_rev.into_py_object(py).into_object(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
791 ), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
792 }) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51204
diff
changeset
|
793 } |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
794 |
51262
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
795 fn inner_head_node_ids(&self, py: Python) -> PyResult<PyObject> { |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
796 let index = &*self.index(py).borrow(); |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
797 |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
798 // We don't use the shortcut here, as it's actually slower to loop |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
799 // through the cached `PyList` than to re-do the whole computation for |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
800 // large lists, which are the performance sensitive ones anyway. |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
801 let head_revs = index.head_revs().map_err(|e| graph_error(py, e))?; |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
802 let res: Vec<_> = head_revs |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
803 .iter() |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
804 .map(|r| { |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
805 PyBytes::new( |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
806 py, |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
807 index |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
808 .node(*r) |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
809 .expect("rev should have been in the index") |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
810 .as_bytes(), |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
811 ) |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
812 .into_object() |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
813 }) |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
814 .collect(); |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
815 |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
816 self.cache_new_heads_py_list(&head_revs, py); |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
817 self.cache_new_heads_node_ids_py_list(&head_revs, py); |
51262
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
818 |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
819 Ok(PyList::new(py, &res).into_object()) |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
820 } |
f20c4b307a5a
rust-index: add fast-path for getting a list of all heads as nodes
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
821 |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
822 fn inner_headrevs(&self, py: Python) -> PyResult<PyObject> { |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
823 let index = &*self.index(py).borrow(); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
824 if let Some(new_heads) = |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
825 index.head_revs_shortcut().map_err(|e| graph_error(py, e))? |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
826 { |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
827 self.cache_new_heads_py_list(&new_heads, py); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
828 } |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
829 |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
830 Ok(self |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
831 .head_revs_py_list(py) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
832 .borrow() |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
833 .as_ref() |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
834 .expect("head revs should be cached") |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
835 .clone_ref(py) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
836 .into_object()) |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
837 } |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
838 |
51397
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
839 fn check_revision( |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
840 index: &hg::index::Index, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
841 rev: UncheckedRevision, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
842 py: Python, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
843 ) -> PyResult<Revision> { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
844 index |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
845 .check_revision(rev) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
846 .ok_or_else(|| rev_not_in_index(py, rev)) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
847 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
848 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
849 fn inner_headrevsdiff( |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
850 &self, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
851 py: Python, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
852 begin: &PyObject, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
853 end: &PyObject, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
854 ) -> PyResult<PyObject> { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
855 let begin = begin.extract::<BaseRevision>(py)?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
856 let end = end.extract::<BaseRevision>(py)?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
857 let index = &mut *self.index(py).borrow_mut(); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
858 let begin = |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
859 Self::check_revision(index, UncheckedRevision(begin - 1), py)?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
860 let end = Self::check_revision(index, UncheckedRevision(end - 1), py)?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
861 let (removed, added) = index |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
862 .head_revs_diff(begin, end) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
863 .map_err(|e| graph_error(py, e))?; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
864 let removed: Vec<_> = |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
865 removed.into_iter().map(PyRevision::from).collect(); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
866 let added: Vec<_> = added.into_iter().map(PyRevision::from).collect(); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
867 let res = (removed, added).to_py_object(py).into_object(); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
868 Ok(res) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
869 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51263
diff
changeset
|
870 |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
871 fn inner_headrevsfiltered( |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
872 &self, |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
873 py: Python, |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
874 filtered_revs: &PyObject, |
51217
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
875 ) -> PyResult<PyObject> { |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
876 let index = &mut *self.index(py).borrow_mut(); |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
877 let filtered_revs = rev_pyiter_collect(py, filtered_revs, index)?; |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
878 |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
879 if let Some(new_heads) = index |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
880 .head_revs_filtered(&filtered_revs, true) |
51217
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
881 .map_err(|e| graph_error(py, e))? |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
882 { |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
883 self.cache_new_heads_py_list(&new_heads, py); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
884 } |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
885 |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
886 Ok(self |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
887 .head_revs_py_list(py) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
888 .borrow() |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
889 .as_ref() |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
890 .expect("head revs should be cached") |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
891 .clone_ref(py) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
892 .into_object()) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
893 } |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
894 |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
895 fn cache_new_heads_node_ids_py_list( |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
896 &self, |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
897 new_heads: &[Revision], |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
898 py: Python<'_>, |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
899 ) -> PyList { |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
900 let index = self.index(py).borrow(); |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
901 let as_vec: Vec<PyObject> = new_heads |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
902 .iter() |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
903 .map(|r| { |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
904 PyBytes::new( |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
905 py, |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
906 index |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
907 .node(*r) |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
908 .expect("rev should have been in the index") |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
909 .as_bytes(), |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
910 ) |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
911 .into_object() |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
912 }) |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
913 .collect(); |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
914 let new_heads_py_list = PyList::new(py, &as_vec); |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
915 *self.head_node_ids_py_list(py).borrow_mut() = |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
916 Some(new_heads_py_list.clone_ref(py)); |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
917 new_heads_py_list |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
918 } |
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
919 |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
920 fn cache_new_heads_py_list( |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
921 &self, |
51263
5b4995b40db0
rust-index: cache the head nodeids python list
Raphaël Gomès <rgomes@octobus.net>
parents:
51262
diff
changeset
|
922 new_heads: &[Revision], |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
923 py: Python<'_>, |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
924 ) -> PyList { |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
925 let as_vec: Vec<PyObject> = new_heads |
51217
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
926 .iter() |
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
927 .map(|r| PyRevision::from(*r).into_py_object(py).into_object()) |
898674a4dbc7
rust-index: headrevsfiltered() returning Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51216
diff
changeset
|
928 .collect(); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
929 let new_heads_py_list = PyList::new(py, &as_vec); |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
930 *self.head_revs_py_list(py).borrow_mut() = |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
931 Some(new_heads_py_list.clone_ref(py)); |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51258
diff
changeset
|
932 new_heads_py_list |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
933 } |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
934 |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
935 fn inner_ancestors( |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
936 &self, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
937 py: Python, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
938 py_revs: &PyTuple, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
939 ) -> PyResult<PyObject> { |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
940 let index = &*self.index(py).borrow(); |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
941 let revs: Vec<_> = rev_pyiter_collect(py, py_revs.as_object(), index)?; |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
942 let as_vec: Vec<_> = index |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
943 .ancestors(&revs) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
944 .map_err(|e| graph_error(py, e))? |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
945 .iter() |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
946 .map(|r| PyRevision::from(*r).into_py_object(py).into_object()) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
947 .collect(); |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
948 Ok(PyList::new(py, &as_vec).into_object()) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
949 } |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
950 |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
951 fn inner_commonancestorsheads( |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
952 &self, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
953 py: Python, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
954 py_revs: &PyTuple, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
955 ) -> PyResult<PyObject> { |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
956 let index = &*self.index(py).borrow(); |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
957 let revs: Vec<_> = rev_pyiter_collect(py, py_revs.as_object(), index)?; |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
958 let as_vec: Vec<_> = index |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
959 .common_ancestor_heads(&revs) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
960 .map_err(|e| graph_error(py, e))? |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
961 .iter() |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
962 .map(|r| PyRevision::from(*r).into_py_object(py).into_object()) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
963 .collect(); |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
964 Ok(PyList::new(py, &as_vec).into_object()) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
965 } |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51222
diff
changeset
|
966 |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
967 fn inner_computephasesmapsets( |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
968 &self, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
969 py: Python, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
970 py_roots: PyDict, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
971 ) -> PyResult<PyObject> { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
972 let index = &*self.index(py).borrow(); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
973 let roots: Result<HashMap<Phase, Vec<Revision>>, PyErr> = py_roots |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
974 .items_list(py) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
975 .iter(py) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
976 .map(|r| { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
977 let phase = r.get_item(py, 0)?; |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51397
diff
changeset
|
978 let revs: Vec<_> = |
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51397
diff
changeset
|
979 rev_pyiter_collect(py, &r.get_item(py, 1)?, index)?; |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
980 let phase = Phase::try_from(phase.extract::<usize>(py)?) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
981 .map_err(|_| revlog_error(py)); |
51406
f8bf1a8e9181
phases: keep internal state as rev-num instead of node-id
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51397
diff
changeset
|
982 Ok((phase?, revs)) |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
983 }) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
984 .collect(); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
985 let (len, phase_maps) = index |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
986 .compute_phases_map_sets(roots?) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
987 .map_err(|e| graph_error(py, e))?; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
988 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
989 // Ugly hack, but temporary |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
990 const IDX_TO_PHASE_NUM: [usize; 4] = [1, 2, 32, 96]; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
991 let py_phase_maps = PyDict::new(py); |
51426
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
992 for (idx, roots) in phase_maps.into_iter().enumerate() { |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
993 let phase_num = IDX_TO_PHASE_NUM[idx].into_py_object(py); |
51426
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
994 // This is a bit faster than collecting into a `Vec` and passing |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
995 // it to `PySet::new`. |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
996 let set = PySet::empty(py)?; |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
997 for rev in roots { |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
998 set.add(py, PyRevision::from(rev).into_py_object(py))?; |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
999 } |
3099f1c68afd
rust-index: remove one collect when converting back
Raphaël Gomès <rgomes@octobus.net>
parents:
51406
diff
changeset
|
1000 py_phase_maps.set_item(py, phase_num, set)?; |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1001 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1002 Ok(PyTuple::new( |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1003 py, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1004 &[ |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1005 len.into_py_object(py).into_object(), |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1006 py_phase_maps.into_object(), |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1007 ], |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1008 ) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1009 .into_object()) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1010 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
1011 |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1012 fn inner_slicechunktodensity( |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1013 &self, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1014 py: Python, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1015 revs: PyObject, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1016 target_density: f64, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1017 min_gap_size: usize, |
51219
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1018 ) -> PyResult<PyObject> { |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
1019 let index = &*self.index(py).borrow(); |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1020 let revs: Vec<_> = rev_pyiter_collect(py, &revs, index)?; |
51219
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1021 let as_nested_vec = |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1022 index.slice_chunk_to_density(&revs, target_density, min_gap_size); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1023 let mut res = Vec::with_capacity(as_nested_vec.len()); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1024 let mut py_chunk = Vec::new(); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1025 for chunk in as_nested_vec { |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1026 py_chunk.clear(); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1027 py_chunk.reserve_exact(chunk.len()); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1028 for rev in chunk { |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1029 py_chunk.push( |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1030 PyRevision::from(rev).into_py_object(py).into_object(), |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1031 ); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1032 } |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1033 res.push(PyList::new(py, &py_chunk).into_object()); |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1034 } |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1035 // This is just to do the same as C, not sure why it does this |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1036 if res.len() == 1 { |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1037 Ok(PyTuple::new(py, &res).into_object()) |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1038 } else { |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1039 Ok(PyList::new(py, &res).into_object()) |
8cb31833b486
rust-index: slicechunktodensity returns Rust result
Georges Racinet <georges.racinet@octobus.net>
parents:
51218
diff
changeset
|
1040 } |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51217
diff
changeset
|
1041 } |
51222
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1042 |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1043 fn inner_reachableroots2( |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1044 &self, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1045 py: Python, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1046 min_root: UncheckedRevision, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1047 heads: PyObject, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1048 roots: PyObject, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1049 include_path: bool, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1050 ) -> PyResult<PyObject> { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1051 let index = &*self.index(py).borrow(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1052 let heads = rev_pyiter_collect_or_else(py, &heads, index, |_rev| { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1053 PyErr::new::<IndexError, _>(py, "head out of range") |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1054 })?; |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1055 let roots: Result<_, _> = roots |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1056 .iter(py)? |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1057 .map(|r| { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1058 r.and_then(|o| match o.extract::<PyRevision>(py) { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1059 Ok(r) => Ok(UncheckedRevision(r.0)), |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1060 Err(e) => Err(e), |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1061 }) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1062 }) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1063 .collect(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1064 let as_set = index |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1065 .reachable_roots(min_root, heads, roots?, include_path) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1066 .map_err(|e| graph_error(py, e))?; |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1067 let as_vec: Vec<PyObject> = as_set |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1068 .iter() |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1069 .map(|r| PyRevision::from(*r).into_py_object(py).into_object()) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1070 .collect(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1071 Ok(PyList::new(py, &as_vec).into_object()) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1072 } |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1073 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1074 |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1075 py_class!(pub class NodeTree |py| { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1076 data nt: RefCell<CoreNodeTree>; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1077 data index: RefCell<UnsafePyLeaked<PySharedIndex>>; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1078 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1079 def __new__(_cls, index: PyObject) -> PyResult<NodeTree> { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1080 let index = py_rust_index_to_graph(py, index)?; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1081 let nt = CoreNodeTree::default(); // in-RAM, fully mutable |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1082 Self::create_instance(py, RefCell::new(nt), RefCell::new(index)) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1083 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1084 |
51251
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1085 /// Tell whether the NodeTree is still valid |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1086 /// |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1087 /// In case of mutation of the index, the given results are not |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1088 /// guaranteed to be correct, and in fact, the methods borrowing |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1089 /// the inner index would fail because of `PySharedRef` poisoning |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1090 /// (generation-based guard), same as iterating on a `dict` that has |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1091 /// been meanwhile mutated. |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1092 def is_invalidated(&self) -> PyResult<bool> { |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1093 let leaked = self.index(py).borrow(); |
51255
24d3298189d7
rust-index: document safety invariants being upheld for every `unsafe` block
Raphaël Gomès <rgomes@octobus.net>
parents:
51254
diff
changeset
|
1094 // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` |
51251
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1095 let result = unsafe { leaked.try_borrow(py) }; |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1096 // two cases for result to be an error: |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1097 // - the index has previously been mutably borrowed |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1098 // - there is currently a mutable borrow |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1099 // in both cases this amounts for previous results related to |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1100 // the index to still be valid. |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1101 Ok(result.is_err()) |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1102 } |
0409bd6ba663
rust-revlog: add invalidation detection to `NodeTree` class
Georges Racinet <georges.racinet@octobus.net>
parents:
51250
diff
changeset
|
1103 |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1104 def insert(&self, rev: PyRevision) -> PyResult<PyObject> { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1105 let leaked = self.index(py).borrow(); |
51255
24d3298189d7
rust-index: document safety invariants being upheld for every `unsafe` block
Raphaël Gomès <rgomes@octobus.net>
parents:
51254
diff
changeset
|
1106 // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1107 let index = &*unsafe { leaked.try_borrow(py)? }; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1108 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1109 let rev = UncheckedRevision(rev.0); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1110 let rev = index |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1111 .check_revision(rev) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1112 .ok_or_else(|| rev_not_in_index(py, rev))?; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1113 if rev == NULL_REVISION { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1114 return Err(rev_not_in_index(py, rev.into())) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1115 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1116 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1117 let entry = index.inner.get_entry(rev).unwrap(); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1118 let mut nt = self.nt(py).borrow_mut(); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1119 nt.insert(index, entry.hash(), rev).map_err(|e| nodemap_error(py, e))?; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1120 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1121 Ok(py.None()) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1122 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1123 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1124 /// Lookup by node hex prefix in the NodeTree, returning revision number. |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1125 /// |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1126 /// This is not part of the classical NodeTree API, but is good enough |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1127 /// for unit testing, as in `test-rust-revlog.py`. |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1128 def prefix_rev_lookup( |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1129 &self, |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1130 node_prefix: PyBytes |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1131 ) -> PyResult<Option<PyRevision>> { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1132 let prefix = NodePrefix::from_hex(node_prefix.data(py)) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1133 .map_err(|_| PyErr::new::<ValueError, _>( |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1134 py, |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1135 format!("Invalid node or prefix {:?}", |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1136 node_prefix.as_object())) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1137 )?; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1138 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1139 let nt = self.nt(py).borrow(); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1140 let leaked = self.index(py).borrow(); |
51255
24d3298189d7
rust-index: document safety invariants being upheld for every `unsafe` block
Raphaël Gomès <rgomes@octobus.net>
parents:
51254
diff
changeset
|
1141 // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1142 let index = &*unsafe { leaked.try_borrow(py)? }; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1143 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1144 Ok(nt.find_bin(index, prefix) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1145 .map_err(|e| nodemap_error(py, e))? |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1146 .map(|r| r.into()) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1147 ) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1148 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1149 |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1150 def shortest(&self, node: PyBytes) -> PyResult<usize> { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1151 let nt = self.nt(py).borrow(); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1152 let leaked = self.index(py).borrow(); |
51255
24d3298189d7
rust-index: document safety invariants being upheld for every `unsafe` block
Raphaël Gomès <rgomes@octobus.net>
parents:
51254
diff
changeset
|
1153 // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1154 let idx = &*unsafe { leaked.try_borrow(py)? }; |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1155 match nt.unique_prefix_len_node(idx, &node_from_py_bytes(py, &node)?) |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1156 { |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1157 Ok(Some(l)) => Ok(l), |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1158 Ok(None) => Err(revlog_error(py)), |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1159 Err(e) => Err(nodemap_error(py, e)), |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1160 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1161 } |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1162 }); |
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1163 |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1164 fn revlog_error(py: Python) -> PyErr { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1165 match py |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1166 .import("mercurial.error") |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1167 .and_then(|m| m.get(py, "RevlogError")) |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1168 { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1169 Err(e) => e, |
47305
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Raphaël Gomès <rgomes@octobus.net>
parents:
47268
diff
changeset
|
1170 Ok(cls) => PyErr::from_instance( |
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Raphaël Gomès <rgomes@octobus.net>
parents:
47268
diff
changeset
|
1171 py, |
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Raphaël Gomès <rgomes@octobus.net>
parents:
47268
diff
changeset
|
1172 cls.call(py, (py.None(),), None).ok().into_py_object(py), |
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Raphaël Gomès <rgomes@octobus.net>
parents:
47268
diff
changeset
|
1173 ), |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1174 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1175 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1176 |
51231
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1177 fn revlog_error_with_msg(py: Python, msg: &[u8]) -> PyErr { |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1178 match py |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1179 .import("mercurial.error") |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1180 .and_then(|m| m.get(py, "RevlogError")) |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1181 { |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1182 Err(e) => e, |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1183 Ok(cls) => PyErr::from_instance( |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1184 py, |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1185 cls.call(py, (PyBytes::new(py, msg),), None) |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1186 .ok() |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1187 .into_py_object(py), |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1188 ), |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1189 } |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1190 } |
5807e3a8865e
rust-python-index: don't panic on a corrupted index when calling from Python
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
1191 |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1192 fn graph_error(py: Python, _err: hg::GraphError) -> PyErr { |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1193 // ParentOutOfRange is currently the only alternative |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1194 // in `hg::GraphError`. The C index always raises this simple ValueError. |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1195 PyErr::new::<ValueError, _>(py, "parent out of range") |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1196 } |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51214
diff
changeset
|
1197 |
51199
44fbb7dfb563
rust-index: renamed nodemap error function for rev not in index
Georges Racinet <georges.racinet@octobus.net>
parents:
51198
diff
changeset
|
1198 fn nodemap_rev_not_in_index(py: Python, rev: UncheckedRevision) -> PyErr { |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1199 PyErr::new::<ValueError, _>( |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1200 py, |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1201 format!( |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1202 "Inconsistency: Revision {} found in nodemap \ |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1203 is not in revlog index", |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1204 rev |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1205 ), |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1206 ) |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1207 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1208 |
51200
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1209 fn rev_not_in_index(py: Python, rev: UncheckedRevision) -> PyErr { |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1210 PyErr::new::<ValueError, _>( |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1211 py, |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1212 format!("revlog index out of range: {}", rev), |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1213 ) |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1214 } |
bc4d83047c6c
rust-index: helper for revision not in index not involving nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
51199
diff
changeset
|
1215 |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1216 /// Standard treatment of NodeMapError |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1217 fn nodemap_error(py: Python, err: NodeMapError) -> PyErr { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1218 match err { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1219 NodeMapError::MultipleResults => revlog_error(py), |
51199
44fbb7dfb563
rust-index: renamed nodemap error function for rev not in index
Georges Racinet <georges.racinet@octobus.net>
parents:
51198
diff
changeset
|
1220 NodeMapError::RevisionNotInIndex(r) => nodemap_rev_not_in_index(py, r), |
44506
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1221 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1222 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44503
diff
changeset
|
1223 |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1224 /// Create the module, with __package__ given from parent |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1225 pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1226 let dotted_name = &format!("{}.revlog", package); |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1227 let m = PyModule::new(py, dotted_name)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1228 m.add(py, "__package__", package)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1229 m.add(py, "__doc__", "RevLog - Rust implementations")?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1230 |
51254
f94c10334bcb
rust-index: renamed `MixedIndex` as `Index`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51253
diff
changeset
|
1231 m.add_class::<Index>(py)?; |
51249
2966b88d4531
rust-revlog: bare minimal NodeTree exposition
Georges Racinet <georges.racinet@octobus.net>
parents:
51248
diff
changeset
|
1232 m.add_class::<NodeTree>(py)?; |
43961
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1233 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1234 let sys = PyModule::import(py, "sys")?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1235 let sys_modules: PyDict = sys.get(py, "modules")?.extract(py)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1236 sys_modules.set_item(py, dotted_name, &m)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1237 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1238 Ok(m) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43945
diff
changeset
|
1239 } |