view rust/hg-cpython/src/lib.rs @ 47379:f6bb181c75f8

rust: Parse "subinclude"d files along the way, not later When parsing a `.hgignore` file and encountering an `include:` line, the included file is parsed recursively right then in a depth-first fashion. With `subinclude:` however included files were parsed (recursively) much later. This changes it to be expanded during parsing, like `.hgignore`. The motivation for this is an upcoming changeset that needs to detect changes in which files are ignored or not. The plan is to hash all ignore files while they are being read, and store that hash in the dirstate (in v2 format). In order to allow a potential alternative implementations to read that format, the algorithm to compute that hash must be documented. Having a well-defined depth-first ordering for the tree of (sub-)included files makes that easier. Differential Revision: https://phab.mercurial-scm.org/D10834
author Simon Sapin <simon.sapin@octobus.net>
date Wed, 02 Jun 2021 18:03:43 +0200
parents 50c5ee3bdf9a
children 8f031a274cd6
line wrap: on
line source

// lib.rs
//
// Copyright 2018 Georges Racinet <gracinet@anybox.fr>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.

//! Python bindings of `hg-core` objects using the `cpython` crate.
//! Once compiled, the resulting single shared library object can be placed in
//! the `mercurial` package directly as `rustext.so` or `rustext.dll`.
//! It holds several modules, so that from the point of view of Python,
//! it behaves as the `cext` package.
//!
//! Example:
//!
//! ```text
//! >>> from mercurial.rustext import ancestor
//! >>> ancestor.__doc__
//! 'Generic DAG ancestor algorithms - Rust implementation'
//! ```

/// This crate uses nested private macros, `extern crate` is still needed in
/// 2018 edition.
#[macro_use]
extern crate cpython;

pub mod ancestors;
mod cindex;
mod conversion;
#[macro_use]
pub mod ref_sharing;
pub mod copy_tracing;
pub mod dagops;
pub mod debug;
pub mod dirstate;
pub mod discovery;
pub mod exceptions;
pub mod parsers;
pub mod revlog;
pub mod utils;

py_module_initializer!(rustext, initrustext, PyInit_rustext, |py, m| {
    m.add(
        py,
        "__doc__",
        "Mercurial core concepts - Rust implementation",
    )?;

    let dotted_name: String = m.get(py, "__name__")?.extract(py)?;
    m.add(py, "ancestor", ancestors::init_module(py, &dotted_name)?)?;
    m.add(py, "dagop", dagops::init_module(py, &dotted_name)?)?;
    m.add(py, "debug", debug::init_module(py, &dotted_name)?)?;
    m.add(
        py,
        "copy_tracing",
        copy_tracing::init_module(py, &dotted_name)?,
    )?;
    m.add(py, "discovery", discovery::init_module(py, &dotted_name)?)?;
    m.add(py, "dirstate", dirstate::init_module(py, &dotted_name)?)?;
    m.add(py, "revlog", revlog::init_module(py, &dotted_name)?)?;
    m.add(
        py,
        "parsers",
        parsers::init_parsers_module(py, &dotted_name)?,
    )?;
    m.add(py, "GraphError", py.get_type::<exceptions::GraphError>())?;
    Ok(())
});

#[cfg(not(any(feature = "python27-bin", feature = "python3-bin")))]
#[test]
#[ignore]
fn libpython_must_be_linked_to_run_tests() {
    // stub function to tell that some tests wouldn't run
}