rust/hg-cpython/src/update.rs
changeset 52056 8b7123c8947b
child 52186 e6a44bc91bc2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/hg-cpython/src/update.rs	Tue Oct 01 13:49:11 2024 +0200
@@ -0,0 +1,53 @@
+// debug.rs
+//
+// Copyright 2024 Mercurial developers
+//
+// This software may be used and distributed according to the terms of the
+// GNU General Public License version 2 or any later version.
+
+//! Module for updating a repository.
+use cpython::{PyDict, PyModule, PyObject, PyResult, Python};
+use hg::{
+    progress::{HgProgressBar, Progress},
+    update::update_from_null,
+    BaseRevision,
+};
+
+use crate::{
+    exceptions::FallbackError,
+    utils::{hgerror_to_pyerr, repo_from_path},
+};
+
+pub fn update_from_null_fast_path(
+    py: Python,
+    repo_path: PyObject,
+    to: BaseRevision,
+) -> PyResult<usize> {
+    log::trace!("Using update from null fastpath");
+    let repo = repo_from_path(py, repo_path)?;
+    let progress: &dyn Progress = &HgProgressBar::new("updating");
+    hgerror_to_pyerr(py, update_from_null(&repo, to.into(), progress))
+}
+
+pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> {
+    let dotted_name = &format!("{}.update", package);
+    let m = PyModule::new(py, dotted_name)?;
+
+    m.add(py, "__package__", package)?;
+    m.add(py, "__doc__", "Rust module for updating a repository")?;
+    m.add(py, "FallbackError", py.get_type::<FallbackError>())?;
+    m.add(
+        py,
+        "update_from_null",
+        py_fn!(
+            py,
+            update_from_null_fast_path(repo_path: PyObject, to: BaseRevision,)
+        ),
+    )?;
+
+    let sys = PyModule::import(py, "sys")?;
+    let sys_modules: PyDict = sys.get(py, "modules")?.extract(py)?;
+    sys_modules.set_item(py, dotted_name, &m)?;
+
+    Ok(m)
+}