view rust/hg-cpython/src/update.rs @ 52180:735bf027dd1d

rust-vfs: add tests to `AtomicFile` This also makes it more usable from Rust by separating `from_file` and `new`.
author Rapha?l Gom?s <rgomes@octobus.net>
date Tue, 08 Oct 2024 16:10:30 +0200
parents 8b7123c8947b
children e6a44bc91bc2
line wrap: on
line source

// 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)
}