pyo3: add a `repo` module
This will host all repo-related operations. For now, this only contains the
transliteration of the `repo_from_path` util from `hg-cpython`, but will
later probably grow.
--- a/rust/hg-pyo3/src/lib.rs Tue Feb 18 11:44:21 2025 +0100
+++ b/rust/hg-pyo3/src/lib.rs Tue Feb 18 11:45:50 2025 +0100
@@ -7,6 +7,7 @@
mod exceptions;
mod node;
mod path;
+mod repo;
mod revision;
mod revlog;
mod store;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hg-pyo3/src/repo.rs Tue Feb 18 11:45:50 2025 +0100
@@ -0,0 +1,21 @@
+use hg::{config::Config, repo::Repo, utils::files::get_path_from_bytes};
+use pyo3::{
+ types::{PyBytes, PyBytesMethods},
+ Bound, PyResult,
+};
+
+use crate::utils::HgPyErrExt;
+
+/// Get a repository from a given [`PyObject`] path, and bubble up any error
+/// that comes up.
+pub fn repo_from_path(repo_path: &Bound<'_, PyBytes>) -> PyResult<Repo> {
+ // TODO make the Config a Python class and downcast it here, otherwise we
+ // lose CLI args and runtime overrides done in Python.
+ let config = Config::load_non_repo().into_pyerr(repo_path.py())?;
+ let repo = Repo::find(
+ &config,
+ Some(get_path_from_bytes(repo_path.as_bytes()).to_owned()),
+ )
+ .into_pyerr(repo_path.py())?;
+ Ok(repo)
+}