cli: ensure log revset expression tree is optimized

I don't think we have any substitution rules applied to union or intersection
with single file predicate, but there might be something in future.
This commit is contained in:
Yuya Nishihara 2023-06-29 18:54:43 +09:00
parent e601a30b15
commit 458ae45905

View file

@ -1541,30 +1541,31 @@ fn cmd_status(
fn cmd_log(ui: &mut Ui, command: &CommandHelper, args: &LogArgs) -> Result<(), CommandError> { fn cmd_log(ui: &mut Ui, command: &CommandHelper, args: &LogArgs) -> Result<(), CommandError> {
let workspace_command = command.workspace_helper(ui)?; let workspace_command = command.workspace_helper(ui)?;
let revset_expression = if args.revisions.is_empty() { let revset_expression = {
workspace_command.parse_revset(&command.settings().default_revset())? let mut expression = if args.revisions.is_empty() {
} else { workspace_command.parse_revset(&command.settings().default_revset())?
let expressions: Vec<_> = args } else {
.revisions let expressions: Vec<_> = args
.iter() .revisions
.map(|revision_str| workspace_command.parse_revset(revision_str)) .iter()
.try_collect()?; .map(|revision_str| workspace_command.parse_revset(revision_str))
RevsetExpression::union_all(&expressions) .try_collect()?;
RevsetExpression::union_all(&expressions)
};
if !args.paths.is_empty() {
let repo_paths: Vec<_> = args
.paths
.iter()
.map(|path_arg| workspace_command.parse_file_path(path_arg))
.try_collect()?;
expression = expression.intersection(&RevsetExpression::filter(
RevsetFilterPredicate::File(Some(repo_paths)),
));
}
revset::optimize(expression)
}; };
let repo = workspace_command.repo(); let repo = workspace_command.repo();
let wc_commit_id = workspace_command.get_wc_commit_id(); let wc_commit_id = workspace_command.get_wc_commit_id();
let revset_expression = if !args.paths.is_empty() {
let repo_paths: Vec<_> = args
.paths
.iter()
.map(|path_arg| workspace_command.parse_file_path(path_arg))
.try_collect()?;
revset_expression.intersection(&RevsetExpression::filter(RevsetFilterPredicate::File(
Some(repo_paths),
)))
} else {
revset_expression
};
let matcher = workspace_command.matcher_from_values(&args.paths)?; let matcher = workspace_command.matcher_from_values(&args.paths)?;
let revset = workspace_command.evaluate_revset(revset_expression)?; let revset = workspace_command.evaluate_revset(revset_expression)?;