rust/hg-cpython/src/dirstate/dirstate_map.rs
author Georges Racinet <georges.racinet@cloudcrane.io>
Thu, 05 Dec 2024 18:58:56 +0100
changeset 52410 15011324a80b
parent 52301 79e8118cd846
permissions -rw-r--r--
rust: made the crate of hg-cpython importable The crate name is actually `rusthg`. This has the side effect of running the doctest of the `py_shared_iterator` macro which was really inconsistent, and after basic fixes, exposed that the macro itself was poorly scoped.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     1
// dirstate_map.rs
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     2
//
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     3
// Copyright 2019 Raphaël Gomès <rgomes@octobus.net>
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     4
//
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     5
// This software may be used and distributed according to the terms of the
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     6
// GNU General Public License version 2 or any later version.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     7
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     8
//! Bindings for the `hg::dirstate::dirstate_map` file provided by the
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
     9
//! `hg-core` package.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    10
52410
15011324a80b rust: made the crate of hg-cpython importable
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52301
diff changeset
    11
use std::cell::RefMut;
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    12
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    13
use cpython::{
48056
cd13d3c2ad2e dirstate: drop the `clearambiguoustimes` method for the map
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48051
diff changeset
    14
    exc, PyBool, PyBytes, PyClone, PyDict, PyErr, PyList, PyNone, PyObject,
48061
060cd909439f dirstate: drop all logic around the "non-normal" sets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48056
diff changeset
    15
    PyResult, Python, PythonObject, ToPyObject, UnsafePyLeaked,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    16
};
52301
79e8118cd846 rust-lib: move `Dirstate*Error` to the `dirstate` module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52299
diff changeset
    17
use hg::dirstate::{
79e8118cd846 rust-lib: move `Dirstate*Error` to the `dirstate` module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52299
diff changeset
    18
    dirstate_map::{
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    19
        DirstateEntryReset, DirstateIdentity as CoreDirstateIdentity,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    20
    },
52301
79e8118cd846 rust-lib: move `Dirstate*Error` to the `dirstate` module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52299
diff changeset
    21
    entry::{DirstateEntry, ParentFileData, TruncatedTimestamp},
79e8118cd846 rust-lib: move `Dirstate*Error` to the `dirstate` module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52299
diff changeset
    22
    DirstateError,
52040
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
    23
};
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    24
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    25
use crate::{
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    26
    dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator},
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
    27
    dirstate::item::DirstateItem,
