ok/jj
1
0
Fork 0
forked from mirrors/jj

revset: resolve visible heads prior to evaluation

This commit is contained in:
Yuya Nishihara 2023-04-06 13:12:13 +09:00
parent 7e1e9efa38
commit 5351371d51
5 changed files with 25 additions and 52 deletions

View file

@ -731,15 +731,9 @@ impl Index for MutableIndexImpl {
&'index self, &'index self,
expression: &ResolvedExpression, expression: &ResolvedExpression,
store: &Arc<Store>, store: &Arc<Store>,
visible_heads: &[CommitId],
) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> { ) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> {
let revset_impl = default_revset_engine::evaluate( let revset_impl =
expression, default_revset_engine::evaluate(expression, store, self, CompositeIndex(self))?;
store,
self,
CompositeIndex(self),
visible_heads,
)?;
Ok(Box::new(revset_impl)) Ok(Box::new(revset_impl))
} }
} }
@ -1819,15 +1813,9 @@ impl Index for ReadonlyIndexImpl {
&'index self, &'index self,
expression: &ResolvedExpression, expression: &ResolvedExpression,
store: &Arc<Store>, store: &Arc<Store>,
visible_heads: &[CommitId],
) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> { ) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> {
let revset_impl = default_revset_engine::evaluate( let revset_impl =
expression, default_revset_engine::evaluate(expression, store, self, CompositeIndex(self))?;
store,
self,
CompositeIndex(self),
visible_heads,
)?;
Ok(Box::new(revset_impl)) Ok(Box::new(revset_impl))
} }
} }

View file

