just playing with tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

copy-tracking: add support for `diff --git`

+177 -172
+1 -1
CHANGELOG.md
··· 15 15 ### New features 16 16 17 17 * The following diff formats now include information about copies and moves: 18 - `--color-words`, `--stat`, `--summary`, `--types` 18 + `--color-words`, `--git`, `--stat`, `--summary`, `--types` 19 19 20 20 * A tilde (`~`) at the start of the path will now be expanded to the user's home 21 21 directory when configuring a `signing.key` for SSH commit signing.
+15 -3
cli/src/commit_templater.rs
··· 1366 1366 let template = (self_property, context_property) 1367 1367 .map(|(diff, context)| { 1368 1368 let context = context.unwrap_or(diff_util::DEFAULT_CONTEXT_LINES); 1369 - diff.into_formatted(move |formatter, store, tree_diff| { 1370 - diff_util::show_git_diff(formatter, store, tree_diff, context) 1369 + // TODO: don't pass separate copies of from_tree/to_tree/matcher 1370 + let from_tree = diff.from_tree.clone(); 1371 + let to_tree = diff.to_tree.clone(); 1372 + let matcher = diff.matcher.clone(); 1373 + diff.into_formatted(move |formatter, store, _tree_diff| { 1374 + diff_util::show_git_diff( 1375 + formatter, 1376 + store, 1377 + &from_tree, 1378 + &to_tree, 1379 + matcher.as_ref(), 1380 + &Default::default(), // TODO: real copy tracking 1381 + context, 1382 + ) 1371 1383 }) 1372 1384 }) 1373 1385 .into_template(); ··· 1405 1417 &from_tree, 1406 1418 &to_tree, 1407 1419 matcher.as_ref(), 1408 - &Default::default(), 1420 + &Default::default(), // TODO: real copy tracking 1409 1421 ) 1410 1422 }) 1411 1423 })
+46 -13
cli/src/diff_util.rs
··· 307 307 show_names(formatter, tree_diff, path_converter)?; 308 308 } 309 309 DiffFormat::Git { context } => { 310 - let no_copy_tracking = Default::default(); 311 - let tree_diff = from_tree.diff_stream(to_tree, matcher, &no_copy_tracking); 312 - show_git_diff(formatter, store, tree_diff, *context)?; 310 + show_git_diff( 311 + formatter, 312 + store, 313 + from_tree, 314 + to_tree, 315 + matcher, 316 + copy_records, 317 + *context, 318 + )?; 313 319 } 314 320 DiffFormat::ColorWords { context } => { 315 321 let tree_diff = from_tree.diff_stream(to_tree, matcher, copy_records); ··· 1097 1103 pub fn show_git_diff( 1098 1104 formatter: &mut dyn Formatter, 1099 1105 store: &Store, 1100 - tree_diff: TreeDiffStream, 1106 + from_tree: &MergedTree, 1107 + to_tree: &MergedTree, 1108 + matcher: &dyn Matcher, 1109 + copy_records: &CopyRecords, 1101 1110 num_context_lines: usize, 1102 1111 ) -> Result<(), DiffRenderError> { 1112 + let tree_diff = from_tree.diff_stream(to_tree, matcher, copy_records); 1103 1113 let mut diff_stream = materialized_diff_stream(store, tree_diff); 1114 + let copied_sources = collect_copied_sources(copy_records, matcher); 1115 + 1104 1116 async { 1105 1117 while let Some(MaterializedTreeDiffEntry { 1106 - source: _, // TODO handle copy tracking 1107 - target: path, 1118 + source: left_path, 1119 + target: right_path, 1108 1120 value: diff, 1109 1121 }) = diff_stream.next().await 1110 1122 { 1111 - let path_string = path.as_internal_file_string(); 1123 + let left_path_string = left_path.as_internal_file_string(); 1124 + let right_path_string = right_path.as_internal_file_string(); 1112 1125 let (left_value, right_value) = diff?; 1113 - let left_part = git_diff_part(&path, left_value)?; 1114 - let right_part = git_diff_part(&path, right_value)?; 1126 + 1127 + let left_part = git_diff_part(&left_path, left_value)?; 1128 + let right_part = git_diff_part(&right_path, right_value)?; 1129 + 1130 + // Skip the "delete" entry when there is a rename. 1131 + if right_part.mode.is_none() && copied_sources.contains(left_path.as_ref()) { 1132 + continue; 1133 + } 1134 + 1115 1135 formatter.with_label("file_header", |formatter| { 1116 - writeln!(formatter, "diff --git a/{path_string} b/{path_string}")?; 1136 + writeln!( 1137 + formatter, 1138 + "diff --git a/{left_path_string} b/{right_path_string}" 1139 + )?; 1117 1140 let left_hash = &left_part.hash; 1118 1141 let right_hash = &right_part.hash; 1119 1142 match (left_part.mode, right_part.mode) { ··· 1126 1149 writeln!(formatter, "index {left_hash}..{right_hash}")?; 1127 1150 } 1128 1151 (Some(left_mode), Some(right_mode)) => { 1152 + if left_path != right_path { 1153 + let operation = if to_tree.path_value(&left_path)?.is_absent() { 1154 + "rename" 1155 + } else { 1156 + "copy" 1157 + }; 1158 + // TODO: include similarity index? 1159 + writeln!(formatter, "{operation} from {left_path_string}")?; 1160 + writeln!(formatter, "{operation} to {right_path_string}")?; 1161 + } 1129 1162 if left_mode != right_mode { 1130 1163 writeln!(formatter, "old mode {left_mode}")?; 1131 1164 writeln!(formatter, "new mode {right_mode}")?; ··· 1138 1171 } 1139 1172 (None, None) => panic!("either left or right part should be present"), 1140 1173 } 1141 - io::Result::Ok(()) 1174 + Ok::<(), DiffRenderError>(()) 1142 1175 })?; 1143 1176 1144 1177 if left_part.content.contents == right_part.content.contents { ··· 1146 1179 } 1147 1180 1148 1181 let left_path = match left_part.mode { 1149 - Some(_) => format!("a/{path_string}"), 1182 + Some(_) => format!("a/{left_path_string}"), 1150 1183 None => "/dev/null".to_owned(), 1151 1184 }; 1152 1185 let right_path = match right_part.mode { 1153 - Some(_) => format!("b/{path_string}"), 1186 + Some(_) => format!("b/{right_path_string}"), 1154 1187 None => "/dev/null".to_owned(), 1155 1188 }; 1156 1189 if left_part.content.is_binary || right_part.content.is_binary {
+9 -9
cli/tests/test_acls.rs
··· 52 52 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--summary"]); 53 53 insta::assert_snapshot!(stdout.replace('\\', "/"), @r###" 54 54 M a-first 55 - A added-secret 55 + C {a-first => added-secret} 56 56 D deleted-secret 57 57 M dir/secret 58 58 M modified-secret ··· 61 61 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--types"]); 62 62 insta::assert_snapshot!(stdout.replace('\\', "/"), @r###" 63 63 FF a-first 64 - -F added-secret 64 + FF {a-first => added-secret} 65 65 F- deleted-secret 66 66 FF dir/secret 67 67 FF modified-secret ··· 69 69 "###); 70 70 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--stat"]); 71 71 insta::assert_snapshot!(stdout.replace('\\', "/"), @r###" 72 - a-first | 2 +- 73 - added-secret | 1 + 74 - deleted-secret | 1 - 75 - dir/secret | 0 76 - modified-secret | 0 77 - z-last | 2 +- 78 - 6 files changed, 3 insertions(+), 3 deletions(-) 72 + a-first | 2 +- 73 + {a-first => added-secret} | 2 +- 74 + deleted-secret | 1 - 75 + dir/secret | 0 76 + modified-secret | 0 77 + z-last | 2 +- 78 + 6 files changed, 3 insertions(+), 4 deletions(-) 79 79 "###); 80 80 let assert = test_env 81 81 .jj_cmd(&repo_path, &["diff", "--git"])
+82 -86
cli/tests/test_diff_command.rs
··· 23 23 let repo_path = test_env.env_root().join("repo"); 24 24 25 25 std::fs::write(repo_path.join("file1"), "foo\n").unwrap(); 26 - std::fs::write(repo_path.join("file2"), "foo\nbaz qux\n").unwrap(); 26 + std::fs::write(repo_path.join("file2"), "1\n2\n3\n4\n").unwrap(); 27 27 test_env.jj_cmd_ok(&repo_path, &["new"]); 28 28 std::fs::remove_file(repo_path.join("file1")).unwrap(); 29 - std::fs::write(repo_path.join("file2"), "foo\nbar\nbaz quux\n").unwrap(); 29 + std::fs::write(repo_path.join("file2"), "1\n5\n3\n").unwrap(); 30 30 std::fs::write(repo_path.join("file3"), "foo\n").unwrap(); 31 + std::fs::write(repo_path.join("file4"), "1\n2\n3\n4\n").unwrap(); 31 32 32 33 let stdout = test_env.jj_cmd_success(&repo_path, &["diff"]); 33 34 insta::assert_snapshot!(stdout, @r###" 34 35 Removed regular file file1: 35 36 1 : foo 36 37 Modified regular file file2: 37 - 1 1: foo 38 - 2: bar 39 - 2 3: baz quxquux 38 + 1 1: 1 39 + 2 2: 25 40 + 3 3: 3 41 + 4 : 4 40 42 Modified regular file file3 (file1 => file3): 43 + Modified regular file file4 (file2 => file4): 41 44 "###); 42 45 43 46 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--context=0"]); ··· 45 48 Removed regular file file1: 46 49 1 : foo 47 50 Modified regular file file2: 48 - 1 1: foo 49 - 2: bar 50 - 2 3: baz quxquux 51 + 1 1: 1 52 + 2 2: 25 53 + 3 3: 3 54 + 4 : 4 51 55 Modified regular file file3 (file1 => file3): 56 + Modified regular file file4 (file2 => file4): 57 + ... 52 58 "###); 53 59 54 60 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--color=debug"]); ··· 56 62 <<diff header::Removed regular file file1:>> 57 63 <<diff removed line_number:: 1>><<diff:: : >><<diff removed token::foo>> 58 64 <<diff header::Modified regular file file2:>> 59 - <<diff removed line_number:: 1>><<diff:: >><<diff added line_number:: 1>><<diff::: foo>> 60 - <<diff:: >><<diff added line_number:: 2>><<diff::: >><<diff added token::bar>> 61 - <<diff removed line_number:: 2>><<diff:: >><<diff added line_number:: 3>><<diff::: baz >><<diff removed token::qux>><<diff added token::quux>><<diff::>> 65 + <<diff removed line_number:: 1>><<diff:: >><<diff added line_number:: 1>><<diff::: 1>> 66 + <<diff removed line_number:: 2>><<diff:: >><<diff added line_number:: 2>><<diff::: >><<diff removed token::2>><<diff added token::5>><<diff::>> 67 + <<diff removed line_number:: 3>><<diff:: >><<diff added line_number:: 3>><<diff::: 3>> 68 + <<diff removed line_number:: 4>><<diff:: : >><<diff removed token::4>> 62 69 <<diff header::Modified regular file file3 (file1 => file3):>> 70 + <<diff header::Modified regular file file4 (file2 => file4):>> 63 71 "###); 64 72 65 73 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "-s"]); 66 74 insta::assert_snapshot!(stdout, @r###" 67 75 M file2 68 76 R {file1 => file3} 77 + C {file2 => file4} 69 78 "###); 70 79 71 80 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--types"]); 72 81 insta::assert_snapshot!(stdout, @r###" 73 82 FF file2 74 83 FF {file1 => file3} 84 + FF {file2 => file4} 75 85 "###); 76 86 77 87 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--types", "glob:file[12]"]); ··· 80 90 FF file2 81 91 "###); 82 92 83 - let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--git"]); 93 + let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--git", "file1"]); 84 94 insta::assert_snapshot!(stdout, @r###" 85 95 diff --git a/file1 b/file1 86 96 deleted file mode 100644 ··· 89 99 +++ /dev/null 90 100 @@ -1,1 +1,0 @@ 91 101 -foo 102 + "###); 103 + 104 + let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--git"]); 105 + insta::assert_snapshot!(stdout, @r###" 92 106 diff --git a/file2 b/file2 93 - index 523a4a9de8..485b56a572 100644 107 + index 94ebaf9001..1ffc51b472 100644 94 108 --- a/file2 95 109 +++ b/file2 96 - @@ -1,2 +1,3 @@ 97 - foo 98 - -baz qux 99 - +bar 100 - +baz quux 101 - diff --git a/file3 b/file3 102 - new file mode 100644 103 - index 0000000000..257cc5642c 104 - --- /dev/null 105 - +++ b/file3 106 - @@ -1,0 +1,1 @@ 107 - +foo 110 + @@ -1,4 +1,3 @@ 111 + 1 112 + -2 113 + +5 114 + 3 115 + -4 116 + diff --git a/file1 b/file3 117 + rename from file1 118 + rename to file3 119 + diff --git a/file2 b/file4 120 + copy from file2 121 + copy to file4 108 122 "###); 109 123 110 124 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--git", "--context=0"]); 111 125 insta::assert_snapshot!(stdout, @r###" 112 - diff --git a/file1 b/file1 113 - deleted file mode 100644 114 - index 257cc5642c..0000000000 115 - --- a/file1 116 - +++ /dev/null 117 - @@ -1,1 +1,0 @@ 118 - -foo 119 126 diff --git a/file2 b/file2 120 - index 523a4a9de8..485b56a572 100644 127 + index 94ebaf9001..1ffc51b472 100644 121 128 --- a/file2 122 129 +++ b/file2 123 - @@ -2,1 +2,2 @@ 124 - -baz qux 125 - +bar 126 - +baz quux 127 - diff --git a/file3 b/file3 128 - new file mode 100644 129 - index 0000000000..257cc5642c 130 - --- /dev/null 131 - +++ b/file3 132 - @@ -1,0 +1,1 @@ 133 - +foo 130 + @@ -2,1 +2,1 @@ 131 + -2 132 + +5 133 + @@ -4,1 +4,0 @@ 134 + -4 135 + diff --git a/file1 b/file3 136 + rename from file1 137 + rename to file3 138 + diff --git a/file2 b/file4 139 + copy from file2 140 + copy to file4 134 141 "###); 135 142 136 143 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--git", "--color=debug"]); 137 144 insta::assert_snapshot!(stdout, @r###" 138 - <<diff file_header::diff --git a/file1 b/file1>> 139 - <<diff file_header::deleted file mode 100644>> 140 - <<diff file_header::index 257cc5642c..0000000000>> 141 - <<diff file_header::--- a/file1>> 142 - <<diff file_header::+++ /dev/null>> 143 - <<diff hunk_header::@@ -1,1 +1,0 @@>> 144 - <<diff removed::->><<diff removed token::foo>> 145 145 <<diff file_header::diff --git a/file2 b/file2>> 146 - <<diff file_header::index 523a4a9de8..485b56a572 100644>> 146 + <<diff file_header::index 94ebaf9001..1ffc51b472 100644>> 147 147 <<diff file_header::--- a/file2>> 148 148 <<diff file_header::+++ b/file2>> 149 - <<diff hunk_header::@@ -1,2 +1,3 @@>> 150 - <<diff context:: foo>> 151 - <<diff removed::-baz >><<diff removed token::qux>><<diff removed::>> 152 - <<diff added::+>><<diff added token::bar>> 153 - <<diff added::+baz >><<diff added token::quux>><<diff added::>> 154 - <<diff file_header::diff --git a/file3 b/file3>> 155 - <<diff file_header::new file mode 100644>> 156 - <<diff file_header::index 0000000000..257cc5642c>> 157 - <<diff file_header::--- /dev/null>> 158 - <<diff file_header::+++ b/file3>> 159 - <<diff hunk_header::@@ -1,0 +1,1 @@>> 160 - <<diff added::+>><<diff added token::foo>> 149 + <<diff hunk_header::@@ -1,4 +1,3 @@>> 150 + <<diff context:: 1>> 151 + <<diff removed::->><<diff removed token::2>><<diff removed::>> 152 + <<diff added::+>><<diff added token::5>><<diff added::>> 153 + <<diff context:: 3>> 154 + <<diff removed::->><<diff removed token::4>> 155 + <<diff file_header::diff --git a/file1 b/file3>> 156 + <<diff file_header::rename from file1>> 157 + <<diff file_header::rename to file3>> 158 + <<diff file_header::diff --git a/file2 b/file4>> 159 + <<diff file_header::copy from file2>> 160 + <<diff file_header::copy to file4>> 161 161 "###); 162 162 163 163 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "-s", "--git"]); 164 164 insta::assert_snapshot!(stdout, @r###" 165 165 M file2 166 166 R {file1 => file3} 167 - diff --git a/file1 b/file1 168 - deleted file mode 100644 169 - index 257cc5642c..0000000000 170 - --- a/file1 171 - +++ /dev/null 172 - @@ -1,1 +1,0 @@ 173 - -foo 167 + C {file2 => file4} 174 168 diff --git a/file2 b/file2 175 - index 523a4a9de8..485b56a572 100644 169 + index 94ebaf9001..1ffc51b472 100644 176 170 --- a/file2 177 171 +++ b/file2 178 - @@ -1,2 +1,3 @@ 179 - foo 180 - -baz qux 181 - +bar 182 - +baz quux 183 - diff --git a/file3 b/file3 184 - new file mode 100644 185 - index 0000000000..257cc5642c 186 - --- /dev/null 187 - +++ b/file3 188 - @@ -1,0 +1,1 @@ 189 - +foo 172 + @@ -1,4 +1,3 @@ 173 + 1 174 + -2 175 + +5 176 + 3 177 + -4 178 + diff --git a/file1 b/file3 179 + rename from file1 180 + rename to file3 181 + diff --git a/file2 b/file4 182 + copy from file2 183 + copy to file4 190 184 "###); 191 185 192 186 let stdout = test_env.jj_cmd_success(&repo_path, &["diff", "--stat"]); 193 187 insta::assert_snapshot!(stdout, @r###" 194 - file2 | 3 ++- 188 + file2 | 3 +-- 195 189 {file1 => file3} | 0 196 - 2 files changed, 2 insertions(+), 1 deletion(-) 190 + {file2 => file4} | 0 191 + 3 files changed, 1 insertion(+), 2 deletions(-) 197 192 "###); 198 193 199 194 // Filter by glob pattern ··· 219 214 insta::assert_snapshot!(stdout.replace('\\', "/"), @r###" 220 215 M repo/file2 221 216 R repo/{file1 => file3} 217 + C repo/{file2 => file4} 222 218 "###); 223 219 insta::assert_snapshot!(stderr.replace('\\', "/"), @r###" 224 220 Warning: No matching entries for paths: repo/x, repo/y/z
+2 -2
cli/tests/test_diffedit_command.rs
··· 445 445 insta::assert_snapshot!(stdout, @r###" 446 446 D file1 447 447 M file2 448 - A file3 448 + C {file2 => file3} 449 449 "###); 450 450 451 451 // Nothing happens if the diff-editor exits with an error ··· 459 459 insta::assert_snapshot!(stdout, @r###" 460 460 D file1 461 461 M file2 462 - A file3 462 + C {file2 => file3} 463 463 "###); 464 464 465 465 // Can restore changes to individual files
+2 -2
cli/tests/test_git_init.rs
··· 615 615 insta::assert_snapshot!(stdout, @r###" 616 616 @ sqpuoqvx test.user@example.com 2001-02-03 08:05:07 cd1e144d 617 617 │ (no description set) 618 - │ A new-staged-file 618 + │ C {some-file => new-staged-file} 619 619 │ M some-file 620 - │ A unstaged-file 620 + │ C {some-file => unstaged-file} 621 621 ○ mwrttmos git.user@example.com 1970-01-01 11:02:03 my-branch HEAD@git 8d698d4a 622 622 │ My commit message 623 623 │ A some-file
+12 -56
cli/tests/test_show_command.rs
··· 136 136 137 137 (no description set) 138 138 139 - diff --git a/file1 b/file1 140 - deleted file mode 100644 141 - index 257cc5642c..0000000000 142 - --- a/file1 143 - +++ /dev/null 144 - @@ -1,1 +1,0 @@ 145 - -foo 146 139 diff --git a/file2 b/file2 147 140 index 523a4a9de8..485b56a572 100644 148 141 --- a/file2 ··· 152 145 -baz qux 153 146 +bar 154 147 +baz quux 155 - diff --git a/file3 b/file3 156 - new file mode 100644 157 - index 0000000000..257cc5642c 158 - --- /dev/null 159 - +++ b/file3 160 - @@ -1,0 +1,1 @@ 161 - +foo 148 + diff --git a/file1 b/file3 149 + rename from file1 150 + rename to file3 162 151 "###); 163 152 164 153 let stdout = test_env.jj_cmd_success(&repo_path, &["show", "--git", "--context=0"]); ··· 170 159 171 160 (no description set) 172 161 173 - diff --git a/file1 b/file1 174 - deleted file mode 100644 175 - index 257cc5642c..0000000000 176 - --- a/file1 177 - +++ /dev/null 178 - @@ -1,1 +1,0 @@ 179 - -foo 180 162 diff --git a/file2 b/file2 181 163 index 523a4a9de8..485b56a572 100644 182 164 --- a/file2 ··· 185 167 -baz qux 186 168 +bar 187 169 +baz quux 188 - diff --git a/file3 b/file3 189 - new file mode 100644 190 - index 0000000000..257cc5642c 191 - --- /dev/null 192 - +++ b/file3 193 - @@ -1,0 +1,1 @@ 194 - +foo 170 + diff --git a/file1 b/file3 171 + rename from file1 172 + rename to file3 195 173 "###); 196 174 197 175 let stdout = test_env.jj_cmd_success(&repo_path, &["show", "--git", "--color=debug"]); ··· 203 181 204 182 <<description placeholder:: (no description set)>> 205 183 206 - <<diff file_header::diff --git a/file1 b/file1>> 207 - <<diff file_header::deleted file mode 100644>> 208 - <<diff file_header::index 257cc5642c..0000000000>> 209 - <<diff file_header::--- a/file1>> 210 - <<diff file_header::+++ /dev/null>> 211 - <<diff hunk_header::@@ -1,1 +1,0 @@>> 212 - <<diff removed::->><<diff removed token::foo>> 213 184 <<diff file_header::diff --git a/file2 b/file2>> 214 185 <<diff file_header::index 523a4a9de8..485b56a572 100644>> 215 186 <<diff file_header::--- a/file2>> ··· 219 190 <<diff removed::-baz >><<diff removed token::qux>><<diff removed::>> 220 191 <<diff added::+>><<diff added token::bar>> 221 192 <<diff added::+baz >><<diff added token::quux>><<diff added::>> 222 - <<diff file_header::diff --git a/file3 b/file3>> 223 - <<diff file_header::new file mode 100644>> 224 - <<diff file_header::index 0000000000..257cc5642c>> 225 - <<diff file_header::--- /dev/null>> 226 - <<diff file_header::+++ b/file3>> 227 - <<diff hunk_header::@@ -1,0 +1,1 @@>> 228 - <<diff added::+>><<diff added token::foo>> 193 + <<diff file_header::diff --git a/file1 b/file3>> 194 + <<diff file_header::rename from file1>> 195 + <<diff file_header::rename to file3>> 229 196 "###); 230 197 231 198 let stdout = test_env.jj_cmd_success(&repo_path, &["show", "-s", "--git"]); ··· 239 206 240 207 M file2 241 208 R {file1 => file3} 242 - diff --git a/file1 b/file1 243 - deleted file mode 100644 244 - index 257cc5642c..0000000000 245 - --- a/file1 246 - +++ /dev/null 247 - @@ -1,1 +1,0 @@ 248 - -foo 249 209 diff --git a/file2 b/file2 250 210 index 523a4a9de8..485b56a572 100644 251 211 --- a/file2 ··· 255 215 -baz qux 256 216 +bar 257 217 +baz quux 258 - diff --git a/file3 b/file3 259 - new file mode 100644 260 - index 0000000000..257cc5642c 261 - --- /dev/null 262 - +++ b/file3 263 - @@ -1,0 +1,1 @@ 264 - +foo 218 + diff --git a/file1 b/file3 219 + rename from file1 220 + rename to file3 265 221 "###); 266 222 267 223 let stdout = test_env.jj_cmd_success(&repo_path, &["show", "--stat"]);
+8
lib/src/git_backend.rs
··· 1303 1303 .changes() 1304 1304 .map_err(|err| BackendError::Other(err.into()))?; 1305 1305 change_platform.track_path(); 1306 + change_platform.track_rewrites(Some(gix::diff::Rewrites { 1307 + copies: Some(gix::diff::rewrites::Copies { 1308 + source: gix::diff::rewrites::CopySource::FromSetOfModifiedFiles, 1309 + percentage: Some(0.5), 1310 + }), 1311 + percentage: Some(0.5), 1312 + limit: 1000, 1313 + })); 1306 1314 change_platform 1307 1315 .for_each_to_obtain_tree_with_cache( 1308 1316 &head_tree,