mirror of
https://github.com/jj-vcs/jj.git
synced 2026-07-08 02:00:44 +08:00
revset: make RevsetParseContext opaque
This commit is contained in:
@@ -967,12 +967,12 @@ impl WorkspaceCommandHelper {
|
||||
workspace_id: self.workspace_id(),
|
||||
workspace_root: self.workspace.workspace_root(),
|
||||
};
|
||||
RevsetParseContext {
|
||||
aliases_map: &self.revset_aliases_map,
|
||||
user_email: self.settings.user_email(),
|
||||
extensions: &self.revset_extensions,
|
||||
workspace: Some(workspace_context),
|
||||
}
|
||||
RevsetParseContext::new(
|
||||
&self.revset_aliases_map,
|
||||
self.settings.user_email(),
|
||||
&self.revset_extensions,
|
||||
Some(workspace_context),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn id_prefix_context(&self) -> Result<&IdPrefixContext, CommandError> {
|
||||
|
||||
@@ -489,7 +489,7 @@ fn builtin_commit_methods<'repo>() -> CommitTemplateBuildMethodFnMap<'repo, Comm
|
||||
);
|
||||
map.insert("mine", |language, _build_ctx, self_property, function| {
|
||||
template_parser::expect_no_arguments(function)?;
|
||||
let user_email = language.revset_parse_context.user_email.clone();
|
||||
let user_email = language.revset_parse_context.user_email().clone();
|
||||
let out_property = self_property.map(move |commit| commit.author().email == user_email);
|
||||
Ok(L::wrap_boolean(out_property))
|
||||
});
|
||||
@@ -687,7 +687,7 @@ fn evaluate_revset_expression<'repo>(
|
||||
) -> Result<Box<dyn Revset + 'repo>, TemplateParseError> {
|
||||
let symbol_resolver = revset_util::default_symbol_resolver(
|
||||
language.repo,
|
||||
language.revset_parse_context.extensions.symbol_resolvers(),
|
||||
language.revset_parse_context.symbol_resolvers(),
|
||||
language.id_prefix_context,
|
||||
);
|
||||
let revset =
|
||||
|
||||
@@ -176,7 +176,7 @@ pub fn parse_immutable_expression(
|
||||
context: &RevsetParseContext,
|
||||
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
||||
let (params, immutable_heads_str) = context
|
||||
.aliases_map
|
||||
.aliases_map()
|
||||
.get_function(BUILTIN_IMMUTABLE_HEADS)
|
||||
.unwrap();
|
||||
assert!(
|
||||
|
||||
@@ -2656,10 +2656,38 @@ impl RevsetExtensions {
|
||||
/// Information needed to parse revset expression.
|
||||
#[derive(Clone)]
|
||||
pub struct RevsetParseContext<'a> {
|
||||
pub aliases_map: &'a RevsetAliasesMap,
|
||||
pub user_email: String,
|
||||
pub extensions: &'a RevsetExtensions,
|
||||
pub workspace: Option<RevsetWorkspaceContext<'a>>,
|
||||
aliases_map: &'a RevsetAliasesMap,
|
||||
user_email: String,
|
||||
extensions: &'a RevsetExtensions,
|
||||
workspace: Option<RevsetWorkspaceContext<'a>>,
|
||||
}
|
||||
|
||||
impl<'a> RevsetParseContext<'a> {
|
||||
pub fn new(
|
||||
aliases_map: &'a RevsetAliasesMap,
|
||||
user_email: String,
|
||||
extensions: &'a RevsetExtensions,
|
||||
workspace: Option<RevsetWorkspaceContext<'a>>,
|
||||
) -> Self {
|
||||
Self {
|
||||
aliases_map,
|
||||
user_email,
|
||||
extensions,
|
||||
workspace,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn aliases_map(&self) -> &'a RevsetAliasesMap {
|
||||
self.aliases_map
|
||||
}
|
||||
|
||||
pub fn user_email(&self) -> &String {
|
||||
&self.user_email
|
||||
}
|
||||
|
||||
pub fn symbol_resolvers(&self) -> &[impl AsRef<dyn SymbolResolverExtension>] {
|
||||
self.extensions.symbol_resolvers()
|
||||
}
|
||||
}
|
||||
|
||||
/// Workspace information needed to parse revset expression.
|
||||
@@ -2696,13 +2724,13 @@ mod tests {
|
||||
for (decl, defn) in aliases {
|
||||
aliases_map.insert(decl, defn).unwrap();
|
||||
}
|
||||
let extensions: RevsetExtensions = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &aliases_map,
|
||||
user_email: "test.user@example.com".to_string(),
|
||||
extensions: &extensions,
|
||||
workspace: None,
|
||||
};
|
||||
let extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(
|
||||
&aliases_map,
|
||||
"test.user@example.com".to_string(),
|
||||
&extensions,
|
||||
None,
|
||||
);
|
||||
// Map error to comparable object
|
||||
super::parse(revset_str, &context).map_err(|e| e.kind)
|
||||
}
|
||||
@@ -2722,13 +2750,13 @@ mod tests {
|
||||
for (decl, defn) in aliases {
|
||||
aliases_map.insert(decl, defn).unwrap();
|
||||
}
|
||||
let extensions: RevsetExtensions = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &aliases_map,
|
||||
user_email: "test.user@example.com".to_string(),
|
||||
extensions: &extensions,
|
||||
workspace: Some(workspace_ctx),
|
||||
};
|
||||
let extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(
|
||||
&aliases_map,
|
||||
"test.user@example.com".to_string(),
|
||||
&extensions,
|
||||
Some(workspace_ctx),
|
||||
);
|
||||
// Map error to comparable object
|
||||
super::parse(revset_str, &context).map_err(|e| e.kind)
|
||||
}
|
||||
@@ -2747,13 +2775,13 @@ mod tests {
|
||||
for (decl, defn) in aliases {
|
||||
aliases_map.insert(decl, defn).unwrap();
|
||||
}
|
||||
let extensions: RevsetExtensions = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &aliases_map,
|
||||
user_email: "test.user@example.com".to_string(),
|
||||
extensions: &extensions,
|
||||
workspace: None,
|
||||
};
|
||||
let extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(
|
||||
&aliases_map,
|
||||
"test.user@example.com".to_string(),
|
||||
&extensions,
|
||||
None,
|
||||
);
|
||||
// Map error to comparable object
|
||||
super::parse_with_modifier(revset_str, &context).map_err(|e| e.kind)
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
// limitations under the License.
|
||||
|
||||
use std::path::Path;
|
||||
use std::sync::Arc;
|
||||
|
||||
use assert_matches::assert_matches;
|
||||
use itertools::Itertools;
|
||||
@@ -42,15 +41,11 @@ use testutils::{
|
||||
|
||||
fn resolve_symbol_with_extensions(
|
||||
repo: &dyn Repo,
|
||||
extensions: &Arc<RevsetExtensions>,
|
||||
extensions: &RevsetExtensions,
|
||||
symbol: &str,
|
||||
) -> Result<Vec<CommitId>, RevsetResolutionError> {
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &RevsetAliasesMap::new(),
|
||||
user_email: String::new(),
|
||||
extensions,
|
||||
workspace: None,
|
||||
};
|
||||
let aliases_map = RevsetAliasesMap::default();
|
||||
let context = RevsetParseContext::new(&aliases_map, String::new(), extensions, None);
|
||||
let expression = parse(symbol, &context).unwrap();
|
||||
assert_matches!(*expression, RevsetExpression::CommitRef(_));
|
||||
let symbol_resolver = DefaultSymbolResolver::new(repo, extensions.symbol_resolvers());
|
||||
@@ -61,8 +56,7 @@ fn resolve_symbol_with_extensions(
|
||||
}
|
||||
|
||||
fn resolve_symbol(repo: &dyn Repo, symbol: &str) -> Result<Vec<CommitId>, RevsetResolutionError> {
|
||||
let extensions: Arc<RevsetExtensions> = Default::default();
|
||||
resolve_symbol_with_extensions(repo, &extensions, symbol)
|
||||
resolve_symbol_with_extensions(repo, &RevsetExtensions::default(), symbol)
|
||||
}
|
||||
|
||||
fn revset_for_commits<'index>(
|
||||
@@ -183,13 +177,9 @@ fn test_resolve_symbol_commit_id() {
|
||||
repo.as_ref(),
|
||||
&([] as [&Box<dyn SymbolResolverExtension>; 0]),
|
||||
);
|
||||
let extensions: Arc<RevsetExtensions> = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &RevsetAliasesMap::new(),
|
||||
user_email: settings.user_email(),
|
||||
extensions: &extensions,
|
||||
workspace: None,
|
||||
};
|
||||
let aliases_map = RevsetAliasesMap::default();
|
||||
let extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(&aliases_map, settings.user_email(), &extensions, None);
|
||||
assert_matches!(
|
||||
optimize(parse("present(04)", &context).unwrap()).resolve_user_expression(repo.as_ref(), &symbol_resolver),
|
||||
Err(RevsetResolutionError::AmbiguousCommitIdPrefix(s)) if s == "04"
|
||||
@@ -842,13 +832,14 @@ fn test_resolve_symbol_git_refs() {
|
||||
|
||||
fn resolve_commit_ids(repo: &dyn Repo, revset_str: &str) -> Vec<CommitId> {
|
||||
let settings = testutils::user_settings();
|
||||
let revset_extensions: Arc<RevsetExtensions> = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &RevsetAliasesMap::new(),
|
||||
user_email: settings.user_email(),
|
||||
extensions: &revset_extensions,
|
||||
workspace: None,
|
||||
};
|
||||
let aliases_map = RevsetAliasesMap::default();
|
||||
let revset_extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(
|
||||
&aliases_map,
|
||||
settings.user_email(),
|
||||
&revset_extensions,
|
||||
None,
|
||||
);
|
||||
let expression = optimize(parse(revset_str, &context).unwrap());
|
||||
let symbol_resolver = DefaultSymbolResolver::new(repo, revset_extensions.symbol_resolvers());
|
||||
let expression = expression
|
||||
@@ -869,13 +860,14 @@ fn resolve_commit_ids_in_workspace(
|
||||
workspace_id: workspace.workspace_id(),
|
||||
workspace_root: workspace.workspace_root(),
|
||||
};
|
||||
let extensions: Arc<RevsetExtensions> = Default::default();
|
||||
let context = RevsetParseContext {
|
||||
aliases_map: &RevsetAliasesMap::new(),
|
||||
user_email: settings.user_email(),
|
||||
extensions: &extensions,
|
||||
workspace: Some(workspace_ctx),
|
||||
};
|
||||
let aliases_map = RevsetAliasesMap::default();
|
||||
let extensions = RevsetExtensions::default();
|
||||
let context = RevsetParseContext::new(
|
||||
&aliases_map,
|
||||
settings.user_email(),
|
||||
&extensions,
|
||||
Some(workspace_ctx),
|
||||
);
|
||||
let expression = optimize(parse(revset_str, &context).unwrap());
|
||||
let symbol_resolver =
|
||||
DefaultSymbolResolver::new(repo, &([] as [&Box<dyn SymbolResolverExtension>; 0]));
|
||||
|
||||
Reference in New Issue
Block a user