Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-cpython/src/revlog.rs @ 47795:3fffb48539ee stable
rust-nodemap: falling back to C impl as mitigation
This is a mitigation for https://bz.mercurial-scm.org/show_bug.cgi?id=6554
We see sometimes almost all data except the most recent revisions
removed from the persistent nodemap, but we don't know how to
reproduce yet.
This has sadly repercussions beyond just needing to reconstruct the
persistent nodemap: for instance, this automatically filters out
all bookmarks pointing to revisions that the nodemap cannot resolve.
If such filtering happens in a transaction, the update of the
bookmarks file that happens at the end of transaction loses all
bookmarks that have been affected. There may be similar consequences
for other data.
So this is a data loss, something that we have to prevent as soon as
possible.
As a mitigation measure, we will now fallback to the C implementation
in case nodemap lookups failed. This will add some latency, e.g., in
discovery, yet less than disabling the persistent nodemap entirely.
We considered implementing the fallback directly on the Python
side, but `revlog.get_rev()` is not systematically used, there are
also several direct calls to the index method (`self.index.rev()` for
a `revlog` instance). It is therefore more direct to implement the
mitigation in the rust-cpython wrapper.
Differential Revision: https://phab.mercurial-scm.org/D11238
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Sun, 01 Aug 2021 14:39:38 +0200 |
parents | 33e7508b0ae9 |
children | aa88fb60ecb4 |
rev | line source |
---|---|
43951
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 // |
44516
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
3 // Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net> |
43951
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 |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
8 use crate::{ |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
9 cindex, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
10 utils::{node_from_py_bytes, node_from_py_object}, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
11 }; |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
12 use cpython::{ |
44520
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
13 buffer::{Element, PyBuffer}, |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
14 exc::{IndexError, ValueError}, |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
15 ObjectProtocol, PyBytes, PyClone, PyDict, PyErr, PyInt, PyModule, |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
16 PyObject, PyResult, PyString, PyTuple, Python, PythonObject, ToPyObject, |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
17 }; |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
18 use hg::{ |
44519
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
19 nodemap::{Block, NodeMapError, NodeTree}, |
46500
18a261b11b20
rust: Remove hex parsing from the nodemap
Simon Sapin <simon.sapin@octobus.net>
parents:
46499
diff
changeset
|
20 revlog::{nodemap::NodeMap, NodePrefix, RevlogIndex}, |
46496
5893706af3de
rust: Simplify error type for reading hex node IDs
Simon Sapin <simon.sapin@octobus.net>
parents:
44521
diff
changeset
|
21 Revision, |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
22 }; |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
23 use std::cell::RefCell; |
43951
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
24 |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
25 /// Return a Struct implementing the Graph trait |
44070
451d22174b5f
revlog: run rustfmt nightly
Augie Fackler <augie@google.com>
parents:
44015
diff
changeset
|
26 pub(crate) fn pyindex_to_graph( |
451d22174b5f
revlog: run rustfmt nightly
Augie Fackler <augie@google.com>
parents:
44015
diff
changeset
|
27 py: Python, |
451d22174b5f
revlog: run rustfmt nightly
Augie Fackler <augie@google.com>
parents:
44015
diff
changeset
|
28 index: PyObject, |
451d22174b5f
revlog: run rustfmt nightly
Augie Fackler <augie@google.com>
parents:
44015
diff
changeset
|
29 ) -> PyResult<cindex::Index> { |
44014
c627f1b2f3c3
rust-index: handle `MixedIndex` in `pyindex_to_graph`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44013
diff
changeset
|
30 match index.extract::<MixedIndex>(py) { |
c627f1b2f3c3
rust-index: handle `MixedIndex` in `pyindex_to_graph`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44013
diff
changeset
|
31 Ok(midx) => Ok(midx.clone_cindex(py)), |
c627f1b2f3c3
rust-index: handle `MixedIndex` in `pyindex_to_graph`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44013
diff
changeset
|
32 Err(_) => cindex::Index::new(py, index), |
c627f1b2f3c3
rust-index: handle `MixedIndex` in `pyindex_to_graph`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44013
diff
changeset
|
33 } |
43951
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
34 } |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
35 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
36 py_class!(pub class MixedIndex |py| { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
37 data cindex: RefCell<cindex::Index>; |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
38 data nt: RefCell<Option<NodeTree>>; |
44519
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
39 data docket: RefCell<Option<PyObject>>; |
44520
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
40 // Holds a reference to the mmap'ed persistent nodemap data |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
41 data mmap: RefCell<Option<PyBuffer>>; |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
42 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
43 def __new__(_cls, cindex: PyObject) -> PyResult<MixedIndex> { |
44513
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
44 Self::new(py, cindex) |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
45 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
46 |
44015
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
47 /// 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:
44014
diff
changeset
|
48 /// |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
49 /// 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:
44014
diff
changeset
|
50 /// 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:
44014
diff
changeset
|
51 /// 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:
44014
diff
changeset
|
52 /// this, by exposing our own standalone nodemap class, |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
53 /// ready to accept `MixedIndex`. |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
54 def get_cindex(&self) -> PyResult<PyObject> { |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
55 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:
44014
diff
changeset
|
56 } |
443dc1655923
rust-index: expose a method to retrieve the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
44014
diff
changeset
|
57 |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
58 // Index API involving nodemap, as defined in mercurial/pure/parsers.py |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
59 |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
60 /// 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:
44516
diff
changeset
|
61 /// in case of ambiguity, same as C version does |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
62 def get_rev(&self, pynode: PyBytes) -> PyResult<Option<Revision>> { |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
63 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:
44516
diff
changeset
|
64 let nt = opt.as_ref().unwrap(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
65 let idx = &*self.cindex(py).borrow(); |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
66 let node = node_from_py_bytes(py, &pynode)?; |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
67 match nt.find_bin(idx, node.into()) |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
68 { |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
69 Ok(None) => |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
70 // fallback to C implementation, remove once |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
71 // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
72 // is fixed (a simple backout should do) |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
73 self.call_cindex(py, "get_rev", &PyTuple::new(py, &[pynode.into_object()]), None)? |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
74 .extract(py), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
75 Ok(Some(rev)) => Ok(Some(rev)), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
76 Err(e) => Err(nodemap_error(py, e)), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
77 } |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
78 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
79 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
80 /// 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:
44516
diff
changeset
|
81 /// is not found. |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
82 /// |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
83 /// 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:
44516
diff
changeset
|
84 /// will catch and rewrap with it |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
85 def rev(&self, node: PyBytes) -> PyResult<Revision> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
86 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:
44516
diff
changeset
|
87 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
88 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
89 /// 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:
44516
diff
changeset
|
90 def has_node(&self, node: PyBytes) -> PyResult<bool> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
91 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:
44516
diff
changeset
|
92 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
93 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
94 /// 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:
44516
diff
changeset
|
95 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:
44516
diff
changeset
|
96 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:
44516
diff
changeset
|
97 let nt = opt.as_ref().unwrap(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
98 let idx = &*self.cindex(py).borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
99 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:
44516
diff
changeset
|
100 { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
101 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:
44516
diff
changeset
|
102 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:
44516
diff
changeset
|
103 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:
44516
diff
changeset
|
104 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
105 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
106 |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
107 def partialmatch(&self, pynode: PyObject) -> PyResult<Option<PyBytes>> { |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
108 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:
44516
diff
changeset
|
109 let nt = opt.as_ref().unwrap(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
110 let idx = &*self.cindex(py).borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
111 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
112 let node_as_string = if cfg!(feature = "python3-sys") { |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
113 pynode.cast_as::<PyString>(py)?.to_string(py)?.to_string() |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
114 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
115 else { |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
116 let node = pynode.extract::<PyBytes>(py)?; |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
117 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:
44516
diff
changeset
|
118 }; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
119 |
46500
18a261b11b20
rust: Remove hex parsing from the nodemap
Simon Sapin <simon.sapin@octobus.net>
parents:
46499
diff
changeset
|
120 let prefix = NodePrefix::from_hex(&node_as_string).map_err(|_| PyErr::new::<ValueError, _>(py, "Invalid node or prefix"))?; |
18a261b11b20
rust: Remove hex parsing from the nodemap
Simon Sapin <simon.sapin@octobus.net>
parents:
46499
diff
changeset
|
121 |
47795
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
122 match nt.find_bin(idx, prefix) { |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
123 Ok(None) => |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
124 // fallback to C implementation, remove once |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
125 // https://bz.mercurial-scm.org/show_bug.cgi?id=6554 |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
126 // is fixed (a simple backout should do) |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
127 self.call_cindex( |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
128 py, "partialmatch", |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
129 &PyTuple::new(py, &[pynode]), None |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
130 )?.extract(py), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
131 Ok(Some(rev)) => |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
132 Ok(Some(PyBytes::new(py, idx.node(rev).unwrap().as_bytes()))), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
133 Err(e) => Err(nodemap_error(py, e)), |
3fffb48539ee
rust-nodemap: falling back to C impl as mitigation
Georges Racinet <georges.racinet@octobus.net>
parents:
47316
diff
changeset
|
134 } |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
135 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
136 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
137 /// 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:
44516
diff
changeset
|
138 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:
44516
diff
changeset
|
139 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:
44516
diff
changeset
|
140 // 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:
44516
diff
changeset
|
141 return Err( |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
142 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:
44516
diff
changeset
|
143 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
144 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:
44516
diff
changeset
|
145 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:
44516
diff
changeset
|
146 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
147 let mut idx = self.cindex(py).borrow_mut(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
148 let rev = idx.len() as Revision; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
149 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
150 idx.append(py, tup)?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
151 self.get_nodetree(py)?.borrow_mut().as_mut().unwrap() |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
152 .insert(&*idx, &node, rev) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
153 .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:
44516
diff
changeset
|
154 Ok(py.None()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
155 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
156 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
157 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:
44516
diff
changeset
|
158 // __delitem__ is both for `del idx[r]` and `del idx[r1:r2]` |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
159 self.cindex(py).borrow().inner().del_item(py, key)?; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
160 let mut opt = self.get_nodetree(py)?.borrow_mut(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
161 let mut nt = opt.as_mut().unwrap(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
162 nt.invalidate_all(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
163 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:
44516
diff
changeset
|
164 Ok(()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
165 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
166 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
167 // |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
168 // Reforwarded C index API |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
169 // |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
170 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
171 // index_methods (tp_methods). Same ordering as in revlog.c |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
172 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
173 /// return the gca set of the given revs |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
174 def ancestors(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
175 self.call_cindex(py, "ancestors", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
176 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
177 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
178 /// return the heads of the common ancestors of the given revs |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
179 def commonancestorsheads(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
180 self.call_cindex(py, "commonancestorsheads", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
181 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
182 |
44521
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44520
diff
changeset
|
183 /// 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:
44520
diff
changeset
|
184 /// It is Python's responsibility to call `update_nodemap_data` again. |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
185 def clearcaches(&self, *args, **kw) -> PyResult<PyObject> { |
44521
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44520
diff
changeset
|
186 self.nt(py).borrow_mut().take(); |
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44520
diff
changeset
|
187 self.docket(py).borrow_mut().take(); |
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44520
diff
changeset
|
188 self.mmap(py).borrow_mut().take(); |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
189 self.call_cindex(py, "clearcaches", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
190 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
191 |
47075
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
192 /// return the raw binary string representing a revision |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
193 def entry_binary(&self, *args, **kw) -> PyResult<PyObject> { |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
194 self.call_cindex(py, "entry_binary", args, kw) |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
195 } |
0d8ff1f4ab0c
revlog: add a `entry_binary` method on index
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46974
diff
changeset
|
196 |
47078
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
197 /// return a binary packed version of the header |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
198 def pack_header(&self, *args, **kw) -> PyResult<PyObject> { |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
199 self.call_cindex(py, "pack_header", args, kw) |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
200 } |
d57386e5c80e
revlog: have an explicit "pack_header" method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47075
diff
changeset
|
201 |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
202 /// get an index entry |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
203 def get(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
204 self.call_cindex(py, "get", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
205 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
206 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
207 /// compute phases |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
208 def computephasesmapsets(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
209 self.call_cindex(py, "computephasesmapsets", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
210 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
211 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
212 /// reachableroots |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
213 def reachableroots2(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
214 self.call_cindex(py, "reachableroots2", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
215 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
216 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
217 /// get head revisions |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
218 def headrevs(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
219 self.call_cindex(py, "headrevs", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
220 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
221 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
222 /// get filtered head revisions |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
223 def headrevsfiltered(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
224 self.call_cindex(py, "headrevsfiltered", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
225 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
226 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
227 /// True if the object is a snapshot |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
228 def issnapshot(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
229 self.call_cindex(py, "issnapshot", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
230 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
231 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
232 /// Gather snapshot data in a cache dict |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
233 def findsnapshots(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
234 self.call_cindex(py, "findsnapshots", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
235 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
236 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
237 /// determine revisions with deltas to reconstruct fulltext |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
238 def deltachain(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
239 self.call_cindex(py, "deltachain", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
240 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
241 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
242 /// slice planned chunk read to reach a density threshold |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
243 def slicechunktodensity(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
244 self.call_cindex(py, "slicechunktodensity", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
245 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
246 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
247 /// stats for the index |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
248 def stats(&self, *args, **kw) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
249 self.call_cindex(py, "stats", args, kw) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
250 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
251 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
252 // index_sequence_methods and index_mapping_methods. |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
253 // |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
254 // 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:
43951
diff
changeset
|
255 // 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:
43951
diff
changeset
|
256 // and index_getitem. |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
257 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
258 def __len__(&self) -> PyResult<usize> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
259 self.cindex(py).borrow().inner().len(py) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
260 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
261 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
262 def __getitem__(&self, key: PyObject) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
263 // this conversion seems needless, but that's actually because |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
264 // `index_getitem` does not handle conversion from PyLong, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
265 // which expressions such as [e for e in index] internally use. |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
266 // Note that we don't seem to have a direct way to call |
44521
cadcc8c20860
rust-nodemap: also clear Rust data in `clearcaches`
Georges Racinet <georges.racinet@octobus.net>
parents:
44520
diff
changeset
|
267 // PySequence_GetItem (does the job), which would possibly be better |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
268 // for performance |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
269 let key = match key.extract::<Revision>(py) { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
270 Ok(rev) => rev.to_py_object(py).into_object(), |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
271 Err(_) => key, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
272 }; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
273 self.cindex(py).borrow().inner().get_item(py, key) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
274 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
275 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
276 def __setitem__(&self, key: PyObject, value: PyObject) -> PyResult<()> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
277 self.cindex(py).borrow().inner().set_item(py, key, value) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
278 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
279 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
280 def __contains__(&self, item: PyObject) -> PyResult<bool> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
281 // 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:
43951
diff
changeset
|
282 // 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:
43951
diff
changeset
|
283 // defined in revlog.c |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
284 let cindex = self.cindex(py).borrow(); |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
285 match item.extract::<Revision>(py) { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
286 Ok(rev) => { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
287 Ok(rev >= -1 && rev < cindex.inner().len(py)? as Revision) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
288 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
289 Err(_) => { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
290 cindex.inner().call_method( |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
291 py, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
292 "has_node", |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
293 PyTuple::new(py, &[item]), |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
294 None)? |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
295 .extract(py) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
296 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
297 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
298 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
299 |
44518
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
300 def nodemap_data_all(&self) -> PyResult<PyBytes> { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
301 self.inner_nodemap_data_all(py) |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
302 } |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
303 |
44519
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
304 def nodemap_data_incremental(&self) -> PyResult<PyObject> { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
305 self.inner_nodemap_data_incremental(py) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
306 } |
44520
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
307 def update_nodemap_data( |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
308 &self, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
309 docket: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
310 nm_data: PyObject |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
311 ) -> PyResult<PyObject> { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
312 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:
44519
diff
changeset
|
313 } |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
314 |
46974
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
315 @property |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
316 def entry_size(&self) -> PyResult<PyInt> { |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
317 self.cindex(py).borrow().inner().getattr(py, "entry_size")?.extract::<PyInt>(py) |
3c9208702db3
revlog: replace revlog._io.size with a new revlog.index.entry_size
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46500
diff
changeset
|
318 } |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
319 |
47279
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
320 @property |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
321 def rust_ext_compat(&self) -> PyResult<PyInt> { |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
322 self.cindex(py).borrow().inner().getattr(py, "rust_ext_compat")?.extract::<PyInt>(py) |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
323 } |
9d1a8829f959
revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47078
diff
changeset
|
324 |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
325 }); |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
326 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
327 impl MixedIndex { |
44513
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
328 fn new(py: Python, cindex: PyObject) -> PyResult<MixedIndex> { |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
329 Self::create_instance( |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
330 py, |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
331 RefCell::new(cindex::Index::new(py, cindex)?), |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
332 RefCell::new(None), |
44519
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
333 RefCell::new(None), |
44520
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
334 RefCell::new(None), |
44513
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
335 ) |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
336 } |
887d0f921b34
rust-index: moved constructor in separate impl block
Georges Racinet <georges.racinet@octobus.net>
parents:
44070
diff
changeset
|
337 |
44517
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
338 /// 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:
44516
diff
changeset
|
339 /// 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:
44516
diff
changeset
|
340 /// vacuum / repack operation |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
341 fn fill_nodemap( |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
342 &self, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
343 py: Python, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
344 nt: &mut NodeTree, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
345 ) -> PyResult<PyObject> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
346 let index = self.cindex(py).borrow(); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
347 for r in 0..index.len() { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
348 let rev = r as Revision; |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
349 // 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:
44516
diff
changeset
|
350 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:
44516
diff
changeset
|
351 .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:
44516
diff
changeset
|
352 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
353 Ok(py.None()) |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
354 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
355 |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
356 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:
44516
diff
changeset
|
357 &'a self, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
358 py: Python<'a>, |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
359 ) -> PyResult<&'a RefCell<Option<NodeTree>>> { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
360 if self.nt(py).borrow().is_none() { |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
361 let readonly = Box::new(Vec::new()); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
362 let mut nt = NodeTree::load_bytes(readonly, 0); |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
363 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:
44516
diff
changeset
|
364 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:
44516
diff
changeset
|
365 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
366 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:
44516
diff
changeset
|
367 } |
857cc79247ac
rust-nodemap: use proper Index API instead of using the C API
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44516
diff
changeset
|
368 |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
369 /// forward a method call to the underlying C index |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
370 fn call_cindex( |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
371 &self, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
372 py: Python, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
373 name: &str, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
374 args: &PyTuple, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
375 kwargs: Option<&PyDict>, |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
376 ) -> PyResult<PyObject> { |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
377 self.cindex(py) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
378 .borrow() |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
379 .inner() |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
380 .call_method(py, name, args, kwargs) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
381 } |
44013
2728fcb8127c
rust-index: make it possible to clone the struct referencing the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43966
diff
changeset
|
382 |
2728fcb8127c
rust-index: make it possible to clone the struct referencing the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43966
diff
changeset
|
383 pub fn clone_cindex(&self, py: Python) -> cindex::Index { |
2728fcb8127c
rust-index: make it possible to clone the struct referencing the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43966
diff
changeset
|
384 self.cindex(py).borrow().clone_ref(py) |
2728fcb8127c
rust-index: make it possible to clone the struct referencing the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43966
diff
changeset
|
385 } |
44518
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
386 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
387 /// 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:
44517
diff
changeset
|
388 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:
44517
diff
changeset
|
389 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:
44517
diff
changeset
|
390 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:
44517
diff
changeset
|
391 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
392 // 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:
44517
diff
changeset
|
393 // scratch |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
394 let bytes = if readonly.len() > 0 { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
395 let mut nt = NodeTree::load_bytes(Box::new(vec![]), 0); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
396 self.fill_nodemap(py, &mut nt)?; |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
397 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
398 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:
44517
diff
changeset
|
399 assert_eq!(readonly.len(), 0); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
400 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
401 bytes |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
402 } else { |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
403 bytes |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
404 }; |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
405 |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
406 let bytes = PyBytes::new(py, &bytes); |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
407 Ok(bytes) |
b581231ae9d1
rust-nodemap: add binding for `nodemap_data_all`
Georges Racinet <georges.racinet@octobus.net>
parents:
44517
diff
changeset
|
408 } |
44519
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
409 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
410 /// 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:
44518
diff
changeset
|
411 /// (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:
44518
diff
changeset
|
412 fn inner_nodemap_data_incremental( |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
413 &self, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
414 py: Python, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
415 ) -> PyResult<PyObject> { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
416 let docket = self.docket(py).borrow(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
417 let docket = match docket.as_ref() { |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
418 Some(d) => d, |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
419 None => return Ok(py.None()), |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
420 }; |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
421 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
422 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:
44518
diff
changeset
|
423 let masked_blocks = node_tree.masked_readonly_blocks(); |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
424 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:
44518
diff
changeset
|
425 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:
44518
diff
changeset
|
426 |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
427 Ok((docket, changed, PyBytes::new(py, &data)) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
428 .to_py_object(py) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
429 .into_object()) |
5bbf887275b0
rust-nodemap: add binding for `nodemap_data_incremental`
Georges Racinet <georges.racinet@octobus.net>
parents:
44518
diff
changeset
|
430 } |
44520
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
431 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
432 /// Update the nodemap from the new (mmaped) data. |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
433 /// 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:
44519
diff
changeset
|
434 fn inner_update_nodemap_data( |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
435 &self, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
436 py: Python, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
437 docket: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
438 nm_data: PyObject, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
439 ) -> PyResult<PyObject> { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
440 let buf = PyBuffer::get(py, &nm_data)?; |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
441 let len = buf.item_count(); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
442 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
443 // Build a slice from the mmap'ed buffer data |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
444 let cbuf = buf.buf_ptr(); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
445 let bytes = if std::mem::size_of::<u8>() == buf.item_size() |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
446 && buf.is_c_contiguous() |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
447 && u8::is_compatible_format(buf.format()) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
448 { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
449 unsafe { std::slice::from_raw_parts(cbuf as *const u8, len) } |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
450 } else { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
451 return Err(PyErr::new::<ValueError, _>( |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
452 py, |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
453 "Nodemap data buffer has an invalid memory representation" |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
454 .to_string(), |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
455 )); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
456 }; |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
457 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
458 // Keep a reference to the mmap'ed buffer, otherwise we get a dangling |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
459 // pointer. |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
460 self.mmap(py).borrow_mut().replace(buf); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
461 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
462 let mut nt = NodeTree::load_bytes(Box::new(bytes), len); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
463 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
464 let data_tip = |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
465 docket.getattr(py, "tip_rev")?.extract::<Revision>(py)?; |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
466 self.docket(py).borrow_mut().replace(docket.clone_ref(py)); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
467 let idx = self.cindex(py).borrow(); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
468 let current_tip = idx.len(); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
469 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
470 for r in (data_tip + 1)..current_tip as Revision { |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
471 let rev = r as Revision; |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
472 // 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:
44519
diff
changeset
|
473 nt.insert(&*idx, idx.node(rev).unwrap(), rev) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
474 .map_err(|e| nodemap_error(py, e))? |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
475 } |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
476 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
477 *self.nt(py).borrow_mut() = Some(nt); |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
478 |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
479 Ok(py.None()) |
15febf99a9c6
rust-nodemap: add binding to `nodemap_update_data`
Georges Racinet <georges.racinet@octobus.net>
parents:
44519
diff
changeset
|
480 } |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
481 } |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
482 |
44516
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
483 fn revlog_error(py: Python) -> PyErr { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
484 match py |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
485 .import("mercurial.error") |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
486 .and_then(|m| m.get(py, "RevlogError")) |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
487 { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
488 Err(e) => e, |
47316
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47279
diff
changeset
|
489 Ok(cls) => PyErr::from_instance( |
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47279
diff
changeset
|
490 py, |
33e7508b0ae9
hg-cpython: fix new occuring TypeError
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47279
diff
changeset
|
491 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:
47279
diff
changeset
|
492 ), |
44516
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
493 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
494 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
495 |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
496 fn rev_not_in_index(py: Python, rev: Revision) -> PyErr { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
497 PyErr::new::<ValueError, _>( |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
498 py, |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
499 format!( |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
500 "Inconsistency: Revision {} found in nodemap \ |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
501 is not in revlog index", |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
502 rev |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
503 ), |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
504 ) |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
505 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
506 |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
507 /// Standard treatment of NodeMapError |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
508 fn nodemap_error(py: Python, err: NodeMapError) -> PyErr { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
509 match err { |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
510 NodeMapError::MultipleResults => revlog_error(py), |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
511 NodeMapError::RevisionNotInIndex(r) => rev_not_in_index(py, r), |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
512 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
513 } |
26dd35ac59b8
rust-nodemap: add utils for propagating errors
Georges Racinet <georges.racinet@octobus.net>
parents:
44513
diff
changeset
|
514 |
43966
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
515 /// 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:
43951
diff
changeset
|
516 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:
43951
diff
changeset
|
517 let dotted_name = &format!("{}.revlog", package); |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
518 let m = PyModule::new(py, dotted_name)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
519 m.add(py, "__package__", package)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
520 m.add(py, "__doc__", "RevLog - Rust implementations")?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
521 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
522 m.add_class::<MixedIndex>(py)?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
523 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
524 let sys = PyModule::import(py, "sys")?; |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
525 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:
43951
diff
changeset
|
526 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:
43951
diff
changeset
|
527 |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
528 Ok(m) |
b69d5f3a41d0
rust-index: add a struct wrapping the C index
Georges Racinet <georges.racinet@octobus.net>
parents:
43951
diff
changeset
|
529 } |