rust/hg-pyo3/src/revlog/mod.rs
author Rapha?l Gom?s <rgomes@octobus.net>
Sun, 05 Jan 2025 23:39:02 +0100
changeset 52841 28f0f00b5dbd
parent 52836 9749a97d3cfb
child 52884 8de68446a5bd
permissions -rw-r--r--
rust-pyo3: rename the `util` file to `utils` This is the convention in the rust code, since all other places are plural.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     1
// revlog.rs
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     2
//
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     3
// Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net>
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     4
//           2020-2024 Raphaël Gomès <raphael.gomes@octobus.net>
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     5
//           2024 Georges Racinet <georges.racinet@cloudcrane.io>
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     6
//
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     7
// This software may be used and distributed according to the terms of the
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     8
// GNU General Public License version 2 or any later version.
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
     9
#![allow(non_snake_case)]
52820
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
    10
use hg::revlog::index::IndexHeader;
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
    11
use hg::revlog::nodemap::Block;
52814
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
    12
use hg::utils::files::get_bytes_from_path;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    13
use pyo3::buffer::PyBuffer;
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    14
use pyo3::conversion::IntoPyObject;
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
    15
use pyo3::exceptions::{PyIndexError, PyTypeError, PyValueError};
52805
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
    16
use pyo3::types::{
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
    17
    PyBool, PyBytes, PyBytesMethods, PyDict, PyList, PySet, PyTuple,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
    18
};
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
    19
use pyo3::{prelude::*, IntoPyObjectExt};
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
    20
use pyo3_sharedref::{PyShareable, SharedByPyObject};
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    21
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
    22
use std::collections::{HashMap, HashSet};
52834
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
    23
use std::os::fd::AsRawFd;
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    24
use std::sync::{
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    25
    atomic::{AtomicUsize, Ordering},
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    26
    RwLock, RwLockReadGuard, RwLockWriteGuard,
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    27
};
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    28
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    29
use hg::{
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
    30
    errors::HgError,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    31
    revlog::{
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
    32
        index::{
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
    33
            Index, Phase, RevisionDataParams, SnapshotsCache, INDEX_ENTRY_SIZE,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
    34
        },
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    35
        inner_revlog::InnerRevlog as CoreInnerRevlog,
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
    36
        nodemap::{NodeMap, NodeMapError, NodeTree as CoreNodeTree},
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    37
        options::RevlogOpenOptions,
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
    38
        RevlogError, RevlogIndex, RevlogType,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    39
    },
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    40
    utils::files::get_path_from_bytes,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    41
    vfs::FnCacheVfs,
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    42
    BaseRevision, Revision, UncheckedRevision, NULL_REVISION,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    43
};
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    44
52841
28f0f00b5dbd rust-pyo3: rename the `util` file to `utils`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52836
diff changeset
    45
use crate::utils::PyBytesDeref;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    46
use crate::{
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    47
    exceptions::{
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
    48
        graph_error, map_lock_error, map_try_lock_error, nodemap_error,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
    49
        rev_not_in_index, revlog_error_bare, revlog_error_from_msg,
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
    50
    },
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
    51
    node::{node_from_py_bytes, node_prefix_from_py_bytes, py_node_for_rev},
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
    52
    revision::{
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
    53
        check_revision, rev_pyiter_collect, rev_pyiter_collect_or_else,
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
    54
        revs_py_list, revs_py_set, PyRevision,
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
    55
    },
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    56
    store::PyFnCache,
52828
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
    57
    transaction::PyTransaction,
52841
28f0f00b5dbd rust-pyo3: rename the `util` file to `utils`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52836
diff changeset
    58
    utils::{new_submodule, take_buffer_with_slice, with_pybytes_buffer},
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    59
};
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    60
52778
523ca3d225f5 rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52775
diff changeset
    61
mod config;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    62
use config::*;
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
    63
mod index;
52836
9749a97d3cfb rust-pyo3: introduce utils to get the pyo3-wrapped index from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52834
diff changeset
    64
pub use index::PySharedIndex;
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    65
use index::{
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    66
    py_tuple_to_revision_data_params, revision_data_params_to_py_tuple,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    67
};
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    68
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
    69
#[pyclass]
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    70
struct ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    71
    inner_revlog: Py<InnerRevlog>,
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    72
}
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    73
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    74
#[pymethods]
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    75
impl ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    76
    fn __enter__(slf: PyRef<'_, Self>) -> PyResult<()> {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    77
        let inner_bound = slf.inner_revlog.bind(slf.py());
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    78
        let shareable = &inner_bound.borrow().irl;
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    79
        // Safety: the owner is correct and we won't use `share()` anyway
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    80
        let core_irl =
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    81
            unsafe { shareable.borrow_with_owner(inner_bound) }.read();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    82
        core_irl
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    83
            .enter_reading_context()
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    84
            .map_err(revlog_error_from_msg)
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    85
            .inspect_err(|_e| {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    86
                // `__exit__` is not called from Python if `__enter__` fails
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    87
                core_irl.exit_reading_context();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    88
            })
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    89
    }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    90
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    91
    #[pyo3(signature = (*_args))]
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    92
    fn __exit__(slf: PyRef<'_, Self>, _args: &Bound<'_, PyTuple>) {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    93
        let inner_bound = slf.inner_revlog.bind(slf.py());
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    94
        let shareable = &inner_bound.borrow().irl;
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    95
        // Safety: the owner is correct and we won't use `share()` anyway
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    96
        let core_irl_ref = unsafe { shareable.borrow_with_owner(inner_bound) };
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    97
        core_irl_ref.read().exit_reading_context();
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    98
    }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
    99
}
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   100
52829
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   101
#[pyclass]
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   102
struct WritingContextManager {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   103
    inner_revlog: Py<InnerRevlog>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   104
    transaction: RwLock<PyTransaction>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   105
    data_end: Option<usize>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   106
}
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   107
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   108
#[pymethods]
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   109
impl WritingContextManager {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   110
    fn __enter__(slf: PyRefMut<'_, Self>) -> PyResult<()> {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   111
        let inner_bound = slf.inner_revlog.bind(slf.py());
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   112
        let shareable = &inner_bound.borrow_mut().irl;
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   113
        // Safety: the owner is correct and we won't use `share()` anyway
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   114
        let mut core_irl =
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   115
            unsafe { shareable.borrow_with_owner(inner_bound) }.write();
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   116
        core_irl
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   117
            .enter_writing_context(
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   118
                slf.data_end,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   119
                &mut *slf
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   120
                    .transaction
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   121
                    .try_write()
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   122
                    .expect("transaction should be protected by the GIL"),
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   123
            )
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   124
            .map_err(revlog_error_from_msg)
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   125
            .inspect_err(|_e| {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   126
                // `__exit__` is not called from Python if `__enter__` fails
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   127
                core_irl.exit_writing_context();
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   128
            })
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   129
    }
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   130
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   131
    #[pyo3(signature = (*_args))]
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   132
    fn __exit__(slf: PyRef<'_, Self>, _args: &Bound<'_, PyTuple>) {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   133
        let inner_bound = slf.inner_revlog.bind(slf.py());
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   134
        let shareable = &inner_bound.borrow().irl;
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   135
        // Safety: the owner is correct and we won't use `share()` anyway
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   136
        let core_irl_ref = unsafe { shareable.borrow_with_owner(inner_bound) };
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   137
        core_irl_ref.write().exit_writing_context();
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   138
    }
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   139
}
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   140
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   141
struct PySnapshotsCache<'a, 'py: 'a>(&'a Bound<'py, PyDict>);
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   142
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   143
impl<'a, 'py> PySnapshotsCache<'a, 'py> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   144
    fn insert_for_with_py_result(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   145
        &self,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   146
        rev: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   147
        value: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   148
    ) -> PyResult<()> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   149
        match self.0.get_item(rev)? {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   150
            Some(obj) => obj.downcast::<PySet>()?.add(value),
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   151
            None => {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   152
                let set = PySet::new(self.0.py(), vec![value])?;
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   153
                self.0.set_item(rev, set)
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   154
            }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   155
        }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   156
    }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   157
}
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   158
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   159
impl<'a, 'py> SnapshotsCache for PySnapshotsCache<'a, 'py> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   160
    fn insert_for(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   161
        &mut self,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   162
        rev: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   163
        value: BaseRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   164
    ) -> Result<(), RevlogError> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   165
        self.insert_for_with_py_result(rev, value).map_err(|_| {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   166
            RevlogError::Other(HgError::unsupported(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   167
                "Error in Python caches handling",
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   168
            ))
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   169
        })
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   170
    }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   171
}
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
   172
52834
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   173
// Only used from Python *tests*
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   174
#[doc(hidden)]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   175
#[pyclass]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   176
pub struct PyFileHandle {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   177
    inner_file: std::os::fd::RawFd,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   178
}
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   179
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   180
#[pymethods]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   181
impl PyFileHandle {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   182
    #[new]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   183
    fn new(handle: std::os::fd::RawFd) -> Self {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   184
        Self { inner_file: handle }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   185
    }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   186
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   187
    fn tell(&self, py: Python<'_>) -> PyResult<PyObject> {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   188
        let locals = PyDict::new(py);
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   189
        locals.set_item("os", py.import("os")?)?;
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   190
        locals.set_item("fd", self.inner_file)?;
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   191
        let f = py.eval(c"os.fdopen(fd)", None, Some(&locals))?;
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   192
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   193
        // Prevent Python from closing the file after garbage collecting.
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   194
        // This is fine since Rust is still holding on to the actual File.
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   195
        // (and also because it's only used in tests).
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   196
        std::mem::forget(f.clone());
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   197
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   198
        locals.set_item("f", f)?;
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   199
        let res = py.eval(c"f.tell()", None, Some(&locals))?;
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   200
        Ok(res.unbind())
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   201
    }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   202
}
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   203
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   204
#[pyclass]
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   205
#[allow(dead_code)]
52836
9749a97d3cfb rust-pyo3: introduce utils to get the pyo3-wrapped index from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52834
diff changeset
   206
