view rust/hg-cpython/src/update.rs @ 52851:d9d6ae9b9722

rust-pyo3-dirstate: making bytes slices in core Sync For the purposes of providing PyO3 bindings, the data fields that will be exposed to Python have to be `Sync`, hence that is the case of `OwningDirstateMap` and its `owner` field. We had to do something similar for the PyO3 bindings of `revlog`. In this case, it forces us to adapt the `Deref` wrapper of `PyBytes` used in `hg-cpython`, because it must itself now be `Sync` and raw pointers are not. This looks even uglier than it used to, but it does not matter much, because our ultimate goal is to remove the rust-cpython bindings altogether.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Wed, 29 Jan 2025 12:37:06 +0100
parents 96b113d22b34
children
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, with_sigint_wrapper},
};

pub fn update_from_null_fast_path(
    py: Python,
    repo_path: PyObject,
    to: BaseRevision,
    num_cpus: Option<usize>,
) -> PyResult<usize> {
    log::trace!("Using update from null fastpath");
    let repo = repo_from_path(py, repo_path)?;
    let progress: &dyn Progress = &HgProgressBar::new("updating");

    let res = with_sigint_wrapper(py, || {
        update_from_null(&repo, to.into(), progress, num_cpus)
    })?;

    hgerror_to_pyerr(py, res)
}

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,
                num_cpus: Option<usize>
            )
        ),
    )?;

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