@ -549,26 +549,23 @@ pub fn evaluate<'index>(
store: &Arc<Store>, store: &Arc<Store>,
index: &'index dyn Index, index: &'index dyn Index,
composite_index: CompositeIndex<'index>, composite_index: CompositeIndex<'index>,
visible_heads: &[CommitId],
) -> Result<RevsetImpl<'index>, RevsetEvaluationError> { ) -> Result<RevsetImpl<'index>, RevsetEvaluationError> {
let context = EvaluationContext { let context = EvaluationContext {
store: store.clone(), store: store.clone(),
index, index,
composite_index: composite_index.clone(), composite_index: composite_index.clone(),
visible_heads,
}; };
let internal_revset = context.evaluate(expression)?; let internal_revset = context.evaluate(expression)?;
Ok(RevsetImpl::new(internal_revset, composite_index)) Ok(RevsetImpl::new(internal_revset, composite_index))
} }
struct EvaluationContext<'index, 'heads> { struct EvaluationContext<'index> {
store: Arc<Store>, store: Arc<Store>,
index: &'index dyn Index, index: &'index dyn Index,
composite_index: CompositeIndex<'index>, composite_index: CompositeIndex<'index>,
visible_heads: &'heads [CommitId],
} }
impl<'index, 'heads> EvaluationContext<'index, 'heads> { impl<'index> EvaluationContext<'index> {
fn evaluate( fn evaluate(
&self, &self,
expression: &ResolvedExpression, expression: &ResolvedExpression,
@ -630,9 +627,6 @@ impl<'index, 'heads> EvaluationContext<'index, 'heads> {
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::VisibleHeads => {
Ok(Box::new(self.revset_for_commit_ids(self.visible_heads)))
}
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

@ -72,7 +72,6 @@ pub trait Index: Send + Sync {
&'index self, &'index self,
expression: &ResolvedExpression, expression: &ResolvedExpression,
store: &Arc<Store>, store: &Arc<Store>,
visible_heads: &[CommitId],
) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError>; ) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError>;
} }

View file

@ -197,7 +197,7 @@ pub const GENERATION_RANGE_EMPTY: Range<u32> = 0..0;
#[derive(Clone, Debug, Eq, PartialEq)] #[derive(Clone, Debug, Eq, PartialEq)]
pub enum RevsetCommitRef { pub enum RevsetCommitRef {
Symbol(String), Symbol(String),
// TODO: VisibleHeads VisibleHeads,
Branches(String), Branches(String),
RemoteBranches { RemoteBranches {
branch_needle: String, branch_needle: String,
@ -248,7 +248,6 @@ pub enum RevsetExpression {
}, },
Heads(Rc<RevsetExpression>), Heads(Rc<RevsetExpression>),
Roots(Rc<RevsetExpression>), Roots(Rc<RevsetExpression>),
VisibleHeads,
Latest { Latest {
candidates: Rc<RevsetExpression>, candidates: Rc<RevsetExpression>,
count: usize, count: usize,
@ -285,7 +284,7 @@ impl RevsetExpression {
} }
pub fn visible_heads() -> Rc<RevsetExpression> { pub fn visible_heads() -> Rc<RevsetExpression> {
Rc::new(RevsetExpression::VisibleHeads) Rc::new(RevsetExpression::CommitRef(RevsetCommitRef::VisibleHeads))
} }
pub fn branches(needle: String) -> Rc<RevsetExpression> { pub fn branches(needle: String) -> Rc<RevsetExpression> {
@ -482,7 +481,6 @@ pub enum ResolvedExpression {
}, },
Heads(Box<ResolvedExpression>), Heads(Box<ResolvedExpression>),
Roots(Box<ResolvedExpression>), Roots(Box<ResolvedExpression>),
VisibleHeads, // TODO: should be substituted at resolve_visibility()
Latest { Latest {
candidates: Box<ResolvedExpression>, candidates: Box<ResolvedExpression>,
count: usize, count: usize,
@ -503,11 +501,7 @@ impl ResolvedExpression {
&self, &self,
repo: &'index dyn Repo, repo: &'index dyn Repo,
) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> { ) -> Result<Box<dyn Revset<'index> + 'index>, RevsetEvaluationError> {
repo.index().evaluate_revset( repo.index().evaluate_revset(self, repo.store())
self,
repo.store(),
&repo.view().heads().iter().cloned().collect_vec(),
)
} }
} }
@ -1262,7 +1256,6 @@ fn try_transform_expression<E>(
transform_rec_pair((roots, heads), pre, post)? transform_rec_pair((roots, heads), pre, post)?
.map(|(roots, heads)| RevsetExpression::DagRange { roots, heads }) .map(|(roots, heads)| RevsetExpression::DagRange { roots, heads })
} }
RevsetExpression::VisibleHeads => None,
RevsetExpression::Heads(candidates) => { RevsetExpression::Heads(candidates) => {
transform_rec(candidates, pre, post)?.map(RevsetExpression::Heads) transform_rec(candidates, pre, post)?.map(RevsetExpression::Heads)
} }
@ -1709,6 +1702,7 @@ fn resolve_commit_ref(
RevsetCommitRef::Symbol(symbol) => { RevsetCommitRef::Symbol(symbol) => {
resolve_symbol(repo, symbol, workspace_ctx.map(|ctx| ctx.workspace_id)) resolve_symbol(repo, symbol, workspace_ctx.map(|ctx| ctx.workspace_id))
} }
RevsetCommitRef::VisibleHeads => Ok(repo.view().heads().iter().cloned().collect_vec()),
RevsetCommitRef::Branches(needle) => { RevsetCommitRef::Branches(needle) => {
let mut commit_ids = vec![]; let mut commit_ids = vec![];
for (branch_name, branch_target) in repo.view().branches() { for (branch_name, branch_target) in repo.view().branches() {
@ -1803,17 +1797,22 @@ fn resolve_symbols(
/// commit ids to make `all()` include hidden-but-specified commits. The /// commit ids to make `all()` include hidden-but-specified commits. The
/// return type `ResolvedExpression` is stricter than `RevsetExpression`, /// return type `ResolvedExpression` is stricter than `RevsetExpression`,
/// and isn't designed for such transformation. /// and isn't designed for such transformation.
fn resolve_visibility(_repo: &dyn Repo, expression: &RevsetExpression) -> ResolvedExpression { fn resolve_visibility(repo: &dyn Repo, expression: &RevsetExpression) -> ResolvedExpression {
let context = VisibilityResolutionContext {}; // If we add "operation" scope (#1283), visible_heads might be translated to
// `RevsetExpression::WithinOperation(visible_heads, expression)` node to
// evaluate filter predicates and "all()" against that scope.
let context = VisibilityResolutionContext {
visible_heads: &repo.view().heads().iter().cloned().collect_vec(),
};
context.resolve(expression) context.resolve(expression)
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
struct VisibilityResolutionContext { struct VisibilityResolutionContext<'a> {
// TODO: visible_heads visible_heads: &'a [CommitId],
} }
impl VisibilityResolutionContext { impl VisibilityResolutionContext<'_> {
/// Resolves expression tree as set. /// Resolves expression tree as set.
fn resolve(&self, expression: &RevsetExpression) -> ResolvedExpression { fn resolve(&self, expression: &RevsetExpression) -> ResolvedExpression {
match expression { match expression {
@ -1852,7 +1851,6 @@ impl VisibilityResolutionContext {
RevsetExpression::Roots(candidates) => { RevsetExpression::Roots(candidates) => {
ResolvedExpression::Roots(self.resolve(candidates).into()) ResolvedExpression::Roots(self.resolve(candidates).into())
} }
RevsetExpression::VisibleHeads => self.resolve_visible_heads(),
RevsetExpression::Latest { candidates, count } => ResolvedExpression::Latest { RevsetExpression::Latest { candidates, count } => ResolvedExpression::Latest {
candidates: self.resolve(candidates).into(), candidates: self.resolve(candidates).into(),
count: *count, count: *count,
@ -1914,7 +1912,7 @@ impl VisibilityResolutionContext {
} }
fn resolve_visible_heads(&self) -> ResolvedExpression { fn resolve_visible_heads(&self) -> ResolvedExpression {
ResolvedExpression::VisibleHeads ResolvedExpression::Commits(self.visible_heads.to_owned())
} }
/// Resolves expression tree as filter predicate. /// Resolves expression tree as filter predicate.
@ -1933,7 +1931,6 @@ impl VisibilityResolutionContext {
| RevsetExpression::DagRange { .. } | RevsetExpression::DagRange { .. }
| RevsetExpression::Heads(_) | RevsetExpression::Heads(_)
| RevsetExpression::Roots(_) | RevsetExpression::Roots(_)
| RevsetExpression::VisibleHeads
| RevsetExpression::Latest { .. } => { | RevsetExpression::Latest { .. } => {
ResolvedPredicateExpression::Set(self.resolve(expression).into()) ResolvedPredicateExpression::Set(self.resolve(expression).into())
} }
@ -2982,7 +2979,9 @@ mod tests {
"foo", "foo",
), ),
), ),
heads: VisibleHeads, heads: CommitRef(
VisibleHeads,
),
generation: 0..4294967295, generation: 0..4294967295,
} }
"###); "###);

View file

@ -29,14 +29,7 @@ fn revset_for_commits<'index>(repo: &'index dyn Repo, commits: &[&Commit]) -> Re
.unwrap(); .unwrap();
let expression = let expression =
ResolvedExpression::Commits(commits.iter().map(|commit| commit.id().clone()).collect()); ResolvedExpression::Commits(commits.iter().map(|commit| commit.id().clone()).collect());
evaluate( evaluate(&expression, repo.store(), index, index.as_composite()).unwrap()
&expression,
repo.store(),
index,
index.as_composite(),
&repo.view().heads().iter().cloned().collect_vec(),
)
.unwrap()
} }
fn direct(commit: &Commit) -> RevsetGraphEdge { fn direct(commit: &Commit) -> RevsetGraphEdge {