pub(crate) struct InnerRevlog {
9749a97d3cfb rust-pyo3: introduce utils to get the pyo3-wrapped index from Python
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52834
diff changeset
   207
    pub(crate) irl: PyShareable<CoreInnerRevlog>,
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   208
    nt: RwLock<Option<CoreNodeTree>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   209
    docket: Option<PyObject>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   210
    // Holds a reference to the mmap'ed persistent nodemap data
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   211
    nodemap_mmap: Option<PyBuffer<u8>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   212
    // Holds a reference to the mmap'ed persistent index data
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   213
    index_mmap: Option<PyBuffer<u8>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   214
    revision_cache: Option<PyObject>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   215
    head_revs_py_list: Option<Py<PyList>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   216
    head_node_ids_py_list: Option<Py<PyList>>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   217
    use_persistent_nodemap: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   218
    nodemap_queries: AtomicUsize,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   219
}
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   220
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   221
#[pymethods]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   222
impl InnerRevlog {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   223
    #[new]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   224
    // The Python side has authority on this signature.
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   225
    #[allow(clippy::too_many_arguments)]
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   226
    fn new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   227
        vfs_base: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   228
        fncache: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   229
        vfs_is_readonly: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   230
        index_data: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   231
        index_file: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   232
        data_file: &Bound<'_, PyBytes>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   233
        sidedata_file: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   234
        inline: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   235
        data_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   236
        delta_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   237
        feature_config: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   238
        chunk_cache: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   239
        default_compression_header: &Bound<'_, PyAny>,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   240
        revlog_type: usize,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   241
        use_persistent_nodemap: bool,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   242
    ) -> PyResult<Self> {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   243
        // Let clippy accept the unused arguments. This is a bit better than
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   244
        // a blank `allow` directive
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   245
        let _ = sidedata_file;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   246
        let _ = chunk_cache;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   247
        let _ = default_compression_header;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   248
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   249
        let index_file = get_path_from_bytes(index_file.as_bytes()).to_owned();
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   250
        let data_file = get_path_from_bytes(data_file.as_bytes()).to_owned();
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   251
        let revlog_type = RevlogType::try_from(revlog_type)
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   252
            .map_err(revlog_error_from_msg)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   253
        let data_config = extract_data_config(data_config, revlog_type)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   254
        let delta_config = extract_delta_config(delta_config, revlog_type)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   255
        let feature_config =
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   256
            extract_feature_config(feature_config, revlog_type)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   257
        let options = RevlogOpenOptions::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   258
            inline,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   259
            data_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   260
            delta_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   261
            feature_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   262
        );
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   263
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   264
        // Safety: we keep the buffer around inside the returned instance as
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   265
        // `index_mmap`
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   266
        let (buf, bytes) = unsafe { take_buffer_with_slice(index_data)? };
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   267
        let index = Index::new(bytes, options.index_header())
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   268
            .map_err(revlog_error_from_msg)?;
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   269
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   270
        let base = get_path_from_bytes(vfs_base.as_bytes()).to_owned();
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   271
        let core = CoreInnerRevlog::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   272
            Box::new(FnCacheVfs::new(
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   273
                base,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   274
                vfs_is_readonly,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   275
                Box::new(PyFnCache::new(fncache.clone().unbind())),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   276
            )),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   277
            index,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   278
            index_file,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   279
            data_file,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   280
            data_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   281
            delta_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   282
            feature_config,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   283
        );
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   284
        Ok(Self {
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   285
            irl: core.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   286
            nt: None.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   287
            docket: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   288
            nodemap_mmap: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   289
            index_mmap: buf.into(),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   290
            head_revs_py_list: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   291
            head_node_ids_py_list: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   292
            revision_cache: None,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   293
            use_persistent_nodemap,
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   294
            nodemap_queries: AtomicUsize::new(0),
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   295
        })
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
   296
    }
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   297
52814
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   298
    #[getter]
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   299
    fn canonical_index_file(
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   300
        slf: &Bound<'_, Self>,
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   301
        py: Python<'_>,
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   302
    ) -> PyResult<Py<PyBytes>> {
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   303
        Self::with_core_read(slf, |_self_ref, irl| {
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   304
            let path = irl.canonical_index_file();
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   305
            Ok(PyBytes::new(py, &get_bytes_from_path(path)).into())
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   306
        })
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   307
    }
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52813
diff changeset
   308
52815
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   309
    #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   310
    fn is_delaying(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   311
        Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_delaying()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   312
    }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   313
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   314
    #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   315
    fn inline(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   316
        Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_inline()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   317
    }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   318
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   319
    #[setter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   320
    fn set_inline(slf: &Bound<'_, Self>, inline: bool) -> PyResult<()> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   321
        Self::with_core_write(slf, |_self_ref, mut irl| {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   322
            irl.inline = inline;
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   323
            Ok(())
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   324
        })
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   325
    }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   326
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   327
    #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   328
    fn is_writing(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   329
        Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_writing()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   330
    }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   331
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   332
    #[getter]
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   333
    fn is_open(slf: &Bound<'_, Self>) -> PyResult<bool> {
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   334
        Self::with_core_read(slf, |_self_ref, irl| Ok(irl.is_open()))
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   335
    }
4e58167a72a5 rust-pyo3-revlog: trivial properties
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52814
diff changeset
   336
52816
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   337
    #[getter]
52831
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   338
    fn _revisioncache(&self, py: Python<'_>) -> PyResult<PyObject> {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   339
        match &self.revision_cache {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   340
            None => Ok(py.None()),
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   341
            Some(cache) => Ok(cache.clone_ref(py)),
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   342
        }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   343
    }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   344
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   345
    #[setter]
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   346
    fn set__revisioncache(
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   347
        slf: &Bound<'_, Self>,
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   348
        py: Python<'_>,
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   349
        value: Option<PyObject>,
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   350
    ) -> PyResult<()> {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   351
        let mut self_ref = slf.borrow_mut();
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   352
        self_ref.revision_cache = value.as_ref().map(|v| v.clone_ref(py));
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   353
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   354
        match value {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   355
            None => {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   356
                // This means the property has been deleted, *not* that the
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   357
                // property has been set to `None`. Whatever happens is up
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   358
                // to the implementation. Here we just set it to `None`.
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   359
                self_ref.revision_cache.take();
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   360
            }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   361
            Some(tuple) => {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   362
                if tuple.is_none(py) {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   363
                    self_ref.revision_cache.take();
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   364
                    return Ok(());
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   365
                }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   366
                drop(self_ref);
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   367
                let tuple: &Bound<'_, PyTuple> = tuple.downcast_bound(py)?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   368
                let node = tuple.get_item(0)?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   369
                let node = node_from_py_bytes(node.downcast()?)?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   370
                let rev: BaseRevision = tuple.get_item(1)?.extract()?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   371
                // Ok because Python only sets this if the revision has been
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   372
                // checked
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   373
                let rev = Revision(rev);
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   374
                let data = tuple.get_item(2)?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   375
                let bytes = data.downcast_into::<PyBytes>()?.unbind();
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   376
                Self::with_core_read(slf, |_self_ref, irl| {
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   377
                    let mut last_revision_cache = irl
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   378
                        .last_revision_cache
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   379
                        .lock()
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   380
                        .expect("lock should not be held");
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   381
                    *last_revision_cache = Some((
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   382
                        node,
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   383
                        rev,
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   384
                        Box::new(PyBytesDeref::new(py, bytes)),
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   385
                    ));
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   386
                    Ok(())
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   387
                })?;
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   388
            }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   389
        }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   390
        Ok(())
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   391
    }
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   392
9e6b50837b37 rust-pyo3-revlog: _revisioncache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52829
diff changeset
   393
    #[getter]
52816
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   394
    fn index_file(
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   395
        slf: &Bound<'_, Self>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   396
        py: Python<'_>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   397
    ) -> PyResult<Py<PyBytes>> {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   398
        Self::with_core_read(slf, |_self_ref, irl| {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   399
            let path = get_bytes_from_path(&irl.index_file);
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   400
            Ok(PyBytes::new(py, &path).unbind())
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   401
        })
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   402
    }
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   403
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   404
    #[setter]
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   405
    fn set_index_file(
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   406
        slf: &Bound<'_, Self>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   407
        path: &Bound<'_, PyBytes>,
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   408
    ) -> PyResult<()> {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   409
        Self::with_core_write(slf, |_self_ref, mut irl| {
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   410
            let path = get_path_from_bytes(path.as_bytes());
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   411
            path.clone_into(&mut irl.index_file);
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   412
            Ok(())
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   413
        })
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   414
    }
6c121468b026 rust-pyo3-revlog: index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52815
diff changeset
   415
