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
--- a/rust/hg-core/src/discovery.rs Wed Feb 20 09:04:39 2019 +0100
+++ b/rust/hg-core/src/discovery.rs Thu Mar 14 17:57:31 2019 +0000
@@ -23,6 +23,10 @@
missing: HashSet<Revision>,
}
+pub struct DiscoveryStats {
+ pub undecided: Option<usize>,
+}
+
impl<G: Graph + Clone> PartialDiscovery<G> {
/// Create a PartialDiscovery object, with the intent
/// of comparing our `::<target_heads>` revset to the contents of another
@@ -119,6 +123,13 @@
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 @@
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 @@
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(())
}
--- a/rust/hg-cpython/src/discovery.rs Wed Feb 20 09:04:39 2019 +0100
+++ b/rust/hg-cpython/src/discovery.rs Thu Mar 14 17:57:31 2019 +0000
@@ -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 @@
Ok(self.inner(py).borrow().is_complete())
}
+ def stats(&self) -> PyResult<PyDict> {
+ 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<PyObject> {
py_set(
py,
--- a/tests/test-rust-discovery.py Wed Feb 20 09:04:39 2019 +0100
+++ b/tests/test-rust-discovery.py Thu Mar 14 17:57:31 2019 +0000
@@ -82,6 +82,14 @@
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])