From 895bbce8c02a3002afe5341b7814b39e03914b51 Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Mon, 6 Nov 2023 16:18:26 +0900 Subject: [PATCH] files: use borrowed Merge iterator in merge() Since the underlying Merge data type is no longer (Vec, Vec), it doesn't make sense to build removes/adds Vecs and concatenate them. --- cli/src/merge_tools/builtin.rs | 4 ++-- lib/src/conflicts.rs | 2 +- lib/src/files.rs | 10 ++++------ lib/src/tree.rs | 2 +- lib/tests/test_merged_tree.rs | 2 +- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/cli/src/merge_tools/builtin.rs b/cli/src/merge_tools/builtin.rs index 8b33aa8c5..200ec2a73 100644 --- a/cli/src/merge_tools/builtin.rs +++ b/cli/src/merge_tools/builtin.rs @@ -516,7 +516,7 @@ pub fn edit_merge_builtin( content: Merge, ) -> Result { let slices = content.map(|ContentHunk(v)| v.as_slice()); - let merge_result = files::merge(slices); + let merge_result = files::merge(&slices); let sections = make_merge_sections(merge_result)?; let recorder = scm_record::Recorder::new( scm_record::RecordState { @@ -731,7 +731,7 @@ mod tests { ); let content = extract_as_single_hunk(&merge, store, &path).block_on(); let slices = content.map(|ContentHunk(buf)| buf.as_slice()); - let merge_result = files::merge(slices); + let merge_result = files::merge(&slices); let sections = make_merge_sections(merge_result).unwrap(); insta::assert_debug_snapshot!(sections, @r###" [ diff --git a/lib/src/conflicts.rs b/lib/src/conflicts.rs index 3c06564d9..0470244a5 100644 --- a/lib/src/conflicts.rs +++ b/lib/src/conflicts.rs @@ -109,7 +109,7 @@ pub fn materialize_merge_result( output: &mut dyn Write, ) -> std::io::Result<()> { let slices = single_hunk.map(|content| content.0.as_slice()); - let merge_result = files::merge(slices); + let merge_result = files::merge(&slices); match merge_result { MergeResult::Resolved(content) => { output.write_all(&content.0)?; diff --git a/lib/src/files.rs b/lib/src/files.rs index 8b2245cf2..c88f6d7dc 100644 --- a/lib/src/files.rs +++ b/lib/src/files.rs @@ -167,14 +167,12 @@ struct SyncRegion { right: Range, } -pub fn merge(slices: Merge<&[u8]>) -> MergeResult { - let (removes, adds) = slices.take(); - let num_diffs = removes.len(); +pub fn merge(slices: &Merge<&[u8]>) -> MergeResult { // TODO: Using the first remove as base (first in the inputs) is how it's // usually done for 3-way conflicts. Are there better heuristics when there are // more than 3 parts? - let mut diff_inputs = removes.to_vec(); - diff_inputs.extend(adds); + let num_diffs = slices.removes().len(); + let diff_inputs = slices.removes().chain(slices.adds()).copied().collect_vec(); let diff = Diff::for_tokenizer(&diff_inputs, &diff::find_line_ranges); let mut resolved_hunk = ContentHunk(vec![]); @@ -226,7 +224,7 @@ mod tests { } fn merge(removes: &[&[u8]], adds: &[&[u8]]) -> MergeResult { - super::merge(Merge::new(removes.to_vec(), adds.to_vec())) + super::merge(&Merge::new(removes.to_vec(), adds.to_vec())) } #[test] diff --git a/lib/src/tree.rs b/lib/src/tree.rs index eca5839a9..373438e22 100644 --- a/lib/src/tree.rs +++ b/lib/src/tree.rs @@ -453,7 +453,7 @@ pub fn try_resolve_file_conflict( Ok(content) })?; let slices = contents.map(|content| content.as_slice()); - let merge_result = files::merge(slices); + let merge_result = files::merge(&slices); match merge_result { MergeResult::Resolved(merged_content) => { let id = store.write_file(filename, &mut merged_content.0.as_slice())?; diff --git a/lib/tests/test_merged_tree.rs b/lib/tests/test_merged_tree.rs index c559f4abd..545dfdea7 100644 --- a/lib/tests/test_merged_tree.rs +++ b/lib/tests/test_merged_tree.rs @@ -1305,7 +1305,7 @@ fn test_merge_simplify_file_conflict() { ], ); assert!(matches!( - jj_lib::files::merge(text_merge.flatten()), + jj_lib::files::merge(&text_merge.flatten()), MergeResult::Conflict(_) )); }