52834
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   416
    // This is only used in Python *tests*
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   417
    #[getter]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   418
    #[doc(hidden)]
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   419
    fn _writinghandles(
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   420
        slf: &Bound<'_, Self>,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   421
        py: Python<'_>,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   422
    ) -> PyResult<PyObject> {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   423
        Self::with_core_read(slf, |_self_ref, irl| {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   424
            let handles = irl.python_writing_handles();
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   425
            match handles.as_ref() {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   426
                None => Ok(py.None()),
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   427
                Some(handles) => {
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   428
                    let index_handle = PyFileHandle::new(
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   429
                        handles.index_handle.file.as_raw_fd(),
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   430
                    );
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   431
                    let data_handle = handles
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   432
                        .data_handle
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   433
                        .as_ref()
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   434
                        .map(|h| PyFileHandle::new(h.file.as_raw_fd()));
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   435
                    Ok(PyTuple::new(
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   436
                        py,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   437
                        &[
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   438
                            index_handle.into_py_any(py)?,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   439
                            data_handle.into_py_any(py)?,
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   440
                            py.None(), // Sidedata handle
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   441
                        ],
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   442
                    )?
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   443
                    .unbind()
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   444
                    .into())
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   445
                }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   446
            }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   447
        })
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   448
    }
8ebe20a6fcb7 rust-pyo3-revlog: _writinghandles
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52833
diff changeset
   449
52832
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   450
    fn clear_cache(slf: &Bound<'_, Self>) -> PyResult<PyObject> {
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   451
        assert!(!Self::is_delaying(slf)?);
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   452
        let mut self_ref = slf.borrow_mut();
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   453
        self_ref.revision_cache.take();
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   454
        self_ref.nodemap_queries.store(0, Ordering::Relaxed);
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   455
        drop(self_ref);
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   456
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   457
        Self::with_core_write(slf, |_self_ref, mut irl| {
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   458
            irl.clear_cache();
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   459
            Ok(slf.py().None())
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   460
        })
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   461
    }
c72d8df0c080 rust-pyo3-revlog: clear_cache
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52831
diff changeset
   462
52817
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
   463
    fn issnapshot(slf: &Bound<'_, Self>, rev: PyRevision) -> PyResult<bool> {
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
   464
        Self::_index_issnapshot(slf, rev)
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
   465
    }
5950957af8a3 rust-pyo3-revlog: issnapshot
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52816
diff changeset
   466
52818
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   467
    #[pyo3(signature = (rev, stoprev=None))]
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   468
    fn _deltachain(
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   469
        slf: &Bound<'_, Self>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   470
        py: Python<'_>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   471
        rev: PyRevision,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   472
        stoprev: Option<PyRevision>,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   473
    ) -> PyResult<Py<PyTuple>> {
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   474
        Self::with_index_read(slf, |idx| {
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   475
            let using_general_delta = idx.uses_generaldelta();
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   476
            Self::_index_deltachain(
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   477
                slf,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   478
                py,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   479
                rev,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   480
                stoprev,
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   481
                Some(using_general_delta.into()),
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   482
            )
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   483
        })
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   484
    }
acd76143f868 rust-pyo3-revlog: _deltachain
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52817
diff changeset
   485
52819
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   486
    fn compress(
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   487
        slf: &Bound<'_, Self>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   488
        py: Python<'_>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   489
        data: &Bound<'_, PyAny>,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   490
    ) -> PyResult<Py<PyTuple>> {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   491
        Self::with_core_read(slf, |_self_ref, irl| {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   492
            // Safety: we only hold on to the data for as long as `_buf`
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   493
            // is alive
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   494
            let (_buf, data) = unsafe { take_buffer_with_slice(data)? };
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   495
            let compressed =
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   496
                irl.compress(&data).map_err(revlog_error_from_msg)?;
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   497
            let compressed = compressed.as_deref();
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   498
            let header = if compressed.is_some() {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   499
                PyBytes::new(py, &b""[..])
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   500
            } else {
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   501
                PyBytes::new(py, &b"u"[..])
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   502
            };
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   503
            Ok(PyTuple::new(
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   504
                py,
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   505
                &[header, PyBytes::new(py, compressed.unwrap_or(&data))],
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   506
            )?
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   507
            .unbind())
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   508
        })
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   509
    }
88a69ebbba3b rust-pyo3-revlog: compress
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52818
diff changeset
   510
52820
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   511
    #[pyo3(signature = (tr, header, new_index_file_path=None))]
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   512
    fn split_inline(
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   513
        slf: &Bound<'_, Self>,
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   514
        py: Python<'_>,
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   515
        tr: PyObject,
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   516
        header: i32,
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   517
        new_index_file_path: Option<&Bound<'_, PyBytes>>,
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   518
    ) -> PyResult<Py<PyBytes>> {
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   519
        // Also unused in Python, TODO clean this up.
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   520
        let _ = tr;
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   521
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   522
        Self::with_core_write(slf, |_self_ref, mut irl| {
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   523
            let new_index_file_path = new_index_file_path
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   524
                .map(|path| get_path_from_bytes(path.as_bytes()).to_owned());
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   525
            let header = IndexHeader::parse(&header.to_be_bytes())
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   526
                .expect("invalid header bytes");
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   527
            let old_path = irl
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   528
                .split_inline(header, new_index_file_path)
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   529
                .map_err(revlog_error_from_msg)?;
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   530
            Ok(PyBytes::new(py, &get_bytes_from_path(old_path)).unbind())
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   531
        })
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   532
    }
503752cc7177 rust-pyo3-revlog: split_inline
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52819
diff changeset
   533
52821
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   534
    fn get_segment_for_revs(
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   535
        slf: &Bound<'_, Self>,
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   536
        py: Python<'_>,
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   537
        startrev: PyRevision,
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   538
        endrev: PyRevision,
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   539
    ) -> PyResult<Py<PyTuple>> {
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   540
        Self::with_core_read(slf, |_self_ref, irl| {
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   541
            // Here both revisions only come from revlog code, so we assume
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   542
            // them to be valid.
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   543
            // Panics will alert the offending programmer if not.
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   544
            let (offset, data) = irl
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   545
                .get_segment_for_revs(Revision(startrev.0), Revision(endrev.0))
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   546
                .map_err(revlog_error_from_msg)?;
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   547
            let data = PyBytes::new(py, &data);
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   548
            Ok(PyTuple::new(
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   549
                py,
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   550
                &[offset.into_py_any(py)?, data.into_py_any(py)?],
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   551
            )?
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   552
            .unbind())
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   553
        })
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   554
    }
d90a78ca0bdd rust-pyo3-revlog: get_segment_for_revs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52820
diff changeset
   555
52823
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   556
    fn raw_text(
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   557
        slf: &Bound<'_, Self>,
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   558
        py: Python<'_>,
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   559
        _node: PyObject,
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   560
        rev: PyRevision,
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   561
    ) -> PyResult<Py<PyBytes>> {
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   562
        Self::with_core_read(slf, |_self_ref, irl| {
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   563
            let mut py_bytes = PyBytes::new(py, &[]).unbind();
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   564
            irl.raw_text(Revision(rev.0), |size, f| {
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   565
                py_bytes = with_pybytes_buffer(py, size, f)?;
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   566
                Ok(())
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   567
            })
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   568
            .map_err(revlog_error_from_msg)?;
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   569
            Ok(py_bytes)
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   570
        })
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   571
    }
9435a212a773 rust-pyo3-revlog: raw_text
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52821
diff changeset
   572
52828
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   573
    #[allow(clippy::too_many_arguments)]
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   574
    #[pyo3(signature = (
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   575
        transaction,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   576
        entry,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   577
        data,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   578
        _link,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   579
        offset,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   580
        _sidedata,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   581
        _sidedata_offset,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   582
        index_end,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   583
        data_end,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   584
        _sidedata_end
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   585
    ))]
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   586
    fn write_entry(
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   587
        slf: &Bound<'_, Self>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   588
        py: Python<'_>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   589
        transaction: PyObject,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   590
        entry: &Bound<'_, PyBytes>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   591
        data: &Bound<'_, PyTuple>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   592
        // TODO remove and also from Python
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   593
        _link: PyObject,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   594
        offset: usize,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   595
        // Other underscore args are for revlog-v2, which is unimplemented
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   596
        _sidedata: PyObject,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   597
        _sidedata_offset: u64,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   598
        index_end: Option<u64>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   599
        data_end: Option<u64>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   600
        _sidedata_end: Option<u64>,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   601
    ) -> PyResult<Py<PyTuple>> {
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   602
        Self::with_core_write(slf, |_self_ref, mut irl| {
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   603
            let transaction = PyTransaction::new(transaction);
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   604
            let header = data.get_borrowed_item(0)?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   605
            let header = header.downcast::<PyBytes>()?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   606
            let data = data.get_borrowed_item(1)?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   607
            let data = data.downcast::<PyBytes>()?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   608
            let (idx_pos, data_pos) = irl
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   609
                .write_entry(
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   610
                    transaction,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   611
                    entry.as_bytes(),
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   612
                    (header.as_bytes(), data.as_bytes()),
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   613
                    offset,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   614
                    index_end,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   615
                    data_end,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   616
                )
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   617
                .map_err(revlog_error_from_msg)?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   618
            let tuple = PyTuple::new(
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   619
                py,
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   620
                [idx_pos.into_py_any(py)?, data_pos.into_py_any(py)?],
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   621
            )?;
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   622
            Ok(tuple.unbind())
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   623
        })
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   624
    }
