revset: replace children node with descendants of generation 1..2

This commit is contained in:
Yuya Nishihara 2023-04-19 20:05:46 +09:00
parent a99b82c634
commit 32253fed5e
2 changed files with 19 additions and 26 deletions

View File

@ -586,11 +586,6 @@ impl<'index> EvaluationContext<'index> {
ResolvedExpression::Commits(commit_ids) => { ResolvedExpression::Commits(commit_ids) => {
Ok(Box::new(self.revset_for_commit_ids(commit_ids))) Ok(Box::new(self.revset_for_commit_ids(commit_ids)))
} }
ResolvedExpression::Children { roots, heads } => {
let root_set = self.evaluate(roots)?;
let head_set = self.evaluate(heads)?;
Ok(Box::new(self.walk_children(&*root_set, &*head_set)))
}
ResolvedExpression::Ancestors { heads, generation } => { ResolvedExpression::Ancestors { heads, generation } => {
let head_set = self.evaluate(heads)?; let head_set = self.evaluate(heads)?;
let walk = self.walk_ancestors(&*head_set); let walk = self.walk_ancestors(&*head_set);
@ -625,10 +620,14 @@ impl<'index> EvaluationContext<'index> {
} => { } => {
let root_set = self.evaluate(roots)?; let root_set = self.evaluate(roots)?;
let head_set = self.evaluate(heads)?; let head_set = self.evaluate(heads)?;
if generation_from_roots == &(1..2) {
Ok(Box::new(self.walk_children(&*root_set, &*head_set)))
} else {
assert_eq!(generation_from_roots, &GENERATION_RANGE_FULL); // TODO assert_eq!(generation_from_roots, &GENERATION_RANGE_FULL); // TODO
let (dag_range_set, _) = self.collect_dag_range(&*root_set, &*head_set); let (dag_range_set, _) = self.collect_dag_range(&*root_set, &*head_set);
Ok(Box::new(dag_range_set)) Ok(Box::new(dag_range_set))
} }
}
ResolvedExpression::Heads(candidates) => { ResolvedExpression::Heads(candidates) => {
let candidate_set = self.evaluate(candidates)?; let candidate_set = self.evaluate(candidates)?;
let candidate_ids = candidate_set let candidate_ids = candidate_set

View File

@ -232,7 +232,6 @@ pub enum RevsetExpression {
All, All,
Commits(Vec<CommitId>), Commits(Vec<CommitId>),
CommitRef(RevsetCommitRef), CommitRef(RevsetCommitRef),
Children(Rc<RevsetExpression>),
Ancestors { Ancestors {
heads: Rc<RevsetExpression>, heads: Rc<RevsetExpression>,
generation: Range<u64>, generation: Range<u64>,
@ -360,7 +359,10 @@ impl RevsetExpression {
/// Children of `self`. /// Children of `self`.
pub fn children(self: &Rc<RevsetExpression>) -> Rc<RevsetExpression> { pub fn children(self: &Rc<RevsetExpression>) -> Rc<RevsetExpression> {
Rc::new(RevsetExpression::Children(self.clone())) Rc::new(RevsetExpression::Descendants {
roots: self.clone(),
generation: 1..2,
})
} }
/// Descendants of `self`, including `self`. /// Descendants of `self`, including `self`.
@ -470,10 +472,6 @@ pub enum ResolvedPredicateExpression {
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
pub enum ResolvedExpression { pub enum ResolvedExpression {
Commits(Vec<CommitId>), Commits(Vec<CommitId>),
Children {
roots: Box<ResolvedExpression>,
heads: Box<ResolvedExpression>,
},
Ancestors { Ancestors {
heads: Box<ResolvedExpression>, heads: Box<ResolvedExpression>,
generation: Range<u64>, generation: Range<u64>,
@ -1244,9 +1242,6 @@ fn try_transform_expression<E>(
RevsetExpression::All => None, RevsetExpression::All => None,
RevsetExpression::Commits(_) => None, RevsetExpression::Commits(_) => None,
RevsetExpression::CommitRef(_) => None, RevsetExpression::CommitRef(_) => None,
RevsetExpression::Children(roots) => {
transform_rec(roots, pre, post)?.map(RevsetExpression::Children)
}
RevsetExpression::Ancestors { heads, generation } => transform_rec(heads, pre, post)? RevsetExpression::Ancestors { heads, generation } => transform_rec(heads, pre, post)?
.map(|heads| RevsetExpression::Ancestors { .map(|heads| RevsetExpression::Ancestors {
heads, heads,
@ -1840,10 +1835,6 @@ impl VisibilityResolutionContext<'_> {
RevsetExpression::CommitRef(_) => { RevsetExpression::CommitRef(_) => {
panic!("Expression '{expression:?}' should have been resolved by caller"); panic!("Expression '{expression:?}' should have been resolved by caller");
} }
RevsetExpression::Children(roots) => ResolvedExpression::Children {
roots: self.resolve(roots).into(),
heads: self.resolve_visible_heads().into(),
},
RevsetExpression::Ancestors { heads, generation } => ResolvedExpression::Ancestors { RevsetExpression::Ancestors { heads, generation } => ResolvedExpression::Ancestors {
heads: self.resolve(heads).into(), heads: self.resolve(heads).into(),
generation: generation.clone(), generation: generation.clone(),
@ -1947,7 +1938,6 @@ impl VisibilityResolutionContext<'_> {
| RevsetExpression::All | RevsetExpression::All
| RevsetExpression::Commits(_) | RevsetExpression::Commits(_)
| RevsetExpression::CommitRef(_) | RevsetExpression::CommitRef(_)
| RevsetExpression::Children(_)
| RevsetExpression::Ancestors { .. } | RevsetExpression::Ancestors { .. }
| RevsetExpression::Descendants { .. } | RevsetExpression::Descendants { .. }
| RevsetExpression::Range { .. } | RevsetExpression::Range { .. }
@ -2202,7 +2192,10 @@ mod tests {
); );
assert_eq!( assert_eq!(
foo_symbol.children(), foo_symbol.children(),
Rc::new(RevsetExpression::Children(foo_symbol.clone())) Rc::new(RevsetExpression::Descendants {
roots: foo_symbol.clone(),
generation: 1..2
}),
); );
assert_eq!( assert_eq!(
foo_symbol.descendants(), foo_symbol.descendants(),
@ -3789,8 +3782,8 @@ mod tests {
// 'foo-+' is not 'foo'. // 'foo-+' is not 'foo'.
insta::assert_debug_snapshot!(optimize(parse("foo---+").unwrap()), @r###" insta::assert_debug_snapshot!(optimize(parse("foo---+").unwrap()), @r###"
Children( Descendants {
Ancestors { roots: Ancestors {
heads: CommitRef( heads: CommitRef(
Symbol( Symbol(
"foo", "foo",
@ -3798,7 +3791,8 @@ mod tests {
), ),
generation: 3..4, generation: 3..4,
}, },
) generation: 1..2,
}
"###); "###);
// For 'roots..heads', heads can be folded. // For 'roots..heads', heads can be folded.