# HG changeset patch # User Georges Racinet # Date 2019-03-14 17:57:31 # Node ID 1b0be75cb61fd98679e42c284dc7e91637b24d38 # Parent 13b64247f48fbf7aaf14a578205ec7cb841ae1cc rust-discovery: implementing and exposing stats() This time, it's simple enough that we can do it in all layers in one shot. Differential Revision: https://phab.mercurial-scm.org/D6233 diff --git a/rust/hg-core/src/discovery.rs b/rust/hg-core/src/discovery.rs --- a/rust/hg-core/src/discovery.rs +++ b/rust/hg-core/src/discovery.rs @@ -23,6 +23,10 @@ pub struct PartialDiscovery, } +pub struct DiscoveryStats { + pub undecided: Option, +} + impl PartialDiscovery { /// Create a PartialDiscovery object, with the intent /// of comparing our `::` revset to the contents of another @@ -119,6 +123,13 @@ impl PartialDiscovery< Some(self.common.missing_ancestors(tgt)?.into_iter().collect()); Ok(()) } + + /// Provide statistics about the current state of the discovery process + pub fn stats(&self) -> DiscoveryStats { + DiscoveryStats { + undecided: self.undecided.as_ref().map(|s| s.len()), + } + } } #[cfg(test)] @@ -161,6 +172,7 @@ mod tests { let mut disco = full_disco(); assert_eq!(disco.undecided, None); assert!(!disco.has_info()); + assert_eq!(disco.stats().undecided, None); disco.add_common_revisions(vec![11, 12])?; assert!(disco.has_info()); @@ -172,6 +184,7 @@ mod tests { assert_eq!(disco.undecided, None); disco.ensure_undecided()?; assert_eq!(sorted_undecided(&disco), vec![5, 8, 10, 13]); + assert_eq!(disco.stats().undecided, Some(4)); Ok(()) } diff --git a/rust/hg-cpython/src/discovery.rs b/rust/hg-cpython/src/discovery.rs --- a/rust/hg-cpython/src/discovery.rs +++ b/rust/hg-cpython/src/discovery.rs @@ -14,7 +14,9 @@ use crate::conversion::{py_set, rev_pyiter_collect}; use cindex::Index; -use cpython::{ObjectProtocol, PyDict, PyModule, PyObject, PyResult, Python}; +use cpython::{ + ObjectProtocol, PyDict, PyModule, PyObject, PyResult, Python, ToPyObject, +}; use exceptions::GraphError; use hg::discovery::PartialDiscovery as CorePartialDiscovery; use hg::Revision; @@ -83,6 +85,15 @@ py_class!(pub class PartialDiscovery |py Ok(self.inner(py).borrow().is_complete()) } + def stats(&self) -> PyResult { + let stats = self.inner(py).borrow().stats(); + let as_dict: PyDict = PyDict::new(py); + as_dict.set_item(py, "undecided", + stats.undecided.map(|l| l.to_py_object(py)) + .unwrap_or_else(|| py.None()))?; + Ok(as_dict) + } + def commonheads(&self) -> PyResult { py_set( py, diff --git a/tests/test-rust-discovery.py b/tests/test-rust-discovery.py --- a/tests/test-rust-discovery.py +++ b/tests/test-rust-discovery.py @@ -82,6 +82,14 @@ class rustdiscoverytest(unittest.TestCas self.assertEqual(disco.commonheads(), {1}) + def testaddmissingsstats(self): + idx = self.parseindex() + disco = PartialDiscovery(idx, [3]) + self.assertIsNone(disco.stats()['undecided'], None) + + disco.addmissings([2]) + self.assertEqual(disco.stats()['undecided'], 2) + def testaddinfocommonfirst(self): idx = self.parseindex() disco = PartialDiscovery(idx, [3])