e49794d16657 rust-pyo3-revlog: write_entry
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52826
diff changeset
   625
52825
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   626
    fn delay(
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   627
        slf: &Bound<'_, Self>,
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   628
        py: Python<'_>,
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   629
    ) -> PyResult<Option<Py<PyBytes>>> {
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   630
        Self::with_core_write(slf, |_self_ref, mut irl| {
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   631
            let path = irl.delay().map_err(revlog_error_from_msg)?;
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   632
            Ok(path
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   633
                .map(|p| PyBytes::new(py, &get_bytes_from_path(p)).unbind()))
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   634
        })
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   635
    }
1cd75e5d6347 rust-pyo3-revlog: delay
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52824
diff changeset
   636
52833
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   637
    fn write_pending(
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   638
        slf: &Bound<'_, Self>,
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   639
        py: Python<'_>,
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   640
    ) -> PyResult<Py<PyTuple>> {
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   641
        Self::with_core_write(slf, |_self_ref, mut irl| {
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   642
            let (path, any_pending) =
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   643
                irl.write_pending().map_err(revlog_error_from_msg)?;
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   644
            let maybe_path = match path {
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   645
                Some(path) => PyBytes::new(py, &get_bytes_from_path(path))
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   646
                    .unbind()
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   647
                    .into_any(),
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   648
                None => py.None(),
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   649
            };
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   650
            Ok(
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   651
                PyTuple::new(py, [maybe_path, any_pending.into_py_any(py)?])?
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   652
                    .unbind(),
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   653
            )
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   654
        })
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   655
    }
b7dd7af61488 rust-pyo3-revlog: write_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52832
diff changeset
   656
52826
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   657
    fn finalize_pending(
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   658
        slf: &Bound<'_, Self>,
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   659
        py: Python<'_>,
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   660
    ) -> PyResult<Py<PyBytes>> {
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   661
        Self::with_core_write(slf, |_self_ref, mut irl| {
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   662
            let path =
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   663
                irl.finalize_pending().map_err(revlog_error_from_msg)?;
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   664
            Ok(PyBytes::new(py, &get_bytes_from_path(path)).unbind())
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   665
        })
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   666
    }
9dcba9b379cb rust-pyo3-revlog: finalize_pending
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52825
diff changeset
   667
52824
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   668
    fn _chunk(
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   669
        slf: &Bound<'_, Self>,
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   670
        py: Python<'_>,
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   671
        rev: PyRevision,
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   672
    ) -> PyResult<Py<PyBytes>> {
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   673
        Self::with_core_read(slf, |_self_ref, irl| {
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   674
            let chunk = irl
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   675
                .chunk_for_rev(Revision(rev.0))
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   676
                .map_err(revlog_error_from_msg)?;
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   677
            Ok(PyBytes::new(py, &chunk).unbind())
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   678
        })
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   679
    }
14824d621c2c rust-pyo3-revlog: _chunk
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52823
diff changeset
   680
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   681
    fn reading(slf: &Bound<'_, Self>) -> PyResult<ReadingContextManager> {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   682
        Ok(ReadingContextManager {
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   683
            inner_revlog: slf.clone().unbind(),
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   684
        })
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   685
    }
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   686
52829
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   687
    #[pyo3(signature = (transaction, data_end=None, sidedata_end=None))]
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   688
    fn writing(
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   689
        slf: &Bound<'_, Self>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   690
        transaction: PyObject,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   691
        data_end: Option<usize>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   692
        sidedata_end: Option<usize>,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   693
    ) -> PyResult<WritingContextManager> {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   694
        // Only useful in revlog v2
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   695
        let _ = sidedata_end;
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   696
        Ok(WritingContextManager {
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   697
            inner_revlog: slf.clone().unbind(),
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   698
            transaction: RwLock::new(PyTransaction::new(transaction)),
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   699
            data_end,
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   700
        })
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   701
    }
c82f64877055 rust-pyo3-revlog: writing
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52828
diff changeset
   702
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   703
    //
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   704
    // -- forwarded index methods --
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   705
    //
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   706
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   707
    fn _index_get_rev(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   708
        slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   709
        node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   710
    ) -> PyResult<Option<PyRevision>> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   711
        let node = node_from_py_bytes(node)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   712
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   713
        // Do not rewrite this with `Self::with_index_nt_read`: it makes
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   714
        // inconditionally a volatile nodetree, and that is not the intent
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   715
        // here: the code below specifically avoids that.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   716
        Self::with_core_read(slf, |self_ref, irl| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   717
            let idx = &irl.index;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   718
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   719
            let prev_queries =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   720
                self_ref.nodemap_queries.fetch_add(1, Ordering::Relaxed);
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   721
            // Filelogs have no persistent nodemaps and are often small,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   722
            // use a brute force lookup from the end
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   723
            // backwards. If there is a very large filelog
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   724
            // (automation file that changes every
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   725
            // commit etc.), it also seems to work quite well for
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   726
            // all measured purposes so far.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   727
            if !self_ref.use_persistent_nodemap && prev_queries <= 3 {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   728
                return Ok(idx
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   729
                    .rev_from_node_no_persistent_nodemap(node.into())
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   730
                    .ok()
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   731
                    .map(Into::into));
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   732
            }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   733
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   734
            let opt =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   735
                self_ref.get_nodetree(idx)?.read().map_err(map_lock_error)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   736
            let nt = opt.as_ref().expect("nodetree should be set");
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   737
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   738
            let rust_rev =
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   739
                nt.find_bin(idx, node.into()).map_err(nodemap_error)?;
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   740
            Ok(rust_rev.map(Into::into))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   741
        })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   742
    }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   743
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   744
    /// same as `_index_get_rev()` but raises a bare `error.RevlogError` if
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   745
    /// node is not found.
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   746
    ///
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   747
    /// No need to repeat `node` in the exception, `mercurial/revlog.py`
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   748
    /// will catch and rewrap with it
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   749
    fn _index_rev(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   750
        slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   751
        node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   752
    ) -> PyResult<PyRevision> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   753
        Self::_index_get_rev(slf, node)?.ok_or_else(revlog_error_bare)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   754
    }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   755
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   756
    /// return True if the node exist in the index
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   757
    fn _index_has_node(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   758
        slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   759
        node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   760
    ) -> PyResult<bool> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   761
        Self::_index_get_rev(slf, node).map(|opt| opt.is_some())
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   762
    }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   763
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   764
    /// find length of shortest hex nodeid of a binary ID
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   765
    fn _index_shortest(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   766
        slf: &Bound<'_, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   767
        node: &Bound<'_, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   768
    ) -> PyResult<usize> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   769
        Self::with_index_nt_read(slf, |idx, nt| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   770
            match nt.unique_prefix_len_node(idx, &node_from_py_bytes(node)?) {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   771
                Ok(Some(l)) => Ok(l),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   772
                Ok(None) => Err(revlog_error_bare()),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   773
                Err(e) => Err(nodemap_error(e)),
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   774
            }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   775
        })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   776
    }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   777
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   778
    fn _index_partialmatch<'py>(
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   779
        slf: &Bound<'py, Self>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   780
        node: &Bound<'py, PyBytes>,
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   781
    ) -> PyResult<Option<Bound<'py, PyBytes>>> {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   782
        Self::with_index_nt_read(slf, |idx, nt| {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   783
            Ok(nt
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   784
                .find_bin(idx, node_prefix_from_py_bytes(node)?)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   785
                .map_err(nodemap_error)?
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   786
                .map(|rev| py_node_for_rev(slf.py(), idx, rev)))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   787
        })
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
   788
    }
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
   789
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   790
    /// append an index entry
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   791
    fn _index_append(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   792
        slf: &Bound<'_, Self>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   793
        tup: &Bound<'_, PyTuple>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   794
    ) -> PyResult<()> {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   795
        // no need to check length: in PyO3 tup.get_item() does return
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   796
        // proper errors
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   797
        let node_bytes = tup.get_item(7)?.extract()?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   798
        let node = node_from_py_bytes(&node_bytes)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   799
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   800
        Self::with_index_nt_write(slf, |idx, nt| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   801
            let rev = idx.len() as BaseRevision;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   802
            // This is ok since we will immediately add the revision to the
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   803
            // index
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   804
            let rev = Revision(rev);
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   805
            idx.append(py_tuple_to_revision_data_params(tup)?)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   806
                .map_err(revlog_error_from_msg)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   807
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   808
            nt.insert(idx, &node, rev).map_err(nodemap_error)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   809
            Ok(())
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   810
        })
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   811
    }
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   812
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   813
    /// Removes one or several entries from the index.
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   814
    ///
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   815
    /// Historically, on the Mercurial revlog index, `__delitem__` has always
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   816
    /// been both for `del idx[r1]` and `del idx[r1:r2]`. In both cases,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   817
    /// all entries starting from `r1` are removed anyway.
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   818
    fn _index___delitem__(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   819
        slf: &Bound<'_, Self>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   820
        arg: &Bound<'_, PyAny>,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   821
    ) -> PyResult<()> {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   822
        let start = if let Ok(rev) = arg.extract() {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   823
            UncheckedRevision(rev)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   824
        } else {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   825
            // here we could downcast to `PySlice` and use `indices()`, *but*
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   826
            // the rust-cpython based version could not do that, and
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   827
            // `indices()` does some resolving that makes it not equivalent,
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   828
            // e.g., `idx[-1::]` has `start=0`. As we are currently in
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   829
            // transition, we keep it the old way (hoping it was consistent
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   830
            // with the C index).
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   831
            let start = arg.getattr("start")?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   832
            UncheckedRevision(start.extract()?)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   833
        };
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   834
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   835
        Self::with_index_nt_write(slf, |idx, nt| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   836
            // In the case of a slice, the check is possibly already done by
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   837
            // `slice.indices`, which is itself an FFI wrapper for CPython's
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   838
            // `PySlice_GetIndicesEx`
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   839
            // (Python integration tests will tell us)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   840
            let start = idx.check_revision(start).ok_or_else(|| {
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   841
                nodemap_error(NodeMapError::RevisionNotInIndex(start))
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   842
            })?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   843
            idx.remove(start).map_err(revlog_error_from_msg)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   844
            nt.invalidate_all();
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   845
            Self::fill_nodemap(idx, nt)?;
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   846
            Ok(())
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   847
        })
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   848
    }
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52788
diff changeset
   849
