Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-cpython/src/dagops.rs @ 44350:c577bb4a04d4
nodemap: have some python code writing a nodemap in persistent binary form
This python code aims to be as "simple" as possible. It is a reference
implementation of the data we are going to write on disk (and possibly,
later a way for pure python install to make sure the on disk data are up to
date).
It is not optimized for performance and rebuild the full data structure from
the index every time.
This is a stepping stone toward a persistent nodemap on disk.
Differential Revision: https://phab.mercurial-scm.org/D7834
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 15 Jan 2020 15:47:12 +0100 |
parents | f98f0e3ddaa1 |
children | 8b8054b8e5a7 |
rev | line source |
---|---|
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
1 // dagops.rs |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
2 // |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
3 // Copyright 2019 Georges Racinet <georges.racinet@octobus.net> |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
4 // |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
5 // This software may be used and distributed according to the terms of the |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
6 // GNU General Public License version 2 or any later version. |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
7 |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
8 //! Bindings for the `hg::dagops` module provided by the |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
9 //! `hg-core` package. |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
10 //! |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
11 //! From Python, this will be seen as `mercurial.rustext.dagop` |
43951
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43269
diff
changeset
|
12 use crate::{conversion::rev_pyiter_collect, exceptions::GraphError}; |
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
13 use cpython::{PyDict, PyModule, PyObject, PyResult, Python}; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
14 use hg::dagops; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
15 use hg::Revision; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
16 use std::collections::HashSet; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
17 |
43951
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43269
diff
changeset
|
18 use crate::revlog::pyindex_to_graph; |
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43269
diff
changeset
|
19 |
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
20 /// Using the the `index`, return heads out of any Python iterable of Revisions |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
21 /// |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
22 /// This is the Rust counterpart for `mercurial.dagop.headrevs` |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
23 pub fn headrevs( |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
24 py: Python, |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
25 index: PyObject, |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
26 revs: PyObject, |
43269
33fe96a5c522
rust-cpython: removed now useless py_set() conversion
Georges Racinet <georges.racinet@octobus.net>
parents:
42609
diff
changeset
|
27 ) -> PyResult<HashSet<Revision>> { |
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
28 let mut as_set: HashSet<Revision> = rev_pyiter_collect(py, &revs)?; |
43951
f98f0e3ddaa1
rust-index: add a function to convert PyObject index for hg-core
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43269
diff
changeset
|
29 dagops::retain_heads(&pyindex_to_graph(py, index)?, &mut as_set) |
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
30 .map_err(|e| GraphError::pynew(py, e))?; |
43269
33fe96a5c522
rust-cpython: removed now useless py_set() conversion
Georges Racinet <georges.racinet@octobus.net>
parents:
42609
diff
changeset
|
31 Ok(as_set) |
41705
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
32 } |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
33 |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
34 /// Create the module, with `__package__` given from parent |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
35 pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> { |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
36 let dotted_name = &format!("{}.dagop", package); |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
37 let m = PyModule::new(py, dotted_name)?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
38 m.add(py, "__package__", package)?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
39 m.add(py, "__doc__", "DAG operations - Rust implementation")?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
40 m.add( |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
41 py, |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
42 "headrevs", |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
43 py_fn!(py, headrevs(index: PyObject, revs: PyObject)), |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
44 )?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
45 |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
46 let sys = PyModule::import(py, "sys")?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
47 let sys_modules: PyDict = sys.get(py, "modules")?.extract(py)?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
48 sys_modules.set_item(py, dotted_name, &m)?; |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
49 // Example C code (see pyexpat.c and import.c) will "give away the |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
50 // reference", but we won't because it will be consumed once the |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
51 // Rust PyObject is dropped. |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
52 Ok(m) |
0c7b353ce100
rust-cpython: binding for headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
53 } |