diff --git a/lib/src/repo.rs b/lib/src/repo.rs index 80684f3bc..7870424ed 100644 --- a/lib/src/repo.rs +++ b/lib/src/repo.rs @@ -225,7 +225,11 @@ impl ReadonlyRepo { let change_id_index: &'a (dyn ChangeIdIndex + 'a) = self .change_id_index .get_or_init(|| { - let revset: Box> = RevsetExpression::all().evaluate(self).unwrap(); + let revset: Box> = RevsetExpression::all() + .resolve(self) + .unwrap() + .evaluate(self) + .unwrap(); let change_id_index: Box = revset.change_id_index(); // evaluate() above only borrows the index, not the whole repo let change_id_index: Box = @@ -1158,13 +1162,21 @@ impl Repo for MutableRepo { } fn resolve_change_id_prefix(&self, prefix: &HexPrefix) -> PrefixResolution> { - let revset = RevsetExpression::all().evaluate(self).unwrap(); + let revset = RevsetExpression::all() + .resolve(self) + .unwrap() + .evaluate(self) + .unwrap(); let change_id_index = revset.change_id_index(); change_id_index.resolve_prefix(prefix) } fn shortest_unique_change_id_prefix_len(&self, target_id: &ChangeId) -> usize { - let revset = RevsetExpression::all().evaluate(self).unwrap(); + let revset = RevsetExpression::all() + .resolve(self) + .unwrap() + .evaluate(self) + .unwrap(); let change_id_index = revset.change_id_index(); change_id_index.shortest_unique_prefix_len(target_id) } diff --git a/lib/src/revset.rs b/lib/src/revset.rs index b718fad5a..53032c0ca 100644 --- a/lib/src/revset.rs +++ b/lib/src/revset.rs @@ -421,6 +421,21 @@ impl RevsetExpression { Rc::new(RevsetExpression::Difference(self.clone(), other.clone())) } + pub fn resolve( + self: Rc, + repo: &dyn Repo, + ) -> Result, RevsetResolutionError> { + resolve_symbols(repo, self, None) + } + + pub fn resolve_in_workspace( + self: Rc, + repo: &dyn Repo, + workspace_ctx: &RevsetWorkspaceContext, + ) -> Result, RevsetResolutionError> { + resolve_symbols(repo, self, Some(workspace_ctx)) + } + pub fn evaluate<'index>( &self, repo: &'index dyn Repo, @@ -1687,7 +1702,7 @@ fn resolve_commit_ref( // TODO: Maybe return a new type (RevsetParameters?) instead of // RevsetExpression. Then pass that to evaluate(), so it's clear which variants // are allowed. -pub fn resolve_symbols( +fn resolve_symbols( repo: &dyn Repo, expression: Rc, workspace_ctx: Option<&RevsetWorkspaceContext>, diff --git a/lib/src/rewrite.rs b/lib/src/rewrite.rs index e89797169..901357098 100644 --- a/lib/src/rewrite.rs +++ b/lib/src/rewrite.rs @@ -167,13 +167,19 @@ impl<'settings, 'repo> DescendantRebaser<'settings, 'repo> { .parents() .minus(&old_commits_expression); let heads_to_add = heads_to_add_expression + .resolve(mut_repo) + .unwrap() .evaluate(mut_repo) .unwrap() .iter() .collect(); let to_visit_expression = old_commits_expression.descendants(); - let to_visit_revset = to_visit_expression.evaluate(mut_repo).unwrap(); + let to_visit_revset = to_visit_expression + .resolve(mut_repo) + .unwrap() + .evaluate(mut_repo) + .unwrap(); let to_visit: Vec<_> = to_visit_revset.iter().commits(store).try_collect().unwrap(); drop(to_visit_revset); let to_visit_set: HashSet = diff --git a/lib/tests/test_revset.rs b/lib/tests/test_revset.rs index b0d3dcec8..fcd11b93f 100644 --- a/lib/tests/test_revset.rs +++ b/lib/tests/test_revset.rs @@ -24,9 +24,9 @@ use jujutsu_lib::op_store::{RefTarget, WorkspaceId}; use jujutsu_lib::repo::Repo; use jujutsu_lib::repo_path::RepoPath; use jujutsu_lib::revset::{ - optimize, parse, resolve_symbol, resolve_symbols, ReverseRevsetGraphIterator, Revset, - RevsetAliasesMap, RevsetExpression, RevsetFilterPredicate, RevsetGraphEdge, - RevsetResolutionError, RevsetWorkspaceContext, + optimize, parse, resolve_symbol, ReverseRevsetGraphIterator, Revset, RevsetAliasesMap, + RevsetExpression, RevsetFilterPredicate, RevsetGraphEdge, RevsetResolutionError, + RevsetWorkspaceContext, }; use jujutsu_lib::settings::GitSettings; use jujutsu_lib::tree::merge_trees; @@ -41,6 +41,8 @@ fn revset_for_commits<'index>( commits: &[&Commit], ) -> Box + 'index> { RevsetExpression::commits(commits.iter().map(|commit| commit.id().clone()).collect()) + .resolve(repo) + .unwrap() .evaluate(repo) .unwrap() } @@ -172,7 +174,7 @@ fn test_resolve_symbol_commit_id() { // Test present() suppresses only NoSuchRevision error assert_eq!(resolve_commit_ids(repo.as_ref(), "present(foo)"), []); assert_matches!( - resolve_symbols(repo.as_ref(), optimize(parse("present(04)", &RevsetAliasesMap::new(), None).unwrap()), None), + optimize(parse("present(04)", &RevsetAliasesMap::new(), None).unwrap()).resolve(repo.as_ref()), Err(RevsetResolutionError::AmbiguousIdPrefix(s)) if s == "04" ); assert_eq!( @@ -502,7 +504,7 @@ fn test_resolve_symbol_git_refs() { fn resolve_commit_ids(repo: &dyn Repo, revset_str: &str) -> Vec { let expression = optimize(parse(revset_str, &RevsetAliasesMap::new(), None).unwrap()); - let expression = resolve_symbols(repo, expression, None).unwrap(); + let expression = expression.resolve(repo).unwrap(); expression.evaluate(repo).unwrap().iter().collect() } @@ -519,7 +521,9 @@ fn resolve_commit_ids_in_workspace( }; let expression = optimize(parse(revset_str, &RevsetAliasesMap::new(), Some(&workspace_ctx)).unwrap()); - let expression = resolve_symbols(repo, expression, Some(&workspace_ctx)).unwrap(); + let expression = expression + .resolve_in_workspace(repo, &workspace_ctx) + .unwrap(); expression.evaluate(repo).unwrap().iter().collect() } @@ -2125,7 +2129,11 @@ fn test_evaluate_expression_file(use_git: bool) { let mut_repo = &*mut_repo; let expression = RevsetExpression::filter(RevsetFilterPredicate::File(Some(vec![file_path.clone()]))); - let revset = expression.evaluate(mut_repo).unwrap(); + let revset = expression + .resolve(mut_repo) + .unwrap() + .evaluate(mut_repo) + .unwrap(); revset.iter().collect() }; diff --git a/src/cli_util.rs b/src/cli_util.rs index 7b48ae91e..396de0767 100644 --- a/src/cli_util.rs +++ b/src/cli_util.rs @@ -44,9 +44,8 @@ use jujutsu_lib::repo::{ }; use jujutsu_lib::repo_path::{FsPathParseError, RepoPath}; use jujutsu_lib::revset::{ - resolve_symbols, Revset, RevsetAliasesMap, RevsetEvaluationError, RevsetExpression, - RevsetIteratorExt, RevsetParseError, RevsetParseErrorKind, RevsetResolutionError, - RevsetWorkspaceContext, + Revset, RevsetAliasesMap, RevsetEvaluationError, RevsetExpression, RevsetIteratorExt, + RevsetParseError, RevsetParseErrorKind, RevsetResolutionError, RevsetWorkspaceContext, }; use jujutsu_lib::settings::UserSettings; use jujutsu_lib::transaction::Transaction; @@ -873,11 +872,8 @@ impl WorkspaceCommandHelper { &'repo self, revset_expression: Rc, ) -> Result + 'repo>, CommandError> { - let revset_expression = resolve_symbols( - self.repo.as_ref(), - revset_expression, - Some(&self.revset_context()), - )?; + let revset_expression = + revset_expression.resolve_in_workspace(self.repo.as_ref(), &self.revset_context())?; Ok(revset_expression.evaluate(self.repo.as_ref())?) } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 94bf42447..b5675b54c 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -2057,6 +2057,7 @@ fn cmd_new(ui: &mut Ui, command: &CommandHelper, args: &NewArgs) -> Result<(), C let new_parents = new_children.parents(); if let Some(commit_id) = new_children .dag_range_to(&new_parents) + .resolve(tx.repo())? .evaluate(tx.repo())? .iter() .next() @@ -2068,6 +2069,7 @@ fn cmd_new(ui: &mut Ui, command: &CommandHelper, args: &NewArgs) -> Result<(), C ))); } let mut new_parents_commits: Vec = new_parents + .resolve(tx.repo())? .evaluate(tx.repo())? .iter() .commits(tx.repo().store()) @@ -2115,6 +2117,7 @@ fn cmd_new(ui: &mut Ui, command: &CommandHelper, args: &NewArgs) -> Result<(), C // Exclude children that are ancestors of the new commit let to_rebase = old_parents.children().minus(&old_parents.ancestors()); let commits_to_rebase: Vec = to_rebase + .resolve(tx.base_repo().as_ref())? .evaluate(tx.base_repo().as_ref())? .iter() .commits(tx.base_repo().store()) @@ -2125,6 +2128,7 @@ fn cmd_new(ui: &mut Ui, command: &CommandHelper, args: &NewArgs) -> Result<(), C RevsetExpression::commits(child_commit.parent_ids().to_owned()); let new_parents = commit_parents.minus(&old_parents); let mut new_parent_commits: Vec = new_parents + .resolve(tx.base_repo().as_ref())? .evaluate(tx.base_repo().as_ref())? .iter() .commits(tx.base_repo().store()) @@ -2885,6 +2889,8 @@ fn rebase_branch( .range(&RevsetExpression::commits(branch_commit_ids)) .roots(); let root_commits: IndexSet<_> = roots_expression + .resolve(workspace_command.repo().as_ref()) + .unwrap() .evaluate(workspace_command.repo().as_ref()) .unwrap() .iter() @@ -2936,6 +2942,8 @@ fn rebase_revision( check_rebase_destinations(workspace_command.repo(), new_parents, &old_commit)?; let children_expression = RevsetExpression::commit(old_commit.id().clone()).children(); let child_commits: Vec<_> = children_expression + .resolve(workspace_command.repo().as_ref()) + .unwrap() .evaluate(workspace_command.repo().as_ref()) .unwrap() .iter() @@ -2975,6 +2983,8 @@ fn rebase_revision( .ancestors(), ); let new_child_parents: Vec = new_child_parents_expression + .resolve(tx.base_repo().as_ref()) + .unwrap() .evaluate(tx.base_repo().as_ref()) .unwrap() .iter() @@ -3198,7 +3208,7 @@ fn cmd_debug_revset( writeln!(ui, "{expression:#?}")?; writeln!(ui)?; - let expression = revset::resolve_symbols(repo, expression, Some(&workspace_ctx))?; + let expression = expression.resolve_in_workspace(repo, &workspace_ctx)?; writeln!(ui, "-- Resolved:")?; writeln!(ui, "{expression:#?}")?; writeln!(ui)?;