52800
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   850
    /// return the gca set of the given revs
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   851
    #[pyo3(signature = (*revs))]
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   852
    fn _index_ancestors(
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   853
        slf: &Bound<'_, Self>,
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   854
        revs: &Bound<'_, PyTuple>,
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   855
    ) -> PyResult<PyObject> {
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   856
        Self::with_index_read(slf, |idx| {
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   857
            let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   858
            Ok(PyList::new(
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   859
                slf.py(),
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   860
                idx.ancestors(&revs)
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   861
                    .map_err(graph_error)?
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   862
                    .into_iter()
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   863
                    .map(PyRevision::from),
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   864
            )?
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   865
            .into_any()
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   866
            .unbind())
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   867
        })
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   868
    }
ebcbd2b7a3b6 rust-pyo3-revlog: _index_ancestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52799
diff changeset
   869
52801
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   870
    /// return the heads of the common ancestors of the given revs
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   871
    #[pyo3(signature = (*revs))]
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   872
    fn _index_commonancestorsheads(
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   873
        slf: &Bound<'_, Self>,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   874
        revs: &Bound<'_, PyTuple>,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   875
    ) -> PyResult<Py<PyList>> {
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   876
        Self::with_index_read(slf, |idx| {
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   877
            let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   878
            revs_py_list(
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   879
                slf.py(),
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   880
                idx.common_ancestor_heads(&revs).map_err(graph_error)?,
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   881
            )
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   882
        })
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   883
    }
419e60ff3c44 rust-pyo3-revlog: _index_commonancestorsheads
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52800
diff changeset
   884
52802
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   885
    /// Clear the index caches and inner py_class data.
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   886
    /// It is Python's responsibility to call `update_nodemap_data` again.
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   887
    fn _index_clearcaches(slf: &Bound<'_, Self>) -> PyResult<()> {
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   888
        Self::with_index_write(slf, |idx| {
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   889
            idx.clear_caches();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   890
            Ok(())
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   891
        })?;
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   892
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   893
        let mut self_ref = slf.borrow_mut();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   894
        self_ref.nt.write().map_err(map_lock_error)?.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   895
        self_ref.docket.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   896
        self_ref.nodemap_mmap.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   897
        self_ref.head_revs_py_list.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   898
        self_ref.head_node_ids_py_list.take();
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   899
        Ok(())
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   900
    }
8cb1a561c5ac rust-pyo3-revlog: _index_clearcaches
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52801
diff changeset
   901
52804
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   902
    /// return the raw binary string representing a revision
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   903
    fn _index_entry_binary(
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   904
        slf: &Bound<'_, Self>,
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   905
        rev: PyRevision,
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   906
    ) -> PyResult<Py<PyBytes>> {
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   907
        let rev: UncheckedRevision = rev.into();
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   908
        Self::with_index_read(slf, |idx| {
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   909
            idx.check_revision(rev)
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   910
                .and_then(|r| idx.entry_binary(r))
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   911
                .map(|rust_bytes| PyBytes::new(slf.py(), rust_bytes).unbind())
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   912
                .ok_or_else(|| rev_not_in_index(rev))
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   913
        })
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   914
    }
6c6cfb89a4f1 rust-pyo3-revlog: _index_entry_binary
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52803
diff changeset
   915
52803
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   916
    /// return a binary packed version of the header
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   917
    fn _index_pack_header(
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   918
        slf: &Bound<'_, Self>,
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   919
        header: i32,
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   920
    ) -> PyResult<Py<PyBytes>> {
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   921
        let packed =
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   922
            Self::with_index_read(slf, |idx| Ok(idx.pack_header(header)))?;
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   923
        Ok(PyBytes::new(slf.py(), &packed).unbind())
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   924
    }
3bfd80a277be rust-pyo3-revlog: _index_pack_header
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52802
diff changeset
   925
52808
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   926
    /// compute phases
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   927
    fn _index_computephasesmapsets(
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   928
        slf: &Bound<'_, Self>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   929
        py: Python<'_>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   930
        roots: &Bound<'_, PyDict>,
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   931
    ) -> PyResult<Py<PyTuple>> {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   932
        let (len, phase_maps) = Self::with_index_read(slf, |idx| {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   933
            let extracted_roots: PyResult<HashMap<Phase, Vec<Revision>>> =
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   934
                roots
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   935
                    .iter()
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   936
                    .map(|(phase, revs)| {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   937
                        let phase = Phase::try_from(phase.extract::<usize>()?)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   938
                            .map_err(|_| revlog_error_bare())?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   939
                        let revs: Vec<Revision> =
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   940
                            rev_pyiter_collect(&revs, idx)?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   941
                        Ok((phase, revs))
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   942
                    })
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   943
                    .collect();
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   944
            idx.compute_phases_map_sets(extracted_roots?)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   945
                .map_err(graph_error)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   946
        })?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   947
        // Ugly hack, but temporary (!)
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   948
        const IDX_TO_PHASE_NUM: [usize; 4] = [1, 2, 32, 96];
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   949
        let py_phase_maps = PyDict::new(py);
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   950
        for (i, roots) in phase_maps.into_iter().enumerate() {
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   951
            py_phase_maps.set_item(
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   952
                IDX_TO_PHASE_NUM[i],
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   953
                revs_py_set(py, roots)?.into_any(),
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   954
            )?;
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   955
        }
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   956
        Ok((len, py_phase_maps).into_pyobject(py)?.unbind())
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   957
    }
6222326bd13e rust-pyo3-revlog: _index_computephasesmapsets
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52806
diff changeset
   958
52796
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   959
    /// reachableroots
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   960
    #[pyo3(signature = (*args))]
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   961
    fn _index_reachableroots2(
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   962
        slf: &Bound<'_, Self>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   963
        py: Python<'_>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   964
        args: &Bound<'_, PyTuple>,
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   965
    ) -> PyResult<Py<PyList>> {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   966
        // TODO what was the point of having a signature with variable args?
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   967
        let min_root = UncheckedRevision(args.get_item(0)?.extract()?);
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   968
        let heads = args.get_item(1)?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   969
        let roots = args.get_item(2)?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   970
        let include_path: bool = args.get_item(3)?.extract()?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   971
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   972
        let as_set = Self::with_index_read(slf, |idx| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   973
            let heads = rev_pyiter_collect_or_else(&heads, idx, |_rev| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   974
                PyIndexError::new_err("head out of range")
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   975
            })?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   976
            let roots: Result<_, _> = roots
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   977
                .try_iter()?
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   978
                .map(|r| {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   979
                    r.and_then(|o| match o.extract::<PyRevision>() {
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   980
                        Ok(r) => Ok(UncheckedRevision(r.0)),
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   981
                        Err(e) => Err(e),
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   982
                    })
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   983
                })
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   984
                .collect();
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   985
            idx.reachable_roots(min_root, heads, roots?, include_path)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   986
                .map_err(graph_error)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   987
        })?;
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   988
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   989
        revs_py_list(py, as_set)
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   990
    }
