Mercurial > public > mercurial-scm > hg-stable
diff rust/hg-cpython/src/revlog.rs @ 50988:1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
This step converts all revisions that shouldn't be considered "valid" in any
context to `UncheckedRevison`, allowing `Revision` to be changed for a
stronger type in a later changeset.
Note that the conversion from unchecked to checked is manual and requires
at least some thought from the programmer, although directly using `Revision`
is still possible. A later changeset will make this mistake harder to make.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Thu, 10 Aug 2023 11:00:34 +0200 |
parents | 58074252db3c |
children | 4c5f6e95df84 |
line wrap: on
line diff
--- a/rust/hg-cpython/src/revlog.rs Mon Sep 11 11:52:33 2023 +0200 +++ b/rust/hg-cpython/src/revlog.rs Thu Aug 10 11:00:34 2023 +0200 @@ -18,7 +18,7 @@ use hg::{ nodemap::{Block, NodeMapError, NodeTree}, revlog::{nodemap::NodeMap, NodePrefix, RevlogIndex}, - Revision, + Revision, UncheckedRevision, }; use std::cell::RefCell; @@ -252,7 +252,7 @@ // Note that we don't seem to have a direct way to call // PySequence_GetItem (does the job), which would possibly be better // for performance - let key = match key.extract::<Revision>(py) { + let key = match key.extract::<i32>(py) { Ok(rev) => rev.to_py_object(py).into_object(), Err(_) => key, }; @@ -268,7 +268,7 @@ // this is an equivalent implementation of the index_contains() // defined in revlog.c let cindex = self.cindex(py).borrow(); - match item.extract::<Revision>(py) { + match item.extract::<i32>(py) { Ok(rev) => { Ok(rev >= -1 && rev < cindex.inner().len(py)? as Revision) } @@ -448,9 +448,12 @@ let mut nt = NodeTree::load_bytes(Box::new(bytes), len); let data_tip = - docket.getattr(py, "tip_rev")?.extract::<Revision>(py)?; + docket.getattr(py, "tip_rev")?.extract::<i32>(py)?.into(); self.docket(py).borrow_mut().replace(docket.clone_ref(py)); let idx = self.cindex(py).borrow(); + let data_tip = idx.check_revision(data_tip).ok_or_else(|| { + nodemap_error(py, NodeMapError::RevisionNotInIndex(data_tip)) + })?; let current_tip = idx.len(); for r in (data_tip + 1)..current_tip as Revision { @@ -479,7 +482,7 @@ } } -fn rev_not_in_index(py: Python, rev: Revision) -> PyErr { +fn rev_not_in_index(py: Python, rev: UncheckedRevision) -> PyErr { PyErr::new::<ValueError, _>( py, format!(