forked from mirrors/jj
revset: inline walk_children()
There's only one caller, and we have common code at the call site.
This commit is contained in:
parent
d28bd8fa0f
commit
cd0b24ef14
1 changed files with 18 additions and 34 deletions
|
@ -569,12 +569,27 @@ impl<'index> EvaluationContext<'index> {
|
||||||
generation_from_roots,
|
generation_from_roots,
|
||||||
} => {
|
} => {
|
||||||
let root_set = self.evaluate(roots)?;
|
let root_set = self.evaluate(roots)?;
|
||||||
|
let root_positions = root_set.iter().map(|entry| entry.position()).collect_vec();
|
||||||
let head_set = self.evaluate(heads)?;
|
let head_set = self.evaluate(heads)?;
|
||||||
if generation_from_roots == &(1..2) {
|
if generation_from_roots == &(1..2) {
|
||||||
Ok(Box::new(self.walk_children(&*root_set, &*head_set)))
|
let walk = self
|
||||||
|
.walk_ancestors(&*head_set)
|
||||||
|
.take_until_roots(&root_positions);
|
||||||
|
let root_positions_set: HashSet<_> = root_positions.into_iter().collect();
|
||||||
|
let candidates = Box::new(RevWalkRevset { walk });
|
||||||
|
let predicate = PurePredicateFn(move |entry: &IndexEntry| {
|
||||||
|
entry
|
||||||
|
.parent_positions()
|
||||||
|
.iter()
|
||||||
|
.any(|parent_pos| root_positions_set.contains(parent_pos))
|
||||||
|
});
|
||||||
|
// TODO: Suppose heads include all visible heads, ToPredicateFn version can be
|
||||||
|
// optimized to only test the predicate()
|
||||||
|
Ok(Box::new(FilterRevset {
|
||||||
|
candidates,
|
||||||
|
predicate,
|
||||||
|
}))
|
||||||
} else if generation_from_roots == &GENERATION_RANGE_FULL {
|
} else if generation_from_roots == &GENERATION_RANGE_FULL {
|
||||||
let root_positions =
|
|
||||||
root_set.iter().map(|entry| entry.position()).collect_vec();
|
|
||||||
let mut index_entries = self
|
let mut index_entries = self
|
||||||
.walk_ancestors(&*head_set)
|
.walk_ancestors(&*head_set)
|
||||||
.descendants(&root_positions)
|
.descendants(&root_positions)
|
||||||
|
@ -585,8 +600,6 @@ impl<'index> EvaluationContext<'index> {
|
||||||
// For small generation range, it might be better to build a reachable map
|
// For small generation range, it might be better to build a reachable map
|
||||||
// with generation bit set, which can be calculated incrementally from roots:
|
// with generation bit set, which can be calculated incrementally from roots:
|
||||||
// reachable[pos] = (reachable[parent_pos] | ...) << 1
|
// reachable[pos] = (reachable[parent_pos] | ...) << 1
|
||||||
let root_positions =
|
|
||||||
root_set.iter().map(|entry| entry.position()).collect_vec();
|
|
||||||
let walk = self
|
let walk = self
|
||||||
.walk_ancestors(&*head_set)
|
.walk_ancestors(&*head_set)
|
||||||
.descendants_filtered_by_generation(
|
.descendants_filtered_by_generation(
|
||||||
|
@ -698,35 +711,6 @@ impl<'index> EvaluationContext<'index> {
|
||||||
self.index.walk_revs(&head_positions, &[])
|
self.index.walk_revs(&head_positions, &[])
|
||||||
}
|
}
|
||||||
|
|
||||||
fn walk_children<'a, 'b, S, T>(
|
|
||||||
&self,
|
|
||||||
root_set: &S,
|
|
||||||
head_set: &T,
|
|
||||||
) -> impl InternalRevset<'index> + 'index
|
|
||||||
where
|
|
||||||
S: InternalRevset<'a> + ?Sized,
|
|
||||||
T: InternalRevset<'b> + ?Sized,
|
|
||||||
{
|
|
||||||
let root_positions = root_set.iter().map(|entry| entry.position()).collect_vec();
|
|
||||||
let walk = self
|
|
||||||
.walk_ancestors(head_set)
|
|
||||||
.take_until_roots(&root_positions);
|
|
||||||
let root_positions: HashSet<_> = root_positions.into_iter().collect();
|
|
||||||
let candidates = Box::new(RevWalkRevset { walk });
|
|
||||||
let predicate = PurePredicateFn(move |entry: &IndexEntry| {
|
|
||||||
entry
|
|
||||||
.parent_positions()
|
|
||||||
.iter()
|
|
||||||
.any(|parent_pos| root_positions.contains(parent_pos))
|
|
||||||
});
|
|
||||||
// TODO: Suppose heads include all visible heads, ToPredicateFn version can be
|
|
||||||
// optimized to only test the predicate()
|
|
||||||
FilterRevset {
|
|
||||||
candidates,
|
|
||||||
predicate,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn revset_for_commit_ids(&self, commit_ids: &[CommitId]) -> EagerRevset<'index> {
|
fn revset_for_commit_ids(&self, commit_ids: &[CommitId]) -> EagerRevset<'index> {
|
||||||
let mut index_entries = vec![];
|
let mut index_entries = vec![];
|
||||||
for id in commit_ids {
|
for id in commit_ids {
|
||||||
|
|
Loading…
Reference in a new issue