670ebb2f975a rust-pyo3-revlog: reachable roots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
   991
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   992
    #[pyo3(signature = (*args))]
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   993
    fn _index_headrevs(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   994
        slf: &Bound<'_, Self>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   995
        py: Python<'_>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   996
        args: &Bound<'_, PyTuple>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   997
    ) -> PyResult<Py<PyList>> {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   998
        let (filtered_revs, stop_rev) = match args.len() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
   999
            0 => Ok((None, None)),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1000
            1 => Ok((Some(args.get_item(0)?), None)),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1001
            2 => Ok((Some(args.get_item(0)?), Some(args.get_item(1)?))),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1002
            _ => Err(PyTypeError::new_err("too many arguments")),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1003
        }?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1004
        let stop_rev = stop_rev
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1005
            .map(|o| o.extract::<Option<i32>>())
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1006
            .transpose()?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1007
            .flatten();
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1008
        let filtered_revs = filtered_revs.filter(|o| !o.is_none());
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1009
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1010
        let (from_core, stop_rev) = Self::with_index_read(slf, |idx| {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1011
            let stop_rev = stop_rev
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1012
                // should this not just be the normal checking?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1013
                .filter(|rev| 0 <= *rev && *rev < idx.len() as BaseRevision)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1014
                .map(Revision);
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1015
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1016
            let from_core = if let Some(filtered_revs) = filtered_revs {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1017
                let filtered_revs = rev_pyiter_collect(&filtered_revs, idx)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1018
                idx.head_revs_advanced(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1019
                    &filtered_revs,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1020
                    stop_rev,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1021
                    stop_rev.is_none(),
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1022
                )
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1023
            } else if stop_rev.is_some() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1024
                idx.head_revs_advanced(&HashSet::new(), stop_rev, false)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1025
            } else {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1026
                idx.head_revs_shortcut()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1027
            }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1028
            .map_err(graph_error)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1029
            Ok((from_core, stop_rev))
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1030
        })?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1031
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1032
        if stop_rev.is_some() {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1033
            // we don't cache result for now
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1034
            let new_heads =
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1035
                from_core.expect("this case should not be cached yet");
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1036
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1037
            revs_py_list(py, new_heads)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1038
        } else {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1039
            if let Some(new_heads) = from_core {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1040
                Self::cache_new_heads_py_list(slf, new_heads)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1041
            }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1042
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1043
            Ok(slf
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1044
                .borrow()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1045
                .head_revs_py_list
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1046
                .as_ref()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1047
                .expect("head revs should be cached")
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1048
                .clone_ref(py))
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1049
        }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1050
    }
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1051
52810
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1052
    /// get head nodeids
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1053
    fn _index_head_node_ids(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1054
        slf: &Bound<'_, Self>,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1055
        py: Python<'_>,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1056
    ) -> PyResult<Py<PyList>> {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1057
        let (head_revs, head_nodes) = Self::with_index_read(slf, |idx| {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1058
            // We don't use the shortcut here, as it's actually slower to loop
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1059
            // through the cached `PyList` than to re-do the whole
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1060
            // conversion for large lists, which are the performance
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1061
            // sensitive ones anyway.
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1062
            let head_revs = idx.head_revs().map_err(graph_error)?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1063
            let head_nodes = PyList::new(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1064
                py,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1065
                head_revs.iter().map(|r| {
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1066
                    PyBytes::new(
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1067
                        py,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1068
                        idx.node(*r)
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1069
                            .expect("rev should have been in the index")
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1070
                            .as_bytes(),
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1071
                    )
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1072
                    .unbind()
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1073
                }),
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1074
            )?
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1075
            .unbind();
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1076
            Ok((head_revs, head_nodes))
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1077
        })?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1078
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1079
        Self::cache_new_heads_py_list(slf, head_revs)?;
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1080
        // TODO discussion with Alphare: in hg-cpython,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1081
        // `cache_new_heads_node_ids_py_list` reconverts `head_nodes`,
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1082
        // to store it in the cache attr that is **not actually used**.
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1083
        // Should we drop the idea of this cache definition or actually
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1084
        // use it? Perhaps in a later move for perf assessment?
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1085
        Ok(head_nodes)
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1086
    }
09544af536ef rust-pyo3-revlog: _index_node_ids
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52809
diff changeset
  1087
52809
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1088
    /// get diff in head revisions
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1089
    fn _index_headrevsdiff(
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1090
        slf: &Bound<'_, Self>,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1091
        py: Python<'_>,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1092
        begin: PyRevision,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1093
        end: PyRevision,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1094
    ) -> PyResult<Py<PyTuple>> {
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1095
        let begin: BaseRevision = begin.0 - 1;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1096
        let end: BaseRevision = end.0 - 1;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1097
        let (removed, added) = Self::with_index_read(slf, |idx| {
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1098
            idx.head_revs_diff(
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1099
                check_revision(idx, begin)?,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1100
                check_revision(idx, end)?,
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1101
            )
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1102
            .map_err(graph_error)
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1103
        })?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1104
        let py_removed = revs_py_list(py, removed)?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1105
        let py_added = revs_py_list(py, added)?;
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1106
        Ok((py_removed, py_added).into_pyobject(py)?.unbind())
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1107
    }
6bd11e3e05d6 rust-pyo3-revlog: _index_headrevsdiff
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52808
diff changeset
  1108
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1109
    /// True if the object is a snapshot
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1110
    fn _index_issnapshot(
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1111
        slf: &Bound<'_, Self>,
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1112
        rev: PyRevision,
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1113
    ) -> PyResult<bool> {
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1114
        let rev: UncheckedRevision = rev.into();
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1115
        let rev = Self::with_index_read(slf, |idx| {
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1116
            idx.check_revision(rev).ok_or_else(|| rev_not_in_index(rev))
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1117
        })?;
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1118
        Self::with_core_read(slf, |_self_ref, irl| {
52797
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1119
            irl.is_snapshot(rev)
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1120
                .map_err(|e| PyValueError::new_err(e.to_string()))
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1121
        })
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1122
    }
f76911bfbfb1 rust-pyo3-revlog: issnapshot
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52796
diff changeset
  1123
52799
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1124
    /// Gather snapshot data in a cache dict
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1125
    fn _index_findsnapshots(
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1126
        slf: &Bound<'_, Self>,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1127
        cache: &Bound<'_, PyDict>,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1128
        start_rev: PyRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1129
        end_rev: PyRevision,
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1130
    ) -> PyResult<()> {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1131
        let mut cache = PySnapshotsCache(cache);
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1132
        Self::with_index_read(slf, |idx| {
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1133
            idx.find_snapshots(start_rev.into(), end_rev.into(), &mut cache)
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1134
                .map_err(|_| revlog_error_bare())
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1135
        })?;
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1136
        Ok(())
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1137
    }
798355e46d03 rust-pyo3-revlog: _index_findsnapshots
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52798
diff changeset
  1138
52805
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1139
    /// determine revisions with deltas to reconstruct fulltext
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1140
    #[pyo3(signature = (rev, stop_rev, using_general_delta))]
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1141
    fn _index_deltachain(
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1142
        slf: &Bound<'_, Self>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1143
        py: Python<'_>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1144
        rev: PyRevision,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1145
        stop_rev: Option<PyRevision>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1146
        using_general_delta: Option<u32>,
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1147
    ) -> PyResult<Py<PyTuple>> {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1148
        let using_general_delta = using_general_delta.map(|i| i != 0);
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1149
        let rev: UncheckedRevision = rev.into();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1150
        let stop_rev: Option<UncheckedRevision> = stop_rev.map(Into::into);
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1151
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1152
        let (chain, stopped) = Self::with_index_read(slf, |idx| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1153
            let rev = idx.check_revision(rev).ok_or_else(|| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1154
                nodemap_error(NodeMapError::RevisionNotInIndex(rev))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1155
            })?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1156
            let stop_rev = stop_rev
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1157
                .map(|r| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1158
                    idx.check_revision(r).ok_or_else(|| {
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1159
                        nodemap_error(NodeMapError::RevisionNotInIndex(
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1160
                            rev.into(),
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1161
                        ))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1162
                    })
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1163
                })
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1164
                .transpose()?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1165
            idx.delta_chain(rev, stop_rev, using_general_delta)
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1166
                .map_err(|e| PyValueError::new_err(e.to_string()))
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1167
        })?;
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1168
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1169
        let py_chain = revs_py_list(py, chain)?.into_any();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1170
        let py_stopped =
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1171
            PyBool::new(py, stopped).to_owned().unbind().into_any();
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1172
        Ok((py_chain, py_stopped).into_pyobject(py)?.unbind())
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1173
    }
a8debfd85d55 rust-pyo3-revlog: _index_deltachain
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52804
diff changeset
  1174
52806
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1175
    /// slice planned chunk read to reach a density threshold
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1176
    fn _index_slicechunktodensity(
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1177
        slf: &Bound<'_, Self>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1178
        py: Python<'_>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1179
        revs: &Bound<'_, PyAny>,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1180
        target_density: f64,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1181
        min_gap_size: usize,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1182
    ) -> PyResult<PyObject> {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1183
        let as_nested_vec =
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1184
            Self::with_index_read(slf, |idx| {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1185
                let revs: Vec<_> = rev_pyiter_collect(revs, idx)?;
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1186
                Ok(idx.slice_chunk_to_density(
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1187
                    &revs,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1188
                    target_density,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1189
                    min_gap_size,
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1190
                ))
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1191
            })?;
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1192
        let res_len = as_nested_vec.len();
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1193
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1194
        // cannot build the outer sequence from iterator, because
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1195
        // `rev_py_list()` returns `Result<T>` instead of `T`.
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1196
        let mut res = Vec::with_capacity(res_len);
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1197
        for chunk in as_nested_vec {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1198
            res.push(revs_py_list(py, chunk)?.into_any());
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1199
        }
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1200
        // This is just to do the same as C, not sure why it does this
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1201
        Ok(if res_len == 1 {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1202
            PyTuple::new(py, res)?.unbind().into_any()
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1203
        } else {
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1204
            PyList::new(py, res)?.unbind().into_any()
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1205
        })
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1206
    }
