forked from mirrors/jj
merge_tools: pass Matcher
in for interactive use
For `jj split --interactive`, the user will want to select changes from a subset of files. This means that we need to pass the `Matcher` object when materializing the list of changed files. I also updated the parameter lists so that the matcher always immediately follows the tree objects.
This commit is contained in:
parent
0ed7c41200
commit
642ac8c799
5 changed files with 27 additions and 14 deletions
|
@ -1506,6 +1506,7 @@ impl WorkspaceCommandTransaction<'_> {
|
|||
ui: &Ui,
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
matcher: &dyn Matcher,
|
||||
instructions: &str,
|
||||
) -> Result<MergedTreeId, CommandError> {
|
||||
let base_ignores = self.helper.base_ignores();
|
||||
|
@ -1514,6 +1515,7 @@ impl WorkspaceCommandTransaction<'_> {
|
|||
ui,
|
||||
left_tree,
|
||||
right_tree,
|
||||
matcher,
|
||||
instructions,
|
||||
base_ignores,
|
||||
settings,
|
||||
|
@ -1525,12 +1527,12 @@ impl WorkspaceCommandTransaction<'_> {
|
|||
ui: &Ui,
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
matcher: &dyn Matcher,
|
||||
instructions: &str,
|
||||
interactive: bool,
|
||||
matcher: &dyn Matcher,
|
||||
) -> Result<MergedTreeId, CommandError> {
|
||||
if interactive {
|
||||
self.edit_diff(ui, left_tree, right_tree, instructions)
|
||||
self.edit_diff(ui, left_tree, right_tree, matcher, instructions)
|
||||
} else if matcher.visit(&RepoPath::root()) == Visit::AllRecursively {
|
||||
// Optimization for a common case
|
||||
Ok(right_tree.id().clone())
|
||||
|
|
|
@ -2624,9 +2624,9 @@ from the source will be moved into the destination.
|
|||
ui,
|
||||
&parent_tree,
|
||||
&source_tree,
|
||||
matcher.as_ref(),
|
||||
&instructions,
|
||||
args.interactive,
|
||||
matcher.as_ref(),
|
||||
)?;
|
||||
if args.interactive && new_parent_tree_id == parent_tree.id() {
|
||||
return Err(user_error("No changes to move"));
|
||||
|
@ -2708,9 +2708,9 @@ from the source will be moved into the parent.
|
|||
ui,
|
||||
&parent_tree,
|
||||
&tree,
|
||||
matcher.as_ref(),
|
||||
&instructions,
|
||||
args.interactive,
|
||||
matcher.as_ref(),
|
||||
)?;
|
||||
if &new_parent_tree_id == parent.tree_id() {
|
||||
if args.interactive {
|
||||
|
@ -2804,7 +2804,13 @@ aborted.
|
|||
tx.format_commit_summary(&commit)
|
||||
);
|
||||
let parent_tree = parent.tree()?;
|
||||
new_parent_tree_id = tx.edit_diff(ui, &parent_base_tree, &parent_tree, &instructions)?;
|
||||
new_parent_tree_id = tx.edit_diff(
|
||||
ui,
|
||||
&parent_base_tree,
|
||||
&parent_tree,
|
||||
&EverythingMatcher,
|
||||
&instructions,
|
||||
)?;
|
||||
if new_parent_tree_id == parent_base_tree.id() {
|
||||
return Err(user_error("No changes selected"));
|
||||
}
|
||||
|
@ -3161,7 +3167,7 @@ don't make any changes, then the operation will be aborted.",
|
|||
);
|
||||
let base_tree = merge_commit_trees(tx.repo(), base_commits.as_slice())?;
|
||||
let tree = target_commit.tree()?;
|
||||
let tree_id = tx.edit_diff(ui, &base_tree, &tree, &instructions)?;
|
||||
let tree_id = tx.edit_diff(ui, &base_tree, &tree, &EverythingMatcher, &instructions)?;
|
||||
if tree_id == *target_commit.tree_id() {
|
||||
ui.write("Nothing changed.\n")?;
|
||||
} else {
|
||||
|
@ -3268,9 +3274,9 @@ don't make any changes, then the operation will be aborted.
|
|||
ui,
|
||||
&base_tree,
|
||||
&end_tree,
|
||||
matcher.as_ref(),
|
||||
&instructions,
|
||||
interactive,
|
||||
matcher.as_ref(),
|
||||
)?;
|
||||
if &tree_id == commit.tree_id() && interactive {
|
||||
ui.write("Nothing changed.\n")?;
|
||||
|
|
|
@ -6,7 +6,7 @@ use itertools::Itertools;
|
|||
use jj_lib::backend::{BackendError, FileId, MergedTreeId, ObjectId, TreeValue};
|
||||
use jj_lib::diff::{find_line_ranges, Diff, DiffHunk};
|
||||
use jj_lib::files::{self, ContentHunk, MergeResult};
|
||||
use jj_lib::matchers::EverythingMatcher;
|
||||
use jj_lib::matchers::Matcher;
|
||||
use jj_lib::merge::Merge;
|
||||
use jj_lib::merged_tree::{MergedTree, MergedTreeBuilder};
|
||||
use jj_lib::repo_path::RepoPath;
|
||||
|
@ -405,10 +405,11 @@ pub fn apply_diff_builtin(
|
|||
pub fn edit_diff_builtin(
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
matcher: &dyn Matcher,
|
||||
) -> Result<MergedTreeId, BuiltinToolError> {
|
||||
let store = left_tree.store().clone();
|
||||
let changed_files = left_tree
|
||||
.diff(right_tree, &EverythingMatcher)
|
||||
.diff(right_tree, matcher)
|
||||
.map(|(path, _left, _right)| path)
|
||||
.collect_vec();
|
||||
let files = make_diff_files(&store, left_tree, right_tree, &changed_files)?;
|
||||
|
|
|
@ -10,7 +10,7 @@ use itertools::Itertools;
|
|||
use jj_lib::backend::{FileId, MergedTreeId, TreeValue};
|
||||
use jj_lib::conflicts::{self, materialize_merge_result};
|
||||
use jj_lib::gitignore::GitIgnoreFile;
|
||||
use jj_lib::matchers::{EverythingMatcher, Matcher};
|
||||
use jj_lib::matchers::Matcher;
|
||||
use jj_lib::merge::Merge;
|
||||
use jj_lib::merged_tree::{MergedTree, MergedTreeBuilder};
|
||||
use jj_lib::repo_path::RepoPath;
|
||||
|
@ -233,8 +233,8 @@ fn check_out_trees(
|
|||
store: &Arc<Store>,
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
output_is: Option<DiffSide>,
|
||||
matcher: &dyn Matcher,
|
||||
output_is: Option<DiffSide>,
|
||||
) -> Result<DiffWorkingCopies, DiffCheckoutError> {
|
||||
let changed_files = left_tree
|
||||
.diff(right_tree, matcher)
|
||||
|
@ -420,6 +420,7 @@ pub fn edit_diff_external(
|
|||
editor: ExternalMergeTool,
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
matcher: &dyn Matcher,
|
||||
instructions: &str,
|
||||
base_ignores: Arc<GitIgnoreFile>,
|
||||
settings: &UserSettings,
|
||||
|
@ -430,8 +431,8 @@ pub fn edit_diff_external(
|
|||
store,
|
||||
left_tree,
|
||||
right_tree,
|
||||
matcher,
|
||||
got_output_field.then_some(DiffSide::Right),
|
||||
&EverythingMatcher,
|
||||
)?;
|
||||
set_readonly_recursively(diff_wc.left_working_copy_path())
|
||||
.map_err(ExternalToolError::SetUpDir)?;
|
||||
|
@ -532,7 +533,7 @@ pub fn generate_diff(
|
|||
tool: &ExternalMergeTool,
|
||||
) -> Result<(), DiffGenerateError> {
|
||||
let store = left_tree.store();
|
||||
let diff_wc = check_out_trees(store, left_tree, right_tree, None, matcher)?;
|
||||
let diff_wc = check_out_trees(store, left_tree, right_tree, matcher, None)?;
|
||||
set_readonly_recursively(diff_wc.left_working_copy_path())
|
||||
.map_err(ExternalToolError::SetUpDir)?;
|
||||
set_readonly_recursively(diff_wc.right_working_copy_path())
|
||||
|
|
|
@ -21,6 +21,7 @@ use config::ConfigError;
|
|||
use jj_lib::backend::MergedTreeId;
|
||||
use jj_lib::conflicts::extract_as_single_hunk;
|
||||
use jj_lib::gitignore::GitIgnoreFile;
|
||||
use jj_lib::matchers::Matcher;
|
||||
use jj_lib::merged_tree::MergedTree;
|
||||
use jj_lib::repo_path::RepoPath;
|
||||
use jj_lib::settings::{ConfigResultExt as _, UserSettings};
|
||||
|
@ -129,6 +130,7 @@ pub fn edit_diff(
|
|||
ui: &Ui,
|
||||
left_tree: &MergedTree,
|
||||
right_tree: &MergedTree,
|
||||
matcher: &dyn Matcher,
|
||||
instructions: &str,
|
||||
base_ignores: Arc<GitIgnoreFile>,
|
||||
settings: &UserSettings,
|
||||
|
@ -137,13 +139,14 @@ pub fn edit_diff(
|
|||
let editor = get_diff_editor_from_settings(ui, settings)?;
|
||||
match editor {
|
||||
MergeTool::Builtin => {
|
||||
let tree_id = edit_diff_builtin(left_tree, right_tree).map_err(Box::new)?;
|
||||
let tree_id = edit_diff_builtin(left_tree, right_tree, matcher).map_err(Box::new)?;
|
||||
Ok(tree_id)
|
||||
}
|
||||
MergeTool::External(editor) => edit_diff_external(
|
||||
editor,
|
||||
left_tree,
|
||||
right_tree,
|
||||
matcher,
|
||||
instructions,
|
||||
base_ignores,
|
||||
settings,
|
||||
|
|
Loading…
Reference in a new issue