47954
4afd6cc447b9 rust: Make OwningDirstateMap generic and move it into hg-core
Simon Sapin <simon.sapin@octobus.net>
parents: 47692
diff changeset
    28
    pybytes_deref::PyBytesDeref,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    29
};
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    30
use hg::{
52298
db065b33fa56 rust-dirstate: merge `dirstate_tree` module into `dirstate`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52050
diff changeset
    31
    dirstate::dirstate_map::DirstateMapWriteMode,
db065b33fa56 rust-dirstate: merge `dirstate_tree` module into `dirstate`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52050
diff changeset
    32
    dirstate::on_disk::DirstateV2ParseError,
db065b33fa56 rust-dirstate: merge `dirstate_tree` module into `dirstate`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52050
diff changeset
    33
    dirstate::owning::OwningDirstateMap, dirstate::StateMapIter, revlog::Node,
52301
79e8118cd846 rust-lib: move `Dirstate*Error` to the `dirstate` module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52299
diff changeset
    34
    utils::files::normalize_case, utils::hg_path::HgPath, DirstateParents,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    35
};
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    36
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    37
// TODO
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    38
//     This object needs to share references to multiple members of its Rust
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    39
//     inner struct, namely `copy_map`, `dirs` and `all_dirs`.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    40
//     Right now `CopyMap` is done, but it needs to have an explicit reference
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    41
//     to `RustDirstateMap` which itself needs to have an encapsulation for
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    42
//     every method in `CopyMap` (copymapcopy, etc.).
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    43
//     This is ugly and hard to maintain.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    44
//     The same logic applies to `dirs` and `all_dirs`, however the `Dirs`
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    45
//     `py_class!` is already implemented and does not mention
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    46
//     `RustDirstateMap`, rightfully so.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    47
//     All attributes also have to have a separate refcount data attribute for
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    48
//     leaks, with all methods that go along for reference sharing.
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    49
py_class!(pub class DirstateMap |py| {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
    50
    @shared data inner: OwningDirstateMap;
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    51
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
    52
    /// Returns a `(dirstate_map, parents)` tuple
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
    53
    @staticmethod
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    54
    def new_v1(
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
    55
        on_disk: PyBytes,
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    56
        identity: Option<DirstateIdentity>,
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
    57
    ) -> PyResult<PyObject> {
48068
bf8837e3d7ce dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents: 48061
diff changeset
    58
        let on_disk = PyBytesDeref::new(py, on_disk);
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    59
        let (map, parents) = OwningDirstateMap::new_v1(
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    60
            on_disk,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    61
            identity.map(|i| *i.inner(py))
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    62
        )
48068
bf8837e3d7ce dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents: 48061
diff changeset
    63
            .map_err(|e| dirstate_error(py, e))?;
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
    64
        let map = Self::create_instance(py, map)?;
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48421
diff changeset
    65
        let p1 = PyBytes::new(py, parents.p1.as_bytes());
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48421
diff changeset
    66
        let p2 = PyBytes::new(py, parents.p2.as_bytes());
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48421
diff changeset
    67
        let parents = (p1, p2);
47122
9aba0cde0ed9 rust: Read dirstate from disk in DirstateMap constructor
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
    68
        Ok((map, parents).to_py_object(py).into_object())
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    69
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
    70
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    71
    /// Returns a DirstateMap
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    72
    @staticmethod
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    73
    def new_v2(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    74
        on_disk: PyBytes,
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
    75
        data_size: usize,
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
    76
        tree_metadata: PyBytes,
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
    77
        uuid: PyBytes,
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    78
        identity: Option<DirstateIdentity>,
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    79
    ) -> PyResult<PyObject> {
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    80
        let dirstate_error = |e: DirstateError| {
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    81
            PyErr::new::<exc::OSError, _>(py, format!("Dirstate error: {:?}", e))
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    82
        };
47954
4afd6cc447b9 rust: Make OwningDirstateMap generic and move it into hg-core
Simon Sapin <simon.sapin@octobus.net>
parents: 47692
diff changeset
    83
        let on_disk = PyBytesDeref::new(py, on_disk);
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
    84
        let uuid = uuid.data(py);
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48421
diff changeset
    85
        let map = OwningDirstateMap::new_v2(
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50243
diff changeset
    86
            on_disk,
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50243
diff changeset
    87
            data_size,
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50243
diff changeset
    88
            tree_metadata.data(py),
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50243
diff changeset
    89
            uuid.to_owned(),
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
    90
            identity.map(|i| *i.inner(py)),
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
    91
        ).map_err(dirstate_error)?;
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
    92
        let map = Self::create_instance(py, map)?;
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    93
        Ok(map.into_object())
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    94
    }
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
    95
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
    96
    /// Returns an empty DirstateMap. Only used for a new dirstate.
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
    97
    @staticmethod
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
    98
    def new_empty() -> PyResult<PyObject> {
52029
88aa21d654e5 rust-dirstate: actually remember the identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51615
diff changeset
    99
        let map = OwningDirstateMap::new_empty(vec![], None);
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
   100
        let map = Self::create_instance(py, map)?;
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
   101
        Ok(map.into_object())
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
   102
    }
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50222
diff changeset
   103
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   104
    def clear(&self) -> PyResult<PyObject> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   105
        self.inner(py).borrow_mut().clear();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   106
        Ok(py.None())
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   107
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   108
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   109
    def get(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   110
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   111
        key: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   112
        default: Option<PyObject> = None
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   113
    ) -> PyResult<Option<PyObject>> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   114
        let key = key.extract::<PyBytes>(py)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   115
        match self
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   116
            .inner(py)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   117
            .borrow()
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   118
            .get(HgPath::new(key.data(py)))
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   119
            .map_err(|e| v2_error(py, e))?
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   120
        {
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   121
            Some(entry) => {
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
   122
                Ok(Some(DirstateItem::new_as_pyobject(py, entry)?))
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   123
            },
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   124
            None => Ok(default)
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   125
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   126
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   127
49098
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   128
    def set_tracked(&self, f: PyObject) -> PyResult<PyBool> {
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   129
        let bytes = f.extract::<PyBytes>(py)?;
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   130
        let path = HgPath::new(bytes.data(py));
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   131
        let res = self.inner(py).borrow_mut().set_tracked(path);
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
   132
        let was_tracked = res.map_err(|_| PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))?;
49098
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   133
        Ok(was_tracked.to_py_object(py))
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   134
    }
55c158a33fa5 dirstatemap: move `set_tracked` out of common methods and plug in Rust
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   135
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49106
diff changeset
   136
    def set_untracked(&self, f: PyObject) -> PyResult<PyBool> {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49106
diff changeset
   137
        let bytes = f.extract::<PyBytes>(py)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49106
diff changeset
   138
        let path = HgPath::new(bytes.data(py));
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49106
diff changeset
   139
        let res = self.inner(py).borrow_mut().set_untracked(path);
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
   140
        let was_tracked = res.map_err(|_| PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))?;
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49106
diff changeset
   141
        Ok(was_tracked.to_py_object(py))
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
   142
    }
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
   143
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   144
    def set_clean(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   145
        &self,
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   146
        f: PyObject,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   147
        mode: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   148
        size: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   149
        mtime: (i64, u32, bool)
48051
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
   150
    ) -> PyResult<PyNone> {
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   151
        let (mtime_s, mtime_ns, second_ambiguous) = mtime;
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   152
        let timestamp = TruncatedTimestamp::new_truncate(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   153
            mtime_s, mtime_ns, second_ambiguous
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   154
        );
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   155
        let bytes = f.extract::<PyBytes>(py)?;
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   156
        let path = HgPath::new(bytes.data(py));
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   157
        let res = self.inner(py).borrow_mut().set_clean(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   158
            path, mode, size, timestamp,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49101
diff changeset
   159
        );
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
   160
        res.map_err(|_| PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))?;
48051
98c0408324e6 dirstate: Pass the final DirstateItem to _rustmap.addfile()
Simon Sapin <simon.sapin@octobus.net>
parents: 48050
diff changeset
   161
        Ok(PyNone)
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   162
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   163
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   164
    def set_possibly_dirty(&self, f: PyObject) -> PyResult<PyNone> {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   165
        let bytes = f.extract::<PyBytes>(py)?;
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   166
        let path = HgPath::new(bytes.data(py));
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   167
        let res = self.inner(py).borrow_mut().set_possibly_dirty(path);
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
   168
        res.map_err(|_| PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))?;
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   169
        Ok(PyNone)
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   170
    }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49104
diff changeset
   171
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   172
    def reset_state(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   173
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   174
        f: PyObject,
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   175
        wc_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   176
        p1_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   177
        p2_info: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   178
        has_meaningful_mtime: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   179
        parentfiledata: Option<(u32, u32, Option<(i64, u32, bool)>)>,
48048
76f1c76186a1 dirstate: Remove return boolean from dirstatemap.dropfile
Simon Sapin <simon.sapin@octobus.net>
parents: 48047
diff changeset
   180
    ) -> PyResult<PyNone> {
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   181
        let mut has_meaningful_mtime = has_meaningful_mtime;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   182
        let parent_file_data = match parentfiledata {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   183
            None => {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   184
                has_meaningful_mtime = false;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   185
                None
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   186
            },
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   187
            Some(data) => {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   188
                let (mode, size, mtime_info) = data;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   189
                let mtime = if let Some(mtime_info) = mtime_info {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   190
                    let (mtime_s, mtime_ns, second_ambiguous) = mtime_info;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   191
                    let timestamp = TruncatedTimestamp::new_truncate(
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   192
                        mtime_s, mtime_ns, second_ambiguous
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   193
                    );
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   194
                    Some(timestamp)
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   195
                } else {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   196
                    has_meaningful_mtime = false;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   197
                    None
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   198
                };
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   199
                Some(ParentFileData {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   200
                    mode_size: Some((mode, size)),
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   201
                    mtime,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   202
                })
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   203
            }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   204
        };
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   205
        let bytes = f.extract::<PyBytes>(py)?;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   206
        let path = HgPath::new(bytes.data(py));
52040
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   207
        let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   208
            filename: path,
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   209
            wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   210
            p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   211
            p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49098
diff changeset
   212
            has_meaningful_mtime,
52040
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   213
            parent_file_data_opt: parent_file_data,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   214
            from_empty: false
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   215
        };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52029
diff changeset
   216
        let res = self.inner(py).borrow_mut().reset_state(reset);
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49631
diff changeset
   217
        res.map_err(|_| PyErr::new::<exc::OSError, _>(py, "Dirstate error".to_string()))?;
48048
76f1c76186a1 dirstate: Remove return boolean from dirstatemap.dropfile
Simon Sapin <simon.sapin@octobus.net>
parents: 48047
diff changeset
   218
        Ok(PyNone)
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   219
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   220
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   221
    def hastrackeddir(&self, d: PyObject) -> PyResult<PyBool> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   222
        let d = d.extract::<PyBytes>(py)?;
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   223
        Ok(self.inner(py).borrow_mut()
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   224
            .has_tracked_dir(HgPath::new(d.data(py)))
43863
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   225
            .map_err(|e| {
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   226
                PyErr::new::<exc::ValueError, _>(py, e.to_string())
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   227
            })?
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   228
            .to_py_object(py))
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   229
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   230
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   231
    def hasdir(&self, d: PyObject) -> PyResult<PyBool> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   232
        let d = d.extract::<PyBytes>(py)?;
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   233
        Ok(self.inner(py).borrow_mut()
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   234
            .has_dir(HgPath::new(d.data(py)))
43863
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   235
            .map_err(|e| {
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   236
                PyErr::new::<exc::ValueError, _>(py, e.to_string())
bc7d8f45c3b6 rust-dirs: handle forgotten `Result`s
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43788
diff changeset
   237
            })?
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   238
            .to_py_object(py))
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   239
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   240
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   241
    def write_v1(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   242
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   243
        p1: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   244
        p2: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   245
    ) -> PyResult<PyBytes> {
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
   246
        let inner = self.inner(py).borrow();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   247
        let parents = DirstateParents {
42800
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   248
            p1: extract_node_id(py, &p1)?,
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   249
            p2: extract_node_id(py, &p2)?,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   250
        };
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
   251
        let result = inner.pack_v1(parents);
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   252
        match result {
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   253
            Ok(packed) => Ok(PyBytes::new(py, &packed)),
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   254
            Err(_) => Err(PyErr::new::<exc::OSError, _>(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   255
                py,
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   256
                "Dirstate error".to_string(),
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   257
            )),
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   258
        }
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   259
    }
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   260
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   261
    /// Returns new data together with whether that data should be appended to
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   262
    /// the existing data file whose content is at `self.on_disk` (True),
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   263
    /// instead of written to a new data file (False).
47674
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   264
    def write_v2(
ff97e793ed36 dirstate-v2: Introduce a docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47567
diff changeset
   265
        &self,
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   266
        write_mode: usize,
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   267
    ) -> PyResult<PyObject> {
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
   268
        let inner = self.inner(py).borrow();
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   269
        let rust_write_mode = match write_mode {
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   270
            0 => DirstateMapWriteMode::Auto,
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   271
            1 => DirstateMapWriteMode::ForceNewDataFile,
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50221
diff changeset
   272
            2 => DirstateMapWriteMode::ForceAppend,
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   273
            _ => DirstateMapWriteMode::Auto, // XXX should we error out?
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   274
        };
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49147
diff changeset
   275
        let result = inner.pack_v2(rust_write_mode);
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
   276
        match result {
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49000
diff changeset
   277
            Ok((packed, tree_metadata, append, _old_data_size)) => {
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   278
                let packed = PyBytes::new(py, &packed);
48421
2097f63575a5 rhg: Add Repo::write_dirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 48416
diff changeset
   279
                let tree_metadata = PyBytes::new(py, tree_metadata.as_bytes());
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
   280
                let tuple = (packed, tree_metadata, append);
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
   281
                Ok(tuple.to_py_object(py).into_object())
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
   282
            },
51615
ccf5c44092db rust-cpython: don't swallow the dirstate error message
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50252
diff changeset
   283
            Err(e) => Err(PyErr::new::<exc::OSError, _>(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   284
                py,
51615
ccf5c44092db rust-cpython: don't swallow the dirstate error message
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50252
diff changeset
   285
                e.to_string(),
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   286
            )),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   287
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   288
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   289
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   290
    def filefoldmapasdict(&self) -> PyResult<PyDict> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   291
        let dict = PyDict::new(py);
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   292
        for item in self.inner(py).borrow_mut().iter() {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   293
            let (path, entry) = item.map_err(|e| v2_error(py, e))?;
49135
a1fce5003ff4 rust-hg-cpython: remove use of `EntryState`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49124
diff changeset
   294
            if !entry.removed() {
47109
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   295
                let key = normalize_case(path);
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   296
                let value = path;
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   297
                dict.set_item(
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   298
                    py,
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   299
                    PyBytes::new(py, key.as_bytes()).into_object(),
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   300
                    PyBytes::new(py, value.as_bytes()).into_object(),
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   301
                )?;
33e5511b571a rust: Remove DirstateMap::file_fold_map
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
   302
            }
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   303
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   304
        Ok(dict)
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   305
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   306
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   307
    def __len__(&self) -> PyResult<usize> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   308
        Ok(self.inner(py).borrow().len())
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   309
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   310
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   311
    def __contains__(&self, key: PyObject) -> PyResult<bool> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   312
        let key = key.extract::<PyBytes>(py)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   313
        self.inner(py)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   314
            .borrow()
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   315
            .contains_key(HgPath::new(key.data(py)))
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   316
            .map_err(|e| v2_error(py, e))
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   317
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   318
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   319
    def __getitem__(&self, key: PyObject) -> PyResult<PyObject> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   320
        let key = key.extract::<PyBytes>(py)?;
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   321
        let key = HgPath::new(key.data(py));
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   322
        match self
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   323
            .inner(py)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   324
            .borrow()
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   325
            .get(key)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   326
            .map_err(|e| v2_error(py, e))?
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   327
        {
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   328
            Some(entry) => {
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
   329
                Ok(DirstateItem::new_as_pyobject(py, entry)?)
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   330
            },
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   331
            None => Err(PyErr::new::<exc::KeyError, _>(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   332
                py,
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   333
                String::from_utf8_lossy(key.as_bytes()),
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   334
            )),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   335
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   336
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   337
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   338
    def keys(&self) -> PyResult<DirstateMapKeysIterator> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   339
        let leaked_ref = self.inner(py).leak_immutable();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   340
        DirstateMapKeysIterator::from_inner(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   341
            py,
43285
ffc1fbd7d1f5 rust-cpython: make PyLeakedRef operations relatively safe
Yuya Nishihara <yuya@tcha.org>
parents: 43284
diff changeset
   342
            unsafe { leaked_ref.map(py, |o| o.iter()) },
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   343
        )
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   344
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   345
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   346
    def items(&self) -> PyResult<DirstateMapItemsIterator> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   347
        let leaked_ref = self.inner(py).leak_immutable();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   348
        DirstateMapItemsIterator::from_inner(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   349
            py,
43285
ffc1fbd7d1f5 rust-cpython: make PyLeakedRef operations relatively safe
Yuya Nishihara <yuya@tcha.org>
parents: 43284
diff changeset
   350
            unsafe { leaked_ref.map(py, |o| o.iter()) },
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   351
        )
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   352
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   353
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   354
    def __iter__(&self) -> PyResult<DirstateMapKeysIterator> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   355
        let leaked_ref = self.inner(py).leak_immutable();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   356
        DirstateMapKeysIterator::from_inner(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   357
            py,
43285
ffc1fbd7d1f5 rust-cpython: make PyLeakedRef operations relatively safe
Yuya Nishihara <yuya@tcha.org>
parents: 43284
diff changeset
   358
            unsafe { leaked_ref.map(py, |o| o.iter()) },
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   359
        )
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   360
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   361
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   362
    // TODO all copymap* methods, see docstring above
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   363
    def copymapcopy(&self) -> PyResult<PyDict> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   364
        let dict = PyDict::new(py);
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   365
        for item in self.inner(py).borrow().copy_map_iter() {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   366
            let (key, value) = item.map_err(|e| v2_error(py, e))?;
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   367
            dict.set_item(
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   368
                py,
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44441
diff changeset
   369
                PyBytes::new(py, key.as_bytes()),
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44441
diff changeset
   370
                PyBytes::new(py, value.as_bytes()),
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   371
            )?;
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   372
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   373
        Ok(dict)
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   374
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   375
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   376
    def copymapgetitem(&self, key: PyObject) -> PyResult<PyBytes> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   377
        let key = key.extract::<PyBytes>(py)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   378
        match self
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   379
            .inner(py)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   380
            .borrow()
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   381
            .copy_map_get(HgPath::new(key.data(py)))
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   382
            .map_err(|e| v2_error(py, e))?
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   383
        {
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44441
diff changeset
   384
            Some(copy) => Ok(PyBytes::new(py, copy.as_bytes())),
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   385
            None => Err(PyErr::new::<exc::KeyError, _>(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   386
                py,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   387
                String::from_utf8_lossy(key.data(py)),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   388
            )),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   389
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   390
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   391
    def copymap(&self) -> PyResult<CopyMap> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   392
        CopyMap::from_inner(py, self.clone_ref(py))
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   393
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   394
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   395
    def copymaplen(&self) -> PyResult<usize> {
47093
787ff5d21bcd dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents: 46891
diff changeset
   396
        Ok(self.inner(py).borrow().copy_map_len())
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   397
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   398
    def copymapcontains(&self, key: PyObject) -> PyResult<bool> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   399
        let key = key.extract::<PyBytes>(py)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   400
        self.inner(py)
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   401
            .borrow()
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   402
            .copy_map_contains_key(HgPath::new(key.data(py)))
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   403
            .map_err(|e| v2_error(py, e))
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   404
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   405
    def copymapget(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   406
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   407
        key: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   408
        default: Option<PyObject>
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   409
    ) -> PyResult<Option<PyObject>> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   410
        let key = key.extract::<PyBytes>(py)?;
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   411
        match self
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   412
            .inner(py)
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   413
            .borrow()
47093
787ff5d21bcd dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents: 46891
diff changeset
   414
            .copy_map_get(HgPath::new(key.data(py)))
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   415
            .map_err(|e| v2_error(py, e))?
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   416
        {
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   417
            Some(copy) => Ok(Some(
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44441
diff changeset
   418
                PyBytes::new(py, copy.as_bytes()).into_object(),
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   419
            )),
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   420
            None => Ok(default),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   421
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   422
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   423
    def copymapsetitem(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   424
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   425
        key: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   426
        value: PyObject
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   427
    ) -> PyResult<PyObject> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   428
        let key = key.extract::<PyBytes>(py)?;
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   429
        let value = value.extract::<PyBytes>(py)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   430
        self.inner(py)
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   431
            .borrow_mut()
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   432
            .copy_map_insert(
49124
d9a66d62c604 rust-dirstatemap: use `&HgPath` instead of `HgPathBuf` in `copy_map_insert`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49122
diff changeset
   433
                HgPath::new(key.data(py)),
d9a66d62c604 rust-dirstatemap: use `&HgPath` instead of `HgPathBuf` in `copy_map_insert`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49122
diff changeset
   434
                HgPath::new(value.data(py)),
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   435
            )
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   436
            .map_err(|e| v2_error(py, e))?;
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   437
        Ok(py.None())
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   438
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   439
    def copymappop(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   440
        &self,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   441
        key: PyObject,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   442
        default: Option<PyObject>
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   443
    ) -> PyResult<Option<PyObject>> {
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   444
        let key = key.extract::<PyBytes>(py)?;
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   445
        match self
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   446
            .inner(py)
44203
2a24ead003f0 rust-cpython: add panicking version of borrow_mut() and use it
Yuya Nishihara <yuya@tcha.org>
parents: 43863
diff changeset
   447
            .borrow_mut()
47093
787ff5d21bcd dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents: 46891
diff changeset
   448
            .copy_map_remove(HgPath::new(key.data(py)))
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   449
            .map_err(|e| v2_error(py, e))?
42957
7a01778bc7b7 rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents: 42890
diff changeset
   450
        {
48135
bd5f7c61d69d dirstatemap: fix copymap.pop in Rust to return the value it pops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48069
diff changeset
   451
            Some(copy) => Ok(Some(
bd5f7c61d69d dirstatemap: fix copymap.pop in Rust to return the value it pops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48069
diff changeset
   452
                PyBytes::new(py, copy.as_bytes()).into_object(),
bd5f7c61d69d dirstatemap: fix copymap.pop in Rust to return the value it pops
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48069
diff changeset
   453
            )),
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   454
            None => Ok(default),
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   455
        }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   456
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   457
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   458
    def copymapiter(&self) -> PyResult<CopyMapKeysIterator> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   459
        let leaked_ref = self.inner(py).leak_immutable();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   460
        CopyMapKeysIterator::from_inner(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   461
            py,
47093
787ff5d21bcd dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents: 46891
diff changeset
   462
            unsafe { leaked_ref.map(py, |o| o.copy_map_iter()) },
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   463
        )
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   464
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   465
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   466
    def copymapitemsiter(&self) -> PyResult<CopyMapItemsIterator> {
44233
281642cd1d04 rust-cpython: rename inner_shared() to inner()
Yuya Nishihara <yuya@tcha.org>
parents: 44203
diff changeset
   467
        let leaked_ref = self.inner(py).leak_immutable();
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   468
        CopyMapItemsIterator::from_inner(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   469
            py,
47093
787ff5d21bcd dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents: 46891
diff changeset
   470
            unsafe { leaked_ref.map(py, |o| o.copy_map_iter()) },
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   471
        )
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   472
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   473
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   474
    def tracked_dirs(&self) -> PyResult<PyList> {
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   475
        let dirs = PyList::new(py, &[]);
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   476
        for path in self.inner(py).borrow_mut().iter_tracked_dirs()
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   477
            .map_err(|e |dirstate_error(py, e))?
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   478
        {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   479
            let path = path.map_err(|e| v2_error(py, e))?;
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   480
            let path = PyBytes::new(py, path.as_bytes());
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   481
            dirs.append(py, path.into_object())
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   482
        }
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   483
        Ok(dirs)
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   484
    }
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
   485
49120
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   486
    def setparents_fixup(&self) -> PyResult<PyDict> {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   487
        let dict = PyDict::new(py);
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   488
        let copies = self.inner(py).borrow_mut().setparents_fixup();
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   489
        for (key, value) in copies.map_err(|e| v2_error(py, e))? {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   490
            dict.set_item(
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   491
                py,
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   492
                PyBytes::new(py, key.as_bytes()),
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   493
                PyBytes::new(py, value.as_bytes()),
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   494
            )?;
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   495
        }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   496
        Ok(dict)
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   497
    }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49112
diff changeset
   498
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
   499
    def debug_iter(&self, all: bool) -> PyResult<PyList> {
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   500
        let dirs = PyList::new(py, &[]);
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
   501
        for item in self.inner(py).borrow().debug_iter(all) {
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   502
            let (path, (state, mode, size, mtime)) =
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   503
                item.map_err(|e| v2_error(py, e))?;
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   504
            let path = PyBytes::new(py, path.as_bytes());
48024
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
   505
            let item = (path, state, mode, size, mtime);
cedfe2606adf debugsate: Change debug_iter() to yield tuples instead of DirstateItem
Simon Sapin <simon.sapin@octobus.net>
parents: 48023
diff changeset
   506
            dirs.append(py, item.to_py_object(py).into_object())
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   507
        }
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   508
        Ok(dirs)
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   509
    }
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   510
});
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   511
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   512
impl DirstateMap {
47112
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47109
diff changeset
   513
    pub fn get_inner_mut<'a>(
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43208
diff changeset
   514
        &'a self,
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43208
diff changeset
   515
        py: Python<'a>,
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
   516
    ) -> RefMut<'a, OwningDirstateMap> {
47112
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47109
diff changeset
   517
        self.inner(py).borrow_mut()
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 43208
diff changeset
   518
    }
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   519
    fn translate_key(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   520
        py: Python,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   521
        res: Result<(&HgPath, DirstateEntry), DirstateV2ParseError>,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   522
    ) -> PyResult<Option<PyBytes>> {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   523
        let (f, _entry) = res.map_err(|e| v2_error(py, e))?;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   524
        Ok(Some(PyBytes::new(py, f.as_bytes())))
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   525
    }
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   526
    fn translate_key_value(
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   527
        py: Python,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   528
        res: Result<(&HgPath, DirstateEntry), DirstateV2ParseError>,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   529
    ) -> PyResult<Option<(PyBytes, PyObject)>> {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   530
        let (f, entry) = res.map_err(|e| v2_error(py, e))?;
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   531
        Ok(Some((
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44441
diff changeset
   532
            PyBytes::new(py, f.as_bytes()),
48044
d5528ac9b4f2 dirstate: Use the Rust implementation of DirstateItem when Rust is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 48024
diff changeset
   533
            DirstateItem::new_as_pyobject(py, entry)?,
45610
496537c9c1b4 rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
   534
        )))
496537c9c1b4 rust: start plugging the dirstate tree behind a feature gate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44973
diff changeset
   535
    }
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   536
}
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   537
42889
ea91a126c803 rust-cpython: rename py_shared_iterator_impl to py_shared_iterator
Yuya Nishihara <yuya@tcha.org>
parents: 42888
diff changeset
   538
py_shared_iterator!(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   539
    DirstateMapKeysIterator,
44234
bad4e7b361d2 rust-cpython: switch to upstreamed version of PySharedRefCell
Yuya Nishihara <yuya@tcha.org>
parents: 44233
diff changeset
   540
    UnsafePyLeaked<StateMapIter<'static>>,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   541
    DirstateMap::translate_key,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   542
    Option<PyBytes>
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   543
);
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   544
42889
ea91a126c803 rust-cpython: rename py_shared_iterator_impl to py_shared_iterator
Yuya Nishihara <yuya@tcha.org>
parents: 42888
diff changeset
   545
py_shared_iterator!(
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   546
    DirstateMapItemsIterator,
44234
bad4e7b361d2 rust-cpython: switch to upstreamed version of PySharedRefCell
Yuya Nishihara <yuya@tcha.org>
parents: 44233
diff changeset
   547
    UnsafePyLeaked<StateMapIter<'static>>,
42754
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   548
    DirstateMap::translate_key_value,
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   549
    Option<(PyBytes, PyObject)>
4e8f504424f3 rust-dirstate: rust-cpython bridge for dirstatemap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
diff changeset
   550
);
42800
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   551
52050
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   552
py_class!(pub class DirstateIdentity |py| {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   553
    data inner: CoreDirstateIdentity;
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   554
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   555
    def __new__(
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   556
        _cls,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   557
        mode: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   558
        dev: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   559
        ino: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   560
        nlink: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   561
        uid: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   562
        gid: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   563
        size: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   564
        mtime: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   565
        mtime_nsec: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   566
        ctime: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   567
        ctime_nsec: i64) -> PyResult<DirstateIdentity> {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   568
            Self::create_instance(
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   569
                py,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   570
                CoreDirstateIdentity {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   571
                    mode,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   572
                    dev,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   573
                    ino,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   574
                    nlink,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   575
                    uid,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   576
                    gid,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   577
                    size,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   578
                    mtime,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   579
                    mtime_nsec,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   580
                    ctime,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   581
                    ctime_nsec
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   582
                }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   583
            )
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   584
    }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   585
});
ea0467ed76aa rust-dirstate-map: use a more precise identity
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52040
diff changeset
   586
46595
98a455a62699 rust: Make `DirstateParents`?s fields typed `Node`s
Simon Sapin <simon.sapin@octobus.net>
parents: 46440
diff changeset
   587
fn extract_node_id(py: Python, obj: &PyObject) -> PyResult<Node> {
42800
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   588
    let bytes = obj.extract::<PyBytes>(py)?;
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   589
    match bytes.data(py).try_into() {
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   590
        Ok(s) => Ok(s),
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   591
        Err(e) => Err(PyErr::new::<exc::ValueError, _>(py, e.to_string())),
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   592
    }
79561843729a rust-dirstate: handle invalid length of p1/p2 parameters
Yuya Nishihara <yuya@tcha.org>
parents: 42799
diff changeset
   593
}
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   594
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   595
pub(super) fn v2_error(py: Python<'_>, _: DirstateV2ParseError) -> PyErr {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   596
    PyErr::new::<exc::ValueError, _>(py, "corrupted dirstate-v2")
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
   597
}
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   598
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   599
fn dirstate_error(py: Python<'_>, e: DirstateError) -> PyErr {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   600
    PyErr::new::<exc::OSError, _>(py, format!("Dirstate error: {:?}", e))
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
   601
}