head-revs: move hg-core's inner_headrevsfiltered closer to inner_headrevs
This is pure code movement, it make a coming changesets significantly clearer.
--- a/rust/hg-core/src/revlog/index.rs Tue Sep 03 11:11:17 2024 +0200
+++ b/rust/hg-core/src/revlog/index.rs Thu Sep 26 01:52:09 2024 +0200
@@ -545,6 +545,61 @@
.map(|h| h.unwrap())
}
+ /// Return the head revisions of this index
+ pub fn head_revs_filtered(
+ &self,
+ filtered_revs: &HashSet<Revision>,
+ py_shortcut: bool,
+ ) -> Result<Option<Vec<Revision>>, GraphError> {
+ {
+ let guard = self
+ .head_revs
+ .read()
+ .expect("RwLock on Index.head_revs should not be poisoned");
+ let self_head_revs = &guard.0;
+ let self_filtered_revs = &guard.1;
+ if !self_head_revs.is_empty()
+ && filtered_revs == self_filtered_revs
+ {
+ if py_shortcut {
+ // Don't copy the revs since we've already cached them
+ // on the Python side.
+ return Ok(None);
+ } else {
+ return Ok(Some(self_head_revs.to_owned()));
+ }
+ }
+ }
+
+ let as_vec = if self.is_empty() {
+ vec![NULL_REVISION]
+ } else {
+ let mut not_heads = bitvec![0; self.len()];
+ dagops::retain_heads_fast(
+ self,
+ not_heads.as_mut_bitslice(),
+ filtered_revs,
+ )?;
+ not_heads
+ .into_iter()
+ .enumerate()
+ .filter_map(|(idx, is_not_head)| {
+ if is_not_head {
+ None
+ } else {
+ Some(Revision(idx as BaseRevision))
+ }
+ })
+ .collect()
+ };
+ *self
+ .head_revs
+ .write()
+ .expect("RwLock on Index.head_revs should not be poisoned") =
+ (as_vec.to_owned(), filtered_revs.to_owned());
+ Ok(Some(as_vec))
+ }
+
/// Python-specific shortcut to save on PyList creation
pub fn head_revs_shortcut(
&self,
@@ -603,61 +658,6 @@
Ok((heads_removed, heads_added))
}
- /// Return the head revisions of this index
- pub fn head_revs_filtered(
- &self,
- filtered_revs: &HashSet<Revision>,
- py_shortcut: bool,
- ) -> Result<Option<Vec<Revision>>, GraphError> {
- {
- let guard = self
- .head_revs
- .read()
- .expect("RwLock on Index.head_revs should not be poisoned");
- let self_head_revs = &guard.0;
- let self_filtered_revs = &guard.1;
- if !self_head_revs.is_empty()
- && filtered_revs == self_filtered_revs
- {
- if py_shortcut {
- // Don't copy the revs since we've already cached them
- // on the Python side.
- return Ok(None);
- } else {
- return Ok(Some(self_head_revs.to_owned()));
- }
- }
- }
-
- let as_vec = if self.is_empty() {
- vec![NULL_REVISION]
- } else {
- let mut not_heads = bitvec![0; self.len()];
- dagops::retain_heads_fast(
- self,
- not_heads.as_mut_bitslice(),
- filtered_revs,
- )?;
- not_heads
- .into_iter()
- .enumerate()
- .filter_map(|(idx, is_not_head)| {
- if is_not_head {
- None
- } else {
- Some(Revision(idx as BaseRevision))
- }
- })
- .collect()
- };
- *self
- .head_revs
- .write()
- .expect("RwLock on Index.head_revs should not be poisoned") =
- (as_vec.to_owned(), filtered_revs.to_owned());
- Ok(Some(as_vec))
- }
-
/// Obtain the delta chain for a revision.
///
/// `stop_rev` specifies a revision to stop at. If not specified, we