0a0ed46ef6d6 rust-pyo3-revlog: _index_slicechunktodensity
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52805
diff changeset
  1207
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
  1208
    fn _index___len__(slf: &Bound<'_, Self>) -> PyResult<usize> {
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
  1209
        Self::with_index_read(slf, |idx| Ok(idx.len()))
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
  1210
    }
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1211
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1212
    fn _index___getitem__(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1213
        slf: &Bound<'_, Self>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1214
        py: Python<'_>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1215
        key: &Bound<'_, PyAny>,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1216
    ) -> PyResult<PyObject> {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1217
        Self::with_index_read(slf, |idx| {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1218
            match key.extract::<BaseRevision>() {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1219
                Ok(key_as_int) => {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1220
                    let entry_params = if key_as_int == NULL_REVISION.0 {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1221
                        RevisionDataParams::default()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1222
                    } else {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1223
                        let rev = UncheckedRevision(key_as_int);
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1224
                        match idx.entry_as_params(rev) {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1225
                            Some(e) => e,
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1226
                            None => {
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1227
                                return Err(PyIndexError::new_err(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1228
                                    "revlog index out of range",
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1229
                                ));
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1230
                            }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1231
                        }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1232
                    };
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1233
                    Ok(revision_data_params_to_py_tuple(py, entry_params)?
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1234
                        .into_any()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1235
                        .unbind())
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1236
                }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1237
                // Case when key is a binary Node ID (lame: we're re-unlocking)
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1238
                _ => Self::_index_get_rev(slf, key.downcast::<PyBytes>()?)?
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1239
                    .map_or_else(
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1240
                        || Ok(py.None()),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1241
                        |py_rev| Ok(py_rev.into_pyobject(py)?.unbind().into()),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1242
                    ),
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1243
            }
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1244
        })
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
  1245
    }
52798
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1246
52811
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1247
    /// Returns the full nodemap bytes to be written as-is to disk
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1248
    fn _index_nodemap_data_all(
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1249
        slf: &Bound<'_, Self>,
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1250
        py: Python<'_>,
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1251
    ) -> PyResult<Py<PyBytes>> {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1252
        Self::with_index_nt_write(slf, |idx, nt| {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1253
            let old_nt = std::mem::take(nt);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1254
            let (readonly, bytes) = old_nt.into_readonly_and_added_bytes();
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1255
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1256
            // If there's anything readonly, we need to build the data again
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1257
            // from scratch
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1258
            let bytes = if readonly.len() > 0 {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1259
                let mut nt =
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1260
                    CoreNodeTree::load_bytes(Box::<Vec<_>>::default(), 0);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1261
                Self::fill_nodemap(idx, &mut nt)?;
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1262
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1263
                let (readonly, bytes) = nt.into_readonly_and_added_bytes();
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1264
                assert_eq!(readonly.len(), 0);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1265
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1266
                bytes
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1267
            } else {
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1268
                bytes
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1269
            };
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1270
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1271
            let bytes = PyBytes::new(py, &bytes);
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1272
            Ok(bytes.unbind())
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1273
        })
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1274
    }
e7ad174ae58f rust-pyo3-revlog: _index_nodemap_data_all
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52810
diff changeset
  1275
52812
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1276
    /// Returns the last saved docket along with the size of any changed data
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1277
    /// (in number of blocks), and said data as bytes.
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1278
    fn _index_nodemap_data_incremental(
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1279
        slf: &Bound<'_, Self>,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1280
        py: Python<'_>,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1281
    ) -> PyResult<PyObject> {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1282
        let mut self_ref = slf.borrow_mut();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1283
        let docket = &mut self_ref.docket;
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1284
        let docket = match docket.as_ref() {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1285
            Some(d) => d.clone_ref(py),
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1286
            None => return Ok(py.None()),
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1287
        };
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1288
        drop(self_ref);
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1289
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1290
        Self::with_core_write(slf, |self_ref, irl| {
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1291
            let mut nt = self_ref
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1292
                .get_nodetree(&irl.index)?
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1293
                .write()
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1294
                .map_err(map_lock_error)?;
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1295
            let nt = nt.take().expect("nodetree should be set");
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1296
            let masked_blocks = nt.masked_readonly_blocks();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1297
            let (_, data) = nt.into_readonly_and_added_bytes();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1298
            let changed = masked_blocks * std::mem::size_of::<Block>();
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1299
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1300
            Ok(PyTuple::new(
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1301
                py,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1302
                [
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1303
                    docket,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1304
                    changed.into_py_any(py)?,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1305
                    PyBytes::new(py, &data).into_py_any(py)?,
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1306
                ],
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1307
            )?
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1308
            .unbind()
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1309
            .into_any())
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1310
        })
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1311
    }
6fc1637f0986 rust-pyo3-revlog: _index_nodemap_data_incremental
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52811
diff changeset
  1312
52813
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1313
    /// Update the nodemap from the new (mmaped) data.
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1314
    /// The docket is kept as a reference for later incremental calls.
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1315
    fn _index_update_nodemap_data(
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1316
        slf: &Bound<'_, Self>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1317
        py: Python<'_>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1318
        docket: &Bound<'_, PyAny>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1319
        nm_data: &Bound<'_, PyAny>,
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1320
    ) -> PyResult<PyObject> {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1321
        // Safety: we keep the buffer around inside the class as `nodemap_mmap`
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1322
        let (buf, bytes) = unsafe { take_buffer_with_slice(nm_data)? };
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1323
        let len = buf.item_count();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1324
        let data_tip =
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1325
            docket.getattr("tip_rev")?.extract::<BaseRevision>()?.into();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1326
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1327
        let mut nt = CoreNodeTree::load_bytes(bytes, len);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1328
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1329
        Self::with_index_read(slf, |idx| {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1330
            let data_tip = idx.check_revision(data_tip).ok_or_else(|| {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1331
                nodemap_error(NodeMapError::RevisionNotInIndex(data_tip))
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1332
            })?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1333
            let current_tip = idx.len();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1334
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1335
            for r in (data_tip.0 + 1)..current_tip as BaseRevision {
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1336
                let rev = Revision(r);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1337
                // in this case node() won't ever return None
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1338
                nt.insert(idx, idx.node(rev).expect("node should exist"), rev)
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1339
                    .map_err(nodemap_error)?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1340
            }
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1341
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1342
            Ok(py.None())
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1343
        })?;
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1344
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1345
        let mut self_ref = slf.borrow_mut();
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1346
        self_ref.docket.replace(docket.clone().unbind());
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1347
        self_ref.nodemap_mmap = Some(buf);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1348
        self_ref.nt.write().map_err(map_lock_error)?.replace(nt);
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1349
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1350
        Ok(py.None())
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1351
    }
65df754d598b rust-pyo3-revlog: _index_update_nodemap_data
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52812
diff changeset
  1352
52798
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1353
    #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1354
    fn _index_entry_size(&self) -> usize {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1355
        INDEX_ENTRY_SIZE
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1356
    }
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1357
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1358
    #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1359
    fn _index_rust_ext_compat(&self) -> i32 {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1360
        1
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1361
    }
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1362
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1363
    #[getter]
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1364
    fn _index_is_rust(&self) -> bool {
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1365
        true
88d62995a65b rust-pyo3-revlog: constant properties
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52797
diff changeset
  1366
    }
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
  1367
}
52778
523ca3d225f5 rust-pyo3-revlog: config extraction functions
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52775
diff changeset
  1368
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1369
impl InnerRevlog {
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1370
    /// Take the lock on `slf.irl` for reading and call a closure.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1371
    ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1372
    /// This serves the purpose to keep the needed intermediate [`PyRef`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1373
    /// that must be obtained to access the data from the [`Bound`] reference
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1374
    /// and of which the locked [`CoreInnerRevlog`] depends.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1375
    /// This also provides releasing of the [`PyRef`] as soon as the closure
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1376
    /// is done, which is crucial if the caller needs to obtain a [`PyRefMut`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1377
    /// later on.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1378
    ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1379
    /// In the closure, we hand back the intermediate [`PyRef`] that
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1380
    /// has been generated so that the closure can access more attributes.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1381
    fn with_core_read<'py, T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1382
        slf: &Bound<'py, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1383
        f: impl FnOnce(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1384
            &PyRef<'py, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1385
            RwLockReadGuard<CoreInnerRevlog>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1386
        ) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1387
    ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1388
        let self_ref = slf.borrow();
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1389
        // Safety: the owner is the right one. We will anyway
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1390
        // not actually `share` it. Perhaps pyo3-sharedref should provide
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1391
        // something less scary for this kind of usage.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1392
        let shareable_ref = unsafe { self_ref.irl.borrow_with_owner(slf) };
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1393
        let guard = shareable_ref.try_read().map_err(map_try_lock_error)?;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1394
        f(&self_ref, guard)
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1395
    }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1396
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1397
    /// Take the lock on `slf.irl` for writing and call a closure.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1398
    ///
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1399
    /// See [`Self::with_core_read`] for more explanations.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1400
    fn with_core_write<'py, T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1401
        slf: &Bound<'py, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1402
        f: impl FnOnce(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1403
            &PyRef<'py, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1404
            RwLockWriteGuard<CoreInnerRevlog>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1405
        ) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1406
    ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1407
        let self_ref = slf.borrow();
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1408
        // Safety: the owner is the right one. We will anyway
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1409
        // not actually `share` it. Perhaps pyo3-sharedref should provide
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1410
        // something less scary for this kind of usage.
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1411
        let shareable_ref = unsafe { self_ref.irl.borrow_with_owner(slf) };
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1412
        let guard = shareable_ref.try_write().map_err(map_try_lock_error)?;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1413
        f(&self_ref, guard)
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1414
    }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1415
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1416
    fn with_index_read<T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1417
        slf: &Bound<'_, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1418
        f: impl FnOnce(&Index) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1419
    ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1420
        Self::with_core_read(slf, |_, guard| f(&guard.index))
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1421
    }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1422
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1423
    fn with_index_write<T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1424
        slf: &Bound<'_, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1425
        f: impl FnOnce(&mut Index) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1426
    ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1427
        Self::with_core_write(slf, |_, mut guard| f(&mut guard.index))
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1428
    }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1429
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1430
    /// Lock `slf` for reading and execute a closure on its [`Index`] and
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1431
    /// [`NodeTree`]
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1432
    ///
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1433
    /// The [`NodeTree`] is initialized an filled before hand if needed.
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1434
    fn with_index_nt_read<T>(
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1435
        slf: &Bound<'_, Self>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1436
        f: impl FnOnce(&Index, &CoreNodeTree) -> PyResult<T>,
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1437
    ) -> PyResult<T> {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1438
        Self::with_core_read(slf, |self_ref, guard| {
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1439
            let idx = &guard.index;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1440
            let nt =
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1441
                self_ref.get_nodetree(idx)?.read().map_err(map_lock_error)?;
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1442
            let nt = nt.as_ref().expect("nodetree should be set");
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1443
            f(idx, nt)
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1444
        })
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1445
    }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
  1446
52788
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1447
    fn with_index_nt_write<T>(
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1448
        slf: &Bound<'_, Self>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1449
        f: impl FnOnce(&mut Index, &mut CoreNodeTree) -> PyResult<T>,
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1450
    ) -> PyResult<T> {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1451
        Self::with_core_write(slf, |self_ref, mut guard| {
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1452
            let idx = &mut guard.index;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1453
            let mut nt = self_ref
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1454
                .get_nodetree(idx)?
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1455
                .write()
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1456
                .map_err(map_lock_error)?;
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1457
            let nt = nt.as_mut().expect("nodetree should be set");
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1458
            f(idx, nt)
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1459
        })
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1460
    }
e29e75e8328c rust-pyo3-revlog: index and notetree writing accessors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
  1461
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1462
    /// Fill a [`CoreNodeTree`] by doing a full iteration on the given
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1463
    /// [`Index`]
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1464
    ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1465
    /// # Python exceptions
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1466
    /// Raises `ValueError` if `nt` has existing data that is inconsistent
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1467
    /// with `idx`.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1468
    fn fill_nodemap(idx: &Index, nt: &mut CoreNodeTree) -> PyResult<()> {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1469
        for r in 0..idx.len() {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1470
            let rev = Revision(r as BaseRevision);
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1471
            // in this case node() won't ever return None
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1472
            nt.insert(idx, idx.node(rev).expect("node should exist"), rev)
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1473
                .map_err(nodemap_error)?
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1474
        }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1475
        Ok(())
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1476
    }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1477
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1478
    /// Return a working NodeTree of this InnerRevlog
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1479
    ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1480
    /// In case the NodeTree has not been initialized yet (in particular
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1481
    /// not from persistent data at instantiation), it is created and
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1482
    /// filled right away from the index.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1483
    ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1484
    /// Technically, the returned NodeTree is still behind the lock of
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1485
    /// the `nt` field, hence still wrapped in an [`Option`]. Callers
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1486
    /// will need to take the lock and unwrap with `expect()`.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1487
    ///
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1488
    /// # Python exceptions
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1489
    /// The case mentioned in [`Self::fill_nodemap()`] cannot happen, as the
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1490
    /// NodeTree is empty when it is called.
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1491
    fn get_nodetree(
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1492
        &self,
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1493
        idx: &Index,
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1494
    ) -> PyResult<&RwLock<Option<CoreNodeTree>>> {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1495
        if self.nt.read().map_err(map_lock_error)?.is_none() {
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1496
            let readonly = Box::<Vec<_>>::default();
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1497
            let mut nt = CoreNodeTree::load_bytes(readonly, 0);
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1498
            Self::fill_nodemap(idx, &mut nt)?;
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1499
            self.nt.write().map_err(map_lock_error)?.replace(nt);
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1500
        }
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1501
        Ok(&self.nt)
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1502
    }
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1503
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1504
    fn cache_new_heads_py_list(
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1505
        slf: &Bound<'_, Self>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1506
        new_heads: Vec<Revision>,
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1507
    ) -> PyResult<Py<PyList>> {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1508
        let py = slf.py();
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1509
        let new_heads_py_list = revs_py_list(py, new_heads)?;
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1510
        slf.borrow_mut().head_revs_py_list =
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1511
            Some(new_heads_py_list.clone_ref(py));
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1512
        // TODO is returning really useful?
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1513
        Ok(new_heads_py_list)
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52794
diff changeset
  1514
    }
52782
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1515
}
827889802d11 rust-pyo3-revlog: nodemap filling accessor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
  1516
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1517
#[pyclass]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1518
struct NodeTree {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1519
    nt: RwLock<CoreNodeTree>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1520
    index: SharedByPyObject<PySharedIndex>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1521
}
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1522
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1523
#[pymethods]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1524
impl NodeTree {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1525
    #[new]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1526
    // The share/mapping should be set apart to become the PyO3 homolog of
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1527
    // `py_rust_index_to_graph`
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1528
    fn new(index_proxy: &Bound<'_, PyAny>) -> PyResult<Self> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1529
        let py_irl = index_proxy.getattr("inner")?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1530
        let py_irl_ref = py_irl.downcast::<InnerRevlog>()?.borrow();
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1531
        let shareable_irl = &py_irl_ref.irl;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1532
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1533
        // Safety: the owner is the actual one and we do not leak any
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1534
        // internal reference.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1535
        let index = unsafe {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1536
            shareable_irl.share_map(&py_irl, |irl| (&irl.index).into())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1537
        };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1538
        let nt = CoreNodeTree::default(); // in-RAM, fully mutable
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1539
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1540
        Ok(Self {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1541
            nt: nt.into(),
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1542
            index,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1543
        })
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1544
    }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1545
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1546
    /// Tell whether the NodeTree is still valid
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1547
    ///
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1548
    /// In case of mutation of the index, the given results are not
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1549
    /// guaranteed to be correct, and in fact, the methods borrowing
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1550
    /// the inner index would fail because of `PySharedRef` poisoning
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1551
    /// (generation-based guard), same as iterating on a `dict` that has
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1552
    /// been meanwhile mutated.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1553
    fn is_invalidated(&self, py: Python<'_>) -> PyResult<bool> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1554
        // Safety: we don't leak any reference derived from self.index, as
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1555
        // we only check errors
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1556
        let result = unsafe { self.index.try_borrow(py) };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1557
        // two cases for result to be an error:
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1558
        // - the index has previously been mutably borrowed
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1559
        // - there is currently a mutable borrow
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1560
        // in both cases this amounts for previous results related to
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1561
        // the index to still be valid.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1562
        Ok(result.is_err())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1563
    }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1564
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1565
    fn insert(&self, py: Python<'_>, rev: PyRevision) -> PyResult<()> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1566
        // Safety: we don't leak any reference derived from self.index,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1567
        // as `nt.insert` does not store direct references
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1568
        let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1569
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1570
        let rev = check_revision(idx, rev)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1571
        if rev == NULL_REVISION {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1572
            return Err(rev_not_in_index(rev.into()));
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1573
        }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1574
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1575
        let entry = idx.inner().get_entry(rev).expect("entry should exist");
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1576
        let mut nt = self.nt.write().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1577
        nt.insert(idx, entry.hash(), rev).map_err(nodemap_error)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1578
    }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1579
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1580
    fn shortest(
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1581
        &self,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1582
        py: Python<'_>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1583
        node: &Bound<'_, PyBytes>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1584
    ) -> PyResult<usize> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1585
        let nt = self.nt.read().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1586
        // Safety: we don't leak any reference derived from self.index
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1587
        // as returned type is Copy
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1588
        let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1589
        nt.unique_prefix_len_node(idx, &node_from_py_bytes(node)?)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1590
            .map_err(nodemap_error)?
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1591
            .ok_or_else(revlog_error_bare)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1592
    }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1593
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1594
    /// Lookup by node hex prefix in the NodeTree, returning revision number.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1595
    ///
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1596
    /// This is not part of the classical NodeTree API, but is good enough
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1597
    /// for unit testing, as in `test-rust-revlog.py`.
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1598
    fn prefix_rev_lookup(
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1599
        &self,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1600
        py: Python<'_>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1601
        node_prefix: &Bound<'_, PyBytes>,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1602
    ) -> PyResult<Option<PyRevision>> {
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1603
        let prefix = node_prefix_from_py_bytes(node_prefix)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1604
        let nt = self.nt.read().map_err(map_lock_error)?;
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1605
        // Safety: we don't leak any reference derived from self.index
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1606
        // as returned type is Copy
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1607
        let idx = &*unsafe { self.index.try_borrow(py)? };
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1608
        Ok(nt
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1609
            .find_bin(idx, prefix)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1610
            .map_err(nodemap_error)?
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1611
            .map(|r| r.into()))
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1612
    }
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1613
}
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1614
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1615
pub fn init_module<'py>(
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1616
    py: Python<'py>,
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1617
    package: &str,
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1618
) -> PyResult<Bound<'py, PyModule>> {
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1619
    let m = new_submodule(py, package, "revlog")?;
52780
42b219a1404a rust-pyo3-revlog: InnerRevlog definition and constructor
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52778
diff changeset
  1620
    m.add_class::<InnerRevlog>()?;
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
  1621
    m.add_class::<NodeTree>()?;
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
  1622
    m.add_class::<ReadingContextManager>()?;
52775
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1623
    Ok(m)
264047bf4b9b rust-pyo3-revlog: new Python and Rust module